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

Normal arguments vs. keyword arguments

Обычные аргументы против аргументов ключевого слова

Чем "аргументы ключевого слова" отличаются от обычных аргументов? Разве нельзя передать все аргументы как name=value вместо использования позиционного синтаксиса?

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

Существуют две взаимосвязанные концепции, обе называются "аргументы ключевого слова".

На стороне вызова, о чем упоминали другие комментаторы, у вас есть возможность указать некоторые аргументы функции по имени. Вы должны указывать их после всех аргументов без имен (позиционные аргументы), и должны быть значения по умолчанию для любых параметров, которые вообще не упоминались.

Другая концепция находится на стороне определения функции: вы можете определить функцию, которая принимает параметры по имени - и вам даже не нужно указывать, что это за имена. Это чистые аргументы ключевого слова, и их нельзя передавать позиционно. Синтаксис

def my_function(arg1, arg2, **kwargs)

Любые аргументы ключевого слова, которые вы передаете в эту функцию, будут помещены в словарь с именем kwargs. Вы можете проверить ключи этого словаря во время выполнения, вот так:

def my_function(**kwargs):
print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}
Ответ 2

Есть еще одна функция языка, в которой важно различие. Рассмотрим следующую функцию:

def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords

В *positional аргументе будут храниться все позиционные аргументы, переданные в foo(), без ограничения количества, которое вы можете предоставить.

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

В **keywords аргументе будут храниться все аргументы ключевого слова:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

И, конечно, вы можете использовать и то, и другое одновременно:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

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

Ответ 3

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

def foo(bar, baz):
pass

foo(1, 2)
foo(baz=2, bar=1)
Ответ 4

Позиционные аргументы

Перед ними нет ключевых слов. Важен порядок!

func(1,2,3, "foo")

Аргументы ключевого слова

В начале у них есть ключевые слова. Они могут располагаться в любом порядке!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

Вы также должны знать, что если вы используете аргументы по умолчанию и пренебрегаете вставкой ключевых слов, тогда порядок будет иметь значение!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
python