在Python中,如果在一个函数的签名中,星号后面没有跟着标识符名称,那么这个星号代表什么意思?

15 浏览
0 Comments

在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日
0
0 Comments

*后的参数是仅限关键字参数。 *吸收任何额外的位置参数,因此如果您定义了:

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所述:

第二个语法更改允许省略变长参数的参数名称。这样做的含义是允许为以前不允许变长参数的函数添加仅限关键字参数

0