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 71

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)

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