在函数的签名中,如果星号后面没有标识符名称,那么它在 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 中的含义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

08_python的函数

CodeGym自学笔记06——内存寻址和变量

更改应用程序名称后更改捆绑标识符

python 函数星号参数说明,Python面试宝典pdf

Xcode 错误:没有具有与捆绑标识符匹配的有效签名身份的配置文件

在c语言中自定义了一个函数,在main中调用时提示找不到标识符,怎么办?