在函数的签名中,如果星号后面没有标识符名称,那么它在 Python 中的含义是啥? [复制]
Posted
技术标签:
【中文标题】在函数的签名中,如果星号后面没有标识符名称,那么它在 Python 中的含义是啥? [复制]【英文标题】:In a function's signature, what does the asterisk mean in Python when it's not followed by an identifier name? [duplicate]在函数的签名中,如果星号后面没有标识符名称,那么它在 Python 中的含义是什么? [复制] 【发布时间】:2015-06-20 02:05:23 【问题描述】:我知道*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)
签名中有*
。什么意思?
【问题讨论】:
【参考方案1】:参数之后 *
是keyword-only。 *
“吸收” 任何额外的位置参数,所以如果你定义了:
def foo(x, y, *, z):
print(x, y, z)
然后调用:
foo(1, 2, 3)
不起作用,因为没有提供 z
并且只需要两个位置参数:
>>> foo(1, 2, 3)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
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 所说:
第二个语法变化是允许参数名称 可变参数参数被省略。这个的意思是 允许对不会的函数使用仅限关键字的参数 否则采用可变参数
【讨论】:
以上是关于在函数的签名中,如果星号后面没有标识符名称,那么它在 Python 中的含义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章