Подтвердить что ты не робот

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)

и др.

4b9b3361

Ответ 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.