Поддерживает ли Python ключевое слово по умолчанию и аргументы переменной длины по умолчанию? - PullRequest
0 голосов
/ 16 января 2019

Я знаю, что Python поддерживает переменные аргументы *args и ключевые аргументы **kwargs, но есть ли способ установить значения по умолчанию для этих полей? Если нет, то почему?

*args = (1,'v')) , **kwargs = {'a':20}

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Нет, *args и **kwargs - это универсальные аргументы, которые получают любые аргументы, для которых нет явных аргументов. Указание значений по умолчанию наносит ущерб их цели. Вместо этого примерные значения по умолчанию можно обрабатывать с помощью существующего синтаксиса , здесь нет необходимости усложнять синтаксис определения функции.

Вы можете указать свои значения по умолчанию, указав обычные аргументы для ключевых слов :

def foo(pos0, pos1='v', a=20, *args, **kwargs):
    pass

Я заменил ваше (1, 'v') 'default' другим аргументом ключевого слова, потому что вы можете предоставить значения для аргументов ключевого слова с параметром positional ; foo(42, 'spam') установит pos1 в 'spam'.

Кроме того, вы всегда можете выполнить дальнейшую обработку внутри определяемой вами функции; значение args является кортежем, просто проверьте длину, чтобы проверить, нужно ли использовать значение по умолчанию для пропущенных значений. kwargs - это словарь, просто используйте kwargs.get(key, default) или kwargs.pop(key, default) или if key not in kwargs: или любой другой dict метод для обработки отсутствующих ключей.

0 голосов
/ 16 января 2019

Вы можете иметь значение по умолчанию kwargs и по-прежнему распаковывать с splat a la **kwargs

def john(name, dog, *args, bob="bob", **kwargs):
  print(name, dog, bob)

# "ream" is an unpacked arg
john("john", 1, "ream") # john 1 bob

# jane is an unpacked kwarg
john("john", 1, "ream", jane="jane") # john 1 bob

john("john", 1, "ream", bob="jane") # john 1 jane

Установить значение по умолчанию для *arg довольно сложно, потому что идея состоит в том, чтобы заставить функцию требовать этого ввода. Вы могли бы взглянуть на некоторые приемы в этом духе а-ля реализации встроенного range. Я только сделал бы это kwarg все же.

...