python - 在 python 中使用命名/未命名和变量参数调用函数

标签 python

我有以下代码:

def foo(func, *args, named_arg = None):
    return func(*args)

返回一个SyntaxError:

  File "tester3.py", line 3
    def foo(func, *args, named_arg = None):
                                 ^

这是为什么呢?是否有可能以这种方式定义一个函数,它接受一个参数 (func),然后在命名参数之前是一个变量参数列表 args?如果不是,我的可能性是什么?

最佳答案

包罗万象的 *args 参数必须出现在任何显式参数之后:

def foo(func, named_arg=None, *args):

如果您还将包罗万象的 **kw 关键字参数添加到定义中,则该参数必须位于 *args 之后参数:

def foo(func, named_arg=None, *args, **kw):

混合显式关键字参数和包罗万象的 *args 参数确实会导致意外行为;您不能同时使用任意位置参数显式命名您列出的关键字参数。

func 之外的任何额外位置首先用于 named_arg,它也可以作为位置参数:

>>> def foo(func, named_arg = None, *args):
...     print func, named_arg, args
... 
>>> foo(1, 2)
1 2 ()
>>> foo(1, named_arg=2)
1 2 ()
>>> foo(1, 3, named_arg=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for keyword argument 'named_arg'
>>> foo(1, 2, 3)
1 2 (3,)

这是因为 foo() 的任何第二个位置参数将始终用于named_arg

在 Python 3 中,*args 参数可以放在关键字参数之前,但这具有的含义。通常,关键字参数可以在调用签名中指定为位置参数(例如,将函数调用为 foo(somefunc, 'argument') 会将 'argument' 分配给 命名参数)。通过将 *args 或普通的 * 放在位置参数和命名参数之间,您可以排除命名参数被用作位置;调用 foo(somefunc, 'argument') 会引发异常。

关于python - 在 python 中使用命名/未命名和变量参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821877/

相关文章:

python - 如何将动态字符串传递给 pydantic 字段

python - 当减数为 None 时,使用减法运算符的 Django 注释返回 None

python - 从 SVG 路径中采样几何点的快速方法

python - SciKit Learn - SGDClassifier 准确性不佳

python - 如何量化优化的 tflite 模型的输入和输出

python - 如何处理python元素树中xpath的多个搜索条件

javascript - 无法在 Django 模板 html 脚本中将 python 字典用作 JSON

Python:用不同的术语替换字符串中的嵌入函数

Python围绕相机轴旋转图像

python - 使用解析/切片子字符串的内容实例化对象属性?