Чем «аргументы ключевых слов» отличаются от обычных аргументов? Не могут ли все аргументы передаваться name=value
вместо использования позиционного синтаксиса?
290
Чем «аргументы ключевых слов» отличаются от обычных аргументов? Не могут ли все аргументы передаваться name=value
вместо использования позиционного синтаксиса?
Ответы:
Есть две взаимосвязанные концепции, обе называются « аргументами ключевых слов ».
На вызывающей стороне, о которой упоминали другие комментаторы, у вас есть возможность указать аргументы некоторых функций по имени. Вы должны упомянуть их после всех аргументов без имен ( позиционные аргументы ), и должны быть значения по умолчанию для любых параметров, которые не были упомянуты вообще.
Другая концепция находится на стороне определения функции: вы можете определить функцию, которая принимает параметры по имени - и вам даже не нужно указывать, что это за имена. Это чисто ключевые аргументы , и они не могут быть переданы позиционно. Синтаксис
Любые ключевые слова , передаваемые в эту функцию, будут помещены в словарь с именем
kwargs
. Вы можете проверить ключи этого словаря во время выполнения, например так:источник
kwargs
или я могу переименовать его в sth. какoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
это соглашение, когда нет более подходящего имениЕсть одна последняя языковая особенность, где различие важно. Рассмотрим следующую функцию:
*positional
Аргумент будет хранить все позиционные аргументы , передаваемыеfoo()
, без ограничения, сколько вы можете предоставить.**keywords
Аргумент будет хранить любые именованные аргументы:И, конечно же, вы можете использовать оба одновременно:
Эти функции используются редко, но иногда они очень полезны, и важно знать, какие аргументы являются позиционными или ключевыми словами.
источник
*positional
и**keywords
если мы изменим определение функции, какdef foo(arg1, *positional, **keywords):
. Здесьarg1
позиционный и обязательный. Обратите внимание, что позиционный в ответе означает необязательное и переменное количество позиционных аргументов.foo(bar=True)
вы можете получить значения, используя теbar = keywords.pop('bar')
же, что иbar = keywords.pop('bar', None)
. Для значения по умолчанию используйтеbar = keywords.pop('bar', False)
Использование аргументов с ключевыми словами - это то же самое, что и обычные аргументы, за исключением того, что порядок не имеет значения. Например, два вызова функций ниже одинаковы:
источник
Позиционные Аргументы
У них нет ключевых слов перед ними. Порядок важен!
Ключевое слово Аргументы
У них есть ключевые слова в передней части. Они могут быть в любом порядке!
Вы также должны знать, что если вы используете аргументы по умолчанию и пренебрегаете вставкой ключевых слов, тогда порядок будет иметь значение!
источник
func("bar", 5)
? А потом скажите, чтоhello
получает значение по умолчанию3
.Есть два способа присвоить значения аргумента параметрам функции, оба используются.
По позиции. Позиционные аргументы не имеют ключевых слов и назначаются первыми.
По ключевому слову. Аргументы ключевых слов имеют ключевые слова и назначаются вторыми после позиционных аргументов.
Обратите внимание, что вы есть возможность использовать позиционные аргументы.
Если вы не используете позиционные аргументы, тогда - да - все, что вы написали, оказывается ключевым аргументом.
Когда вы вызываете функцию, вы принимаете решение использовать позицию, ключевое слово или их комбинацию. Вы можете сделать все ключевые слова, если хотите. Некоторые из нас не делают этого выбора и используют позиционные аргументы.
источник
Я удивлен, что никто, кажется, не указал, что можно передать словарь параметров аргументов с ключами, которые удовлетворяют формальным параметрам, вот так.
источник
, **kwargs
. Это продемонстрирует, что даже простой func def с фиксированным числом параметров может быть снабжен словарем. То есть в определении не требуется ничего особенного. Тогда вы можете добавить второй пример, с определением WITH ** kwargs, и показать, как через него доступны ДОПОЛНИТЕЛЬНЫЕ элементы в словаре.print 'a:%s, b:%s, c:%s' % (a, b, c)
дает синтаксическую ошибку, однакоprint('a:%s, b:%s, c:%s' % (a, b, c))
работает. Что-то с версией Python? В любом случае, спасибо за это понимание, до сих пор я использовал более неуклюжийprint('a:{}, b:{}, c:{}'.format(a, b, c))
Используя Python 3, вы можете иметь как обязательные, так и необязательные ключевые аргументы :
Необязательно : (значение по умолчанию определено для параметра 'b')
Обязательно (значение по умолчанию для параметра 'b' не определено):
Это может помочь в тех случаях, когда у вас много похожих аргументов рядом друг с другом, особенно если они одного типа, в этом случае я предпочитаю использовать именованные аргументы или создаю собственный класс, если аргументы принадлежат друг другу.
источник
Я удивлен, что никто не упомянул тот факт, что вы можете смешивать позиционные и ключевые аргументы, чтобы делать такие хитрые вещи, используя
*args
и**kwargs
( с этого сайта ):Это позволяет вам использовать произвольные аргументы ключевых слов, которые могут иметь ключи, которые вы не хотите задавать заранее.
источник
Я искал пример, который имел kwargs по умолчанию, используя аннотацию типа:
пример:
источник
Просто добавьте / добавьте способ определения значения аргументов по умолчанию, которое не присваивается в ключевых словах при вызове функции:
позвоните по этому:
ты получишь:
Узнайте больше о
*args
и**kwargs
в Python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3источник