Python, аргументы ключевых слов по умолчанию после позиционных аргументов переменной длины - PullRequest
76 голосов
/ 09 мая 2011

Я думал, что мог бы использовать именованные параметры после позиционных параметров переменной длины при вызове функции в 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)

и т. д.

Ответы [ 2 ]

67 голосов
/ 09 мая 2011

Это работает, но только в 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
46 голосов
/ 09 мая 2011

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

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

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...