Python函数中的星号(*)作为参数。

59
我在查看glob函数的定义时注意到第二个参数只是简单的*
def glob(pathname, *, recursive=False):
    """Return a list of paths matching a pathname pattern.
    [...]
    """
    return list(iglob(pathname, recursive=recursive))

* 的作用是什么?


3
更正:应该是参数,而不是参数值 - wjandrea
@wjandrea 我不是英语母语者,您能否解释一下它们之间的区别,或提供一个解释的来源链接?在瑞典语中,“parameter” 意味着参数,在意大利语中也没有一个可以用来表示“argument”的单词,因为“argomento”是一个假朋友(false friend),所以我总是将“parametro”作为“argument”的翻译。 - FLAK-ZOSO
@wjandrea 非常感谢!在意大利语中,我们习惯称之为“形式参数”(对应“parameters”)和“实际参数”(对应“arguments”),现在我明白了。 - FLAK-ZOSO
1
@wjandrea 最终编辑了这个问题,3年后 :p。 - BiBi
2个回答

112

* 表示位置参数的结束。之后的每个参数都只能通过关键字来指定。这在 PEP 3102 中定义。

>>> def foo1(a, b=None):
...     print(a, b)
...
>>> def foo2(a, *, b=None):
...     print(a, b)
...
>>> foo1(1, 2)
1 2
>>> foo2(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo1() takes 1 positional argument but 2 were given
>>> foo2(1, b=2)
1 2

2
有趣的是,TensorFlow在一些函数中使用_sentinel作为第一个参数来防止位置参数。我想知道他们为什么不直接使用* - BiBi
3
@AdamSmith 我认为你指的是关键字参数,即 PEP 3102。PEP 570似乎使用“/”来定义“仅位置参数”。 - Sam Mason
5
@BiBi: Python 2 支持。Python 2 并不支持这种语法。 - user2357112
1
@SamMason 对不起,你是对的 - 发现得好!(还有感谢 user2357112 的编辑) - Adam Smith

9
*之后的所有参数都必须显式指定它们的名称。例如,如果你有这个函数:
def somefunction(a,*,b):
    pass

您可以写成这样:

你可以这样写:

somefunction(0, b=0)

但不包括这个:

somefunction(0, 0)

2
你已经回答了两个相同问题的帖子:https://dev59.com/8bDla4cB1Zd3GeqP9YRL#53795611 你应该标记为重复 :-) - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接