Что делает голая звездочка в аргументах функции?
Когда я посмотрел на модуль рассола , я увидел это:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Я знаю об одинарных и двойных звездочках, предшествующих аргументам (для переменного числа аргументов), но это ничего не предшествует. И я уверен, что это не имеет никакого отношения к рассолу. Это, вероятно, просто пример этого происходит. Я узнал его имя только когда отправил это переводчику:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Если это имеет значение, я на питоне 3.3.0.
Ответы:
Голый
*
используется, чтобы заставить вызывающего использовать именованные аргументы, поэтому вы не можете определить функцию с*
аргументом, если у вас нет следующих ключевых аргументов.Смотрите этот ответ или документацию по Python 3 для более подробной информации.
источник
*args
, должны встречаться раньше, чем голые*
.*
вместо*args
, и наоборот; они не могут сосуществовать в подписи. Вот почему они выбрали*
; ранее,*args
был единственный способ заставить чисто позиционные аргументы, и он отмечал конец аргументов, которые могли быть переданы позиционно (так как он собирал все оставшиеся позиционные аргументы, они могли достигать следующих именованных аргументов).*
означает, что те же «позиционные аргументы не могут выходить за пределы», но отсутствие имени означает «но я их не приму, потому что я решил не предоставлять место для их размещения».Хотя оригинальный ответ полностью отвечает на вопрос, просто добавив немного связанной информации. Поведение для единственной звездочки происходит от
PEP-3102
. Цитирую соответствующий раздел:В простом английском это означает, что для передачи значения ключа вам нужно явно передать его как
key="value"
.источник
*
состоит в том, чтобы сожрать оставшиеся позиционные аргументы, но это не так. Передача дополнительных позиционных аргументов, чем ожидает функция, выдает ошибку такого рода:foo() takes exactly 1 positional argument (2 given)
приведенный выше пример с ** kwargs
источник
Семантически это означает, что аргументы, следующие за ним, предназначены только для ключевых слов, поэтому вы получите ошибку, если попытаетесь указать аргумент без указания его имени. Например:
Прагматически это означает, что вы должны вызывать функцию с ключевым аргументом. Обычно это делается, когда трудно понять цель аргумента без намека на имя аргумента.
Сравните, например,
sorted(nums, reverse=True)
с, если вы написалиsorted(nums, True)
. Последнее будет гораздо менее читабельным, поэтому разработчики Python решили заставить вас писать его по-прежнему.источник
Предположим, у вас есть функция:
Вы можете вызвать эту функцию двумя способами:
sum(1,2)
илиsum(1,key=2)
Предположим, вы хотите, чтобы функция
sum
вызывалась только с использованием ключевых слов.Вы добавляете
*
в список параметров функции, чтобы отметить конец позиционных аргументов.Итак, функция определяется как:
можно вызывать только используя
sum(1,key=2)
источник
Я нашел ссылку , чтобы быть очень полезным объяснить
*
,*args
и**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
По сути, в дополнение к ответам выше, я узнал с сайта выше (кредит: https://pythontips.com/author/yasoob008/ ) следующее:
С демонстрационной функцией, определенной сначала ниже, есть два примера, один с
*args
и один с**kwargs
Таким образом,
*args
позволяет динамически создавать список аргументов, которые будут приниматься в порядке их подачи, тогда как**kwargs
может включать передачу аргументов NAMED и может обрабатываться NAME соответственно (независимо от порядка их подачи) ,Сайт продолжает, отмечая, что правильный порядок аргументов должен быть:
источник