Нормальные аргументы против ключевых слов

Как аргументы ключевого слова отличаются от обычных аргументов? Могут ли все аргументы передаваться как 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)

Ответ 5

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

  • По позиции. Позиционные аргументы не имеют ключевых слов и назначаются первыми.

  • Ключевое слово. Аргументы ключевого слова имеют ключевые слова и назначаются вторым, после позиционных аргументов.

Обратите внимание, что у вас есть возможность использовать позиционные аргументы.

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

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

Ответ 6

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

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 

Ответ 7

Используя Python 3, вы можете иметь как обязательное, так и необязательное ключевое слово arguments:

Необязательный: (значение по умолчанию для "b" )

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

Требуется (значение по умолчанию для 'b'):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

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

Ответ 8

Я удивлен, что никто не упомянул о том, что вы можете смешивать позиционные и ключевые аргументы, чтобы сделать такие вещи, как это, используя *args и **kwargs (с этого сайта):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

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

Ответ 9

Я искал пример, который имел kwargs по умолчанию, используя аннотацию типа:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

пример:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}

Ответ 10

Просто добавьте/добавьте способ определения значения по умолчанию для аргументов, которое не назначается в ключевых словах при вызове функции:

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

позвоните по этому адресу:

print(func())
print(func(my_word='love'))

вы получите:

default_msg
love

Узнайте больше о *args и **kwargs в python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3