在Python中,如果在一个函数的签名中,星号后面没有跟着标识符名称,那么这个星号代表什么意思?
在Python中,如果在一个函数的签名中,星号后面没有跟着标识符名称,那么这个星号代表什么意思?
这个问题已经有了答案:
我知道*args
的意思和用法,但有时候在*
之后没有像args
这样的参数。比如,在函数pprint
中就有一个*
在签名中。
def pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False): """Pretty-print a Python object to a stream [default is sys.stdout].""" printer = PrettyPrinter( stream=stream, indent=indent, width=width, depth=depth, compact=compact) printer.pprint(object)
这是什么意思?
admin 更改状态以发布 2023年5月21日
*
后的参数是仅限关键字参数。 *
吸收任何额外的位置参数,因此如果您定义了:
def foo(x, y, *, z): print(x, y, z)
那么调用:
foo(1, 2, 3)
将无法工作,因为没有提供z
,只期望两个位置参数:
>>> foo(1, 2, 3) Traceback (most recent call last): File "", line 1, in foo(1, 2, 3) TypeError: foo() takes 2 positional arguments but 3 were given
z
必须通过关键字提供:
>>> foo(1, 2, z=3) 1 2 3
您可以使用标准*args
来实现此目的,但使用*
可以清楚地表明您不想要任何其他位置参数,并在*
中出现任何错误时引发错误。如PEP所述:
第二个语法更改允许省略变长参数的参数名称。这样做的含义是允许为以前不允许变长参数的函数添加仅限关键字参数