Вопрос-Ответ

What does a bare asterisk do in a parameter list? What are "keyword-only" parameters?

Что делает голая звездочка в списке параметров? Что такое параметры "только для ключевых слов"?

Что делает голая звездочка в параметрах функции?

Когда я посмотрел на модуль pickle, я увидел это:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

Я знаю об одинарной и двойной звездочках, предшествующих параметрам (для переменного количества параметров), но это ничему не предшествует. И я почти уверен, что это не имеет никакого отношения к pickle. Вероятно, это просто пример того, как это происходит. Я узнал его название, только когда отправил это в интерпретатор:

>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

Если это имеет значение, я на python 3.3.0.

Переведено автоматически
Ответ 1

Пустая * используется, чтобы заставить вызывающую функцию использовать именованные аргументы - поэтому вы не можете определить функцию с * в качестве аргумента, если у вас нет следующих ключевых аргументов.

Смотрите Этот ответ или документацию по Python 3 для получения более подробной информации.

Ответ 2

Хотя исходный ответ полностью отвечает на вопрос, просто добавляя немного связанной информации. Поведение единственной звездочки вытекает из PEP-3102. Цитирую соответствующий раздел:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

def compare(a, b, *, key=None):
...

Простым английским это означает, что для передачи значения для key вам нужно будет явно передать его как key="value".

Ответ 3
def func(*, a, b):
print(a)
print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

приведенный выше пример с ** kwargs

def func(*, a, b, **kwargs):
print(a)
print(b)
print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
Ответ 4

Семантически это означает, что следующие за ним аргументы содержат только ключевое слово, поэтому вы получите сообщение об ошибке, если попытаетесь предоставить аргумент без указания его имени. Например:

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

С практической точки зрения это означает, что вы должны вызывать функцию с ключевым аргументом. Обычно это делается, когда трудно понять назначение аргумента без подсказки, данной именем аргумента.

Сравните, например, sorted(nums, reverse=True) с тем, если бы вы написали sorted(nums, True). Последнее было бы гораздо менее читабельным, поэтому разработчики Python решили заставить вас написать его первым способом.

python python-3.x