Каковы цели использования **kwargs
в Python?
Я знаю, что вы можете сделать objects.filter
на столе и передать **kwargs
аргумент.
Могу ли я сделать это для определения времени дельт т.е. timedelta(hours = time1)
?
Как именно это работает? Это классы как «распаковка»? Как a,b=1,2
?
kwargs
расшифровываетсяKeyWord ARGumentS
, то есть аргументы, которые установили ключиОтветы:
Вы можете использовать,
**kwargs
чтобы позволить вашим функциям принимать произвольное количество аргументов ключевого слова («kwargs» означает «аргументы ключевого слова»):Вы также можете использовать
**kwargs
синтаксис при вызове функций, создав словарь аргументов с ключевыми словами и передав его в вашу функцию:Python Учебник содержит хорошее объяснение того , как она работает, наряду с некоторыми хорошими примерами.
<- Update ->
Для людей, использующих Python 3, вместо iteritems () используйте items ()
источник
Распаковка словарей
**
распаковывает словари.Эта
такой же как
Это полезно, если вам нужно построить параметры:
Параметры упаковки функции
Это позволяет вам использовать функцию следующим образом:
источник
** do unpack dictionaries.
>> Сумасшедший / конечно! +1 за объяснение этого бита..iteritems()
был переименован.items()
в Python 3.kwargs - это просто словарь, который добавляется к параметрам.
Словарь может содержать пары ключ-значение. И это карги. Хорошо, это как.
Зачем не все так просто.
Например (очень гипотетически) у вас есть интерфейс, который просто вызывает другие подпрограммы для выполнения работы:
Теперь вы получаете новый метод «езды»:
Но подождите минуту, появился новый параметр «транспортное средство» - вы не знали его раньше. Теперь вы должны добавить его в подпись myDo-функции.
Здесь вы можете бросить kwargs в игру - вы просто добавляете kwargs в подпись:
Таким образом, вам не нужно менять сигнатуру вашей интерфейсной функции каждый раз, когда некоторые из вызываемых вами подпрограмм могут измениться.
Это только один хороший пример, который вы могли бы найти полезными для kwargs.
источник
Исходя из того, что хороший пример иногда лучше длинного дискурса, я напишу две функции, использующие все средства передачи аргументов переменных Python (как позиционные, так и именованные аргументы). Вы должны легко увидеть, что он делает самостоятельно:
И вот вывод:
источник
Motif:
*args
и**kwargs
служит заполнителем для аргументов, которые необходимо передать в вызов функциииспользуя
*args
и**kwargs
для вызова функцииТеперь мы будем использовать
*args
для вызова определенной выше функциирезультат:
arg1: два
arg2: 3
arg3: 5
Теперь с помощью
**kwargs
вызова той же функциирезультат:
arg1: 5
arg2: два
arg3: 3
Итог:
*args
не имеет интеллекта, он просто интерполирует переданные аргументы к параметрам (в порядке слева направо), в то время как**kwargs
ведет себя разумно, помещая соответствующее значение в требуемое местоисточник
kwargs
в**kwargs
это просто имя переменной. Вы можете очень хорошо иметь**anyVariableName
kwargs
расшифровывается как «ключевые аргументы». Но я считаю, что их лучше называть «именованными аргументами», так как это просто аргументы, передаваемые вместе с именами (я не нахожу никакого значения для слова «ключевое слово» в термине «ключевые слова аргументы». Я думаю, что «ключевое слово» обычно означает слова, зарезервированные языком программирования и, следовательно, не используемые программистом для имен переменных. В случае с kwargs такого не происходит.). Итак, мы даем именаparam1
иparam2
двух значений параметров , передаваемых в функцию следующим образом :func(param1="val1",param2="val2")
вместо прохождения только значения:func(val1,val2)
. Таким образом, я считаю, что их следует называть «произвольным числом именованных аргументов», поскольку мы можем указать любое количество этих параметров (то естьfunc
func(**kwargs)
Поэтому, как говорится, позвольте мне сначала объяснить «именованные аргументы», а затем «произвольное количество именованных аргументов»
kwargs
.Именованные аргументы
пример
Произвольное количество именованных аргументов
kwargs
пример
Передача переменных кортежа и dict для пользовательских аргументов
Чтобы закончить это, позвольте мне также отметить, что мы можем пройти
Таким образом, тот же вышеупомянутый вызов может быть сделан следующим образом:
Наконец обратите внимание
*
и**
на вызовы функций выше. Если мы их опускаем, мы можем получить плохие результаты.Опуская
*
в кортеж args:печать
Выше кортежа
('custom param1', 'custom param2', 'custom param3')
печатается как есть.Опущенные
dict
аргументы:дает
источник
keyword
терминология исходит из того факта, что вы передаете в dict, который является базой данных пар ключ-значение.Кроме того, вы также можете смешивать различные способы использования при вызове функций kwargs:
дает этот вывод:
Обратите внимание, что ** kwargs должен быть последним аргументом
источник
kwargs - это синтаксический сахар для передачи именных аргументов в виде словарей (для func) или словарей в качестве именованных аргументов (для func)
источник
Вот простая функция, которая служит для объяснения использования:
Любые аргументы, которые не указаны в определении функции, будут помещены в
args
список илиkwargs
список, в зависимости от того, являются ли они ключевыми аргументами или нет:Если вы добавите ключевой аргумент, который никогда не будет передан в функцию, возникнет ошибка:
источник
Вот пример, который, я надеюсь, будет полезен:
Когда вы запускаете программу, вы получаете:
Ключевым моментом здесь является то, что переменное число именованных аргументов в вызове переводится в словарь в функции.
источник
Это простой пример для понимания распаковки Python ,
например, 1:
источник
В Java вы используете конструкторы для перегрузки классов и допускаете несколько входных параметров. В python вы можете использовать kwargs для обеспечения аналогичного поведения.
Пример Java: https://beginnersbook.com/2013/05/constructor-overloading/
пример Python:
просто еще один способ думать об этом.
источник
Ключевое слово Аргументы часто сокращаются до kwargs в Python. В компьютерном программировании ,
Использование двух звездочек перед именем параметра, ** kwargs , происходит, когда неизвестно, сколько аргументов ключевого слова будет передано в функцию. Когда это так, это называется Аргументы произвольных / подстановочных слов.
Одним из примеров этого являются функции приемника Джанго .
Обратите внимание, что он не должен называться kwargs , но должен иметь ** (название kwargs является условным обозначением).
источник