Python 3: Asterisk в функции печати
Посмотрим:
print([object, ...], *, sep=' ', end='\n', file=sys.stdout)
http://docs.python.org/py3k/library/functions.html?highlight=print#print
Как мы можем интерпретировать это '*'
?
Обычно звездочка ('*') означает множество объектов. Но для меня это загадка. Между двумя запятыми... Я даже боюсь думать, что это может быть опечатка.
Ответы
Ответ 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