可迭代解包的默认值

2023-11-26

我经常因 Python 的可迭代解包缺乏灵活性而感到沮丧。

举个例子:

a, b = range(2)

工作正常。a包含0 and b包含1,正如预期的那样。现在让我们试试这个:

a, b = range(1)

现在,我们得到一个ValueError:

ValueError: not enough values to unpack (expected 2, got 1)

当期望的结果是不理想的0 in a, and None in b.

有许多技巧可以解决这个问题。我见过的最优雅的是这样的:

a, *b = function_with_variable_number_of_return_values()
b = b[0] if b else None

不太漂亮,而且可能会让 Python 新手感到困惑。

那么最 Pythonic 的方法是什么呢?将返回值存储在变量中并使用 if 块?这*varname黑客?还有别的事吗?


正如评论中提到的,执行此操作的最佳方法是简单地让函数返回恒定数量的值,如果您的用例实际上更复杂(例如参数解析),请使用库。

However,你的问题明确要求一种Pythonic方式来处理返回可变数量参数的函数,我相信它可以通过以下方式干净地完成装饰者。它们并不是很常见,大多数人倾向于使用它们而不是创建它们,所以这里有一个创建装饰器的实用教程了解更多关于他们的信息。

下面是一个装饰函数,可以满足您的需求。该函数返回一个具有可变数量参数的迭代器,并且将其填充到一定长度以更好地适应迭代器解包。

def variable_return(max_values, default=None):
    # This decorator is somewhat more complicated because the decorator
    # itself needs to take arguments.
    def decorator(f):
        def wrapper(*args, **kwargs):
            actual_values = f(*args, **kwargs)
            try:
                # This will fail if `actual_values` is a single value.
                # Such as a single integer or just `None`.
                actual_values = list(actual_values)
            except:
                actual_values = [actual_values]
            extra = [default] * (max_values - len(actual_values))
            actual_values.extend(extra)
            return actual_values
        return wrapper
    return decorator

@variable_return(max_values=3)
# This would be a function that actually does something.
# It should not return more values than `max_values`.
def ret_n(n):
    return list(range(n))

a, b, c = ret_n(1)
print(a, b, c)
a, b, c = ret_n(2)
print(a, b, c)
a, b, c = ret_n(3)
print(a, b, c)

哪个输出您正在寻找的内容:

0 None None
0 1 None
0 1 2

装饰器基本上采用装饰函数并返回其输出以及足够的额外值来填充max_values。然后调用者可以假设该函数总是准确返回max_values参数数量,并且可以像平常一样使用花哨的解包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可迭代解包的默认值 的相关文章

