我知道*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)签名中有一个*。什么意思?
发布于 2015-04-14 12:51:57
*后面的参数是关键字仅限。*“吸收”任何附加的位置参数,因此如果您定义:
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 givenz 现在必须通过关键字提供:
>>> foo(1, 2, z=3)
1 2 3您可以使用标准的*args来实现这一点,但是使用*可以清楚地表明,您不需要任何附加的位置参数,如果有任何错误在*中结束,则会引发错误。正如PEP所说:
第二个语法更改是允许对varargs参数省略参数名。这的意思是允许只使用关键字的函数的参数,否则不会采用varargs参数。
https://stackoverflow.com/questions/29627748
复制相似问题