python - 有没有一种方法可以在Python中不指定默认值参数的情况下访问可变参数

标签 python python-2.7 arguments argument-passing

def foo(a=MyComplexObject(), b=Something(), *args):
    print a, b, args

有没有一种方法可以在调用 foo 时指定 *args 并且在函数调用中指定 a 或 b - 从而使用默认值?

类似于

foo(*args=(1,2,3))

这纯粹是出于好奇。

最佳答案

您还必须将关键字参数移至变量关键字捕获:

def foo(*args, **kw):
    a = kw.get('a', MyComplexObject())
    b = kw.get('b', b=Something())
    print a, b, args

Python 将首先填充两个关键字参数,否则,就像在 Python 2 中一样,无法指定这些关键字不能由位置参数填充。

Python 3 changed the interpretation of the positional catchall parameter使这成为可能,而不强制您使用 ** 关键字参数包罗万象。

如果您无法自己更改函数定义或升级到 Python 3,那么您唯一的办法就是再次指定默认值,或从函数中检索它们(使用 inspect.getargspec() convenience function ):

import inspect

defaults = inspect.getargspec(foo).defaults
foo(*(defaults + (1,2,3)))

defaults 这里是关键字参数默认值的元组。

演示:

>>> import inspect
>>> def foo(a='spam', b='foo', *args):
...     print a, b, args
... 
>>> defaults = inspect.getargspec(foo).defaults
>>> foo(*(defaults + (1,2,3)))
spam foo (1, 2, 3)

关于python - 有没有一种方法可以在Python中不指定默认值参数的情况下访问可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551324/

相关文章:

Python正则表达式判断一个字符是数字、字母数字还是在指定的字符串中

python - 参数解析器错误 : too few arguments

python - 使用系列查找表替换 Pandas DataFrame 列中的值

python - 将多个 .xls 文件添加到单个 .xls 文件,使用文件名命名选项卡

python - 对嵌套元组的内容进行分组

Python 没有正确更新

python - 涉及 Python float(sys.argv[1]) 的未知代码错误

python - 从 Google Earth Engine 下载图片 `ImageCollection` 驱动

r - 将用户参数传递给 DESeq2 函数

python - 在Python中使用argparse解析整个JSON