Python, аргументы ключевого слова по умолчанию после позиционных аргументов переменной длины
Я думал, что могу использовать именованные параметры после позиционных параметров переменной длины в вызове функции в Python 2, но я получаю SyntaxError
при импорте класса python. Я пишу со следующим методом "get", например:
class Foo(object):
def __init__(self):
print "You have created a Foo."
def get(self, *args, raw=False, vars=None):
print len(args)
print raw
print vars
ошибка выглядит так:
def get(self, *args, raw=False, vars=None):
^
SyntaxError: invalid syntax
Я хотел бы иметь возможность вызывать метод несколькими способами:
f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)
etc.
2 ответа:
это работает, но только в Python 3. См. PEP 3102. От взгляда на" что нового " документы, кажется, что нет 2.x backport, так что вам не повезло. Вы должны будете принять любые ключевые аргументы (
**kwargs
) и вручную разобрать его. Вы можете использоватьd.get(k, default)
илиd[k]
илиdefault
если это не там. Чтобы удалить аргумент изkwargs
, например, перед вызовом метода суперкласса используйтеd.pop
.
обратите внимание, что в
def get(self, *args, raw=False, vars=None):
, вraw=False
иvars=None
не имеют ничего общего с аргументами сайта. Это значения аргументов по умолчанию. Аргументы со значением по умолчанию могут передаваться позиционно, а аргументы без значения по умолчанию могут передаваться по ключевому слову:def f(a=1): pass f(2) # works, passing a positionally def f(a): pass f(a=2) # works, passing a by keyword
аналогично, аргументы только для ключевых слов не обязательно иметь значение по умолчанию. Иду вслед за
*args
аргумент-это то, что помечает их как ключевое слово, а не наличие значения по умолчанию:def f(*args, a): pass # a is a mandatory, keyword-only argument
синтаксис Python не позволяет использовать переменные args в аргументах функций и ключевых слов со значением по умолчанию одновременно. Если вы должны иметь аргументы ключевых слов вместе с произвольным количеством позиционных аргументов, вам также необходимо разрешить произвольное количество аргументов ключевых слов.
это общий шаблон для предоставления значений по умолчанию для ключевых аргументов, а также позволяет любое количество позиционных аргументов:
def foo(*args, **kwargs): raw = kwargs.pop('raw', False) vars = kwargs.pop('vars', None)
Если вы не используете дополнительные аргументы сайта вообще, вам не о чем беспокоиться. Это делает функцию немного менее самодокументированной, которую вы можете составить с помощью правильно написанной строки документа.