Аргументы в Python - PullRequest
       24

Аргументы в Python

0 голосов
/ 30 апреля 2010

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

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 ?).

Что тут делать с питоном?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Просто создайте и используйте другой диктовку для вызова 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 переопределяет значение в позиционном аргументе, если таковой имеется.

1 голос
/ 30 апреля 2010

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

 newdict=dict(qwargs)

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

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

...