13

我们来看一下:

print([object, ...], *, sep=' ', end='\n', file=sys.stdout)

http://docs.python.org/py3k/library/functions.html?highlight=print#print

我们该如何解释'*'呢?通常星号 ('*') 表示许多对象。但这对我来说是个谜。在两个逗号之间......我什至害怕认为这可能是一个错字。

4

2 回答 2

15

这是文档中的一个错误,由将新的 Python 3 功能应用到不应该使用它的地方的人插入。它已被修复(参见issue 15831)。

使用的文档中的函数签名以伪形式语法形式给出,但*只有在使用实际 python 语法时添加标记才有意义。在这种情况下,签名的[object, ...], *部分应该被列为*objects代替。

更正后的版本现在为:

print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False)

文档的在线开发版本目前尚未更新,但文档来源已更正;我会看看我们是否可以请求重新生成文档。

需要明确的是:*语法在 Python 3 中有效,这意味着以下参数只能用作关键字参数,而不是位置参数。然而,这不适用于该print()函数,因为无论如何都要打印所有位置参数,并且永远不会被误认为是关键字参数。

于 2012-09-22T09:39:25.027 回答
13

这意味着以下参数仅是关键字,即您不能将它们作为位置参数提供,您必须使用它们的名称,例如:

>>> def f(*, a): pass
... 
>>> f(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes exactly 0 positional arguments (1 given)
>>> f(a=1)
>>> # ok

另一个例子:

>>> def g(*a, b): pass
... 
>>> g(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: g() needs keyword-only argument b
>>> g(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: g() needs keyword-only argument b
>>> g(1, b=2)
>>> # ok
>>> g(1, 2, b=3)
>>> # ok
于 2012-09-22T09:39:23.340 回答