Аргументы ключевого слова Python

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

def func1(**qwargs):
    func2(**qwargs)
    func3(**qwargs)

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

def func1(**qwargs):
    func2(arg = qwargs.get("arg", default), **qwargs)
    func3(**qwargs)

Проблема с этим подходом заключается в том, что если arg находится внутри qwargs, возникает ошибка TypeError с сообщением «получено несколько значений для аргумента ключевого слова».

Я не хочу устанавливать qwargs["arg"] по умолчанию, потому что тогда func3 получит этот аргумент без ордера. Я мог бы сделать copy.copy qwargs и установить «arg» в копии, но qwargs могут иметь в нем большие структуры данных, и я не хочу их копировать (возможно, copy.copy не будет, только copy.deepcopy ?).

Что тут питонического делать?


person pythonic metaphor    schedule 30.04.2010    source источник
comment
qwargs звучит как данные, а func* звучит как методы. Вы не думали о том, чтобы объединить их в один класс? Если вы сделаете это, то подпись func2 может быть упрощена до чего-то вроде func2(self,arg=default)...   -  person unutbu    schedule 30.04.2010


Ответы (2)


Просто создайте и используйте другой словарь для вызова func2, оставив оригинал для последующего вызова func3:

def func1(**qwargs):
    d = dict(arg=default)
    d.update(qwqargs)
    func2(**d)
    func3(**qwargs)

Это если вы хотите, чтобы настройка для arg в qwargs переопределяла настройку default. В противном случае (если вы хотите, чтобы default переопределяло любые возможные настройки для arg в qwargs):

def func1(**qwargs):
    d = dict(qwargs, arg=default)
    func2(**d)
    func3(**qwargs)

поскольку аргумент ключевого слова для dict переопределяет значение в позиционном аргументе, если таковой имеется.

person Alex Martelli    schedule 30.04.2010

Чтобы создать новый словарь с теми же ключами и значениями, которые вы можете использовать

 newdict=dict(qwargs)

Если qwargs не содержит действительно много ключей, это дешево.

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

person Florian Diesch    schedule 30.04.2010