Python, аргументи ключового слова за замовчуванням після позиційних аргументів змінної довжини


82

Я думав, що можу використовувати іменовані параметри після позиційних параметрів змінної довжини у виклику функції в Python 2, але я отримую SyntaxErrorпри імпорті класу python. Я пишу таким методом "отримати", наприклад:

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)

тощо

Відповіді:


71

Це справді працює, але лише в Python 3. Див. PEP 3102 . Якщо поглянути на документи "що нового", здається, що немає 2.x бекпорта, тож вам не пощастило. Вам доведеться прийняти будь-які аргументи ключового слова ( **kwargs) та проаналізувати їх вручну. Ви можете використовувати d.get(k, default)або отримати, d[k]або defaultякщо цього немає. Щоб видалити аргумент kwargs, наприклад, перед викликом методу суперкласу, використовуйте d.pop.


Зверніть увагу, що in 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

Дякую і вам, і Імрану! Ваша відповідь із блоком коду Імрана та пропозицією доктрингів ідеально відповіли на питання.
jkmacc

50

Синтаксис Python не дозволяє одночасно аргументи змінних у аргументах функції та ключового слова зі значенням за замовчуванням. Якщо ви повинні мати аргументи ключових слів поряд із довільною кількістю позиційних аргументів, вам слід також дозволити довільну кількість аргументів ключових слів.

Це загальний шаблон для надання значень за замовчуванням для аргументів ключових слів, а також дозволяє будь-яку кількість позиційних аргументів:

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

Якщо ви взагалі не використовуєте додаткові аргументи ключового слова, вам не про що турбуватися. Це робить функцію трохи менш самодокументуючою, яку ви можете скласти за допомогою правильно написаної документації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.