随机推荐

  • 无法在测试中将应用程序委托强制转换为应用程序委托

    我正在 Swift 中进行单元测试 并且遇到了问题 每次运行测试时 我都会收到错误 Could not cast value of type app AppDelegate to app Tests AppDelegate 我确保 AppD
  • 将 json 数组转换为 java 列表对象 [重复]

    这个问题在这里已经有答案了 我得到了一个json数组从服务器response id 1 name John age 20 id 3 name Tomas age 29 id 12 name Kate age 32 我想用gson将上面的js
  • Ionic:IOS 11 中 wkwebview 底部的空白

    将 IOS 更新到 11 版本后 我遇到了问题wkwebview plugin在我的应用程序中 Ionic 命令发布 iOS 11清单但问题是在清单中的所有步骤之后仍然存在 ios平台版本4 4 0 任何 SIM 卡 iPhone 5s 6
  • 收到响应后使用 Chrome webRequest 进行 URL 转发

    我正在尝试创建一个利用 Chrome 的 Chrome 扩展网络请求模块执行重定向到从最初访问的 URL 获得的 URL 为此 我只想使用 Chrome 的 webRequest 函数 例如 onBeforeSendHeaders onHe
  • 随机失败的测试笑话和超级测试 Node.js

    长话短说 我正在开发 RESTapi 它在 movies 路由的 POST 请求上获取电影标题 从外部 api 获取有关该电影的信息并将该对象保存到数据库中 在 POST comments 上 您将评论添加到不同的集合中 但每个评论都有一个
  • Kepler 中的 L2 缓存

    就引用局部性而言 L2 缓存在具有 Kepler 架构的 GPU 中如何工作 例如 如果一个线程访问全局内存中的某个地址 假设该地址的值不在二级缓存中 那么该值是如何缓存的 是暂时的吗 或者该地址的其他附近值是否也被带到二级缓存 空间 下图
  • 如何在生产环境中设置 ASP.NET 5 环境变量

    在 Visual Studio 2015 中 您在项目属性中设置以下变量 ASPNET ENV 如果将其设置为开发 则可以使用 public void Configure IApplicationBuilder app IHostingEn
  • 将 null 传递给方法是否可接受

    Null 对我来说是一种奇怪的数据类型 似乎使用它是错误的 也许是我作为初学者经常遇到的空指针错误 现在让我将任何 null 实例与某种邪恶联系起来 无论如何我的问题是 在某些情况下可以使用 null 作为参数吗 例如 一个方法可能需要a和
  • Java 9 - 在运行时动态添加 jar

    我遇到了 Java 9 的类加载器问题 此代码适用于以前的 Java 版本 private static void addNewURL URL u throws IOException final Class newParameters n
  • Java 中按钮和文本字段不显示

    对于学校 我必须制作一个 JFrame 并在其中一个按钮和两个文本字段中 当按下按钮时 您在文本字段一中输入的任何内容都必须进入文本字段二中 我得到的代码是当我运行程序时我应该看到文本字段和按钮 无论出于什么原因 它都没有 我到目前为止 p
  • 在 Prolog 中将数字拆分为数字列表

    我在尝试使用 Prolog 将数字拆分为列表时遇到了麻烦 例如123456 变成 1 2 3 4 5 6 你能帮我弄清楚如何做到这一点吗 可用的内置函数符合 ISO 标准 number codes 123456 X format s X 1
  • Django/Visual Studio 教程 - 对象方法错误

    我正在学习 Django 教程 here 我在 Mac 上使用 Visual Studio VS 一直显示此代码错误 latest question list Question objects order by pub date 5 错误读
  • catch 和 throw 在 Ruby 中哪些地方有用?

    我真的看不出这些有什么合理的用途 已经有rescue and raise 那么为什么需要throw and catch 看起来它们应该被用来跳出深层嵌套 但这对我来说就像是一个 goto 有没有良好 干净地使用这些的例子 Note 看起来
  • Asp.net Core Post 参数始终为 null [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我从 fiddler 发送 POST POST http localhost 55924 api Product HTTP 1 1 User Agent Fiddler Ho
  • 保护与 Javascript 小部件一起使用的 API

    我正在编写一个 javascript 插件 将由博主 网站所有者安装 它将与我的远程 API 进行通信 我想知道如何保护 API 的安全 以确保只有已注册该服务帐户的用户拥有的域才能从 API 访问资源 我已经阅读了 OAuth2 并了解了
  • Python 中 cor.test 的 R 等效项

    有没有办法在Python中找到r置信区间 在 R 中我可以做类似的事情 cor test m h Pearson s product moment correlation data m and h t 0 8974 df 4 p value
  • 运行 MySQL CREATE TABLE 语句时出现语法错误[重复]

    这个问题在这里已经有答案了 CREATE TABLE users user id INT 8 NOT NULL AUTO INCREMENT user name VARCHAR 30 NOT NULL user pass VARCHAR 2
  • PL/SQL 开发人员导入转储

    我有一个转储文件 其中包含两个表 现在我需要导入这个转储文件 我被指示预先创建两个表空间 现在如何将此转储文件导入到这些表空间中 我正在使用 PL SQL 开发人员 您无法从 PL SQL Developer 导入转储文件 相反 您必须从命
  • 文件访问中文本模式和二进制模式有什么区别吗?

    如果我以文本模式而不是二进制模式打开文件有什么区别吗 因为我读到UNIX和Linux不区分文本和二进制文件 在 Linux 上没有区别 至少在 Ext4 等本机文件系统上 以及大多数其他文件系统上 以及通常的 GNU libc Perhap
  • 可迭代解包的默认值

    我经常因 Python 的可迭代解包缺乏灵活性而感到沮丧 举个例子 a b range 2 工作正常 a包含0 and b包含1 正如预期的那样 现在让我们试试这个 a b range 1 现在 我们得到一个ValueError Value