Python, аргументы ключевого слова по умолчанию после позиционных аргументов переменной длины
Я думал, что могу использовать именованные параметры после позиционных параметров переменной длины в вызове функции в Python 2, но при импорте класса python я получаю SyntaxError
. Я пишу со следующим методом "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)
и др.
Ответы
Ответ 1
Он работает, но только в Python 3. См. PEP 3102. От взгляда на "какие новые" документы кажется, что нет бэкпорта 2.x, так что вам не повезло. Вам придется принимать любые аргументы ключевых слов (**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
Ответ 2
Синтаксис Python не допускает переменные args в аргументах функции и ключевого слова со значением по умолчанию в одно и то же время. Если у вас есть аргументы ключевых слов и произвольное количество позиционных аргументов, вам также необходимо разрешить произвольное количество аргументов ключевого слова.
Это общий шаблон для предоставления значений по умолчанию для аргументов ключевого слова, а также для разрешения любого количества позиционных аргументов:
def foo(*args, **kwargs):
raw = kwargs.pop('raw', False)
vars = kwargs.pop('vars', None)
Если вы не используете дополнительные аргументы ключевого слова, вам не о чем беспокоиться. Это делает функцию немного менее самодокументированной, которую вы можете составить с правильно написанной docstring.