Подтвердить что ты не робот

Python 3: Asterisk в функции печати

Посмотрим:

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

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

Как мы можем интерпретировать это '*'? Обычно звездочка ('*') означает множество объектов. Но для меня это загадка. Между двумя запятыми... Я даже боюсь думать, что это может быть опечатка.

4b9b3361

Ответ 1

Это ошибка в документации, вставленная кем-то с применением новой функции Python 3 в места, где ее не следует использовать. С тех пор оно исправлено (см. вопрос 15831).

Подписи функций в используемом документе даны в форме псевдо-формальной грамматики, но добавление в маркер * имеет смысл, если вы используете фактический синтаксис python. В этом случае часть [object, ...], * подписи должна быть указана как *objects.

Исправленная версия теперь читает:

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

В настоящее время онлайн-версия версии документации не обновлена, но источник документации исправлен; Я посмотрю, можем ли мы запросить регенерацию документов.

Чтобы быть ясным: синтаксис * действителен в Python 3 и означает, что следующие аргументы могут использоваться только как аргументы ключевого слова, а не позиционные аргументы. Однако это не относится к функции print(), так как все позиционные аргументы должны быть напечатаны в любом случае и никогда не могут быть ошибочно приняты за аргументы ключевого слова.

Ответ 2

Это означает, что следующие аргументы являются ключевыми словами, т.е. вы не можете предоставить их в качестве позиционных аргументов, вы должны использовать их имена, например:

>>> 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