Аргументы ключевых слов Python
-
02-10-2019 - |
Вопрос
У меня есть несколько слоев функционирования звонков, передавая общий словарь ключевых слов аргументов:
def func1(**qwargs):
func2(**qwargs)
func3(**qwargs)
Я хотел бы поставить некоторые аргументы по умолчанию в некоторых последующих вызове функций, что-то вроде этого:
def func1(**qwargs):
func2(arg = qwargs.get("arg", default), **qwargs)
func3(**qwargs)
Проблема с таким подходом состоит в том, что если Arg находится внутри qwargs, входERor вызывается с помощью «получил несколько значений для аргумента ключевых слов».
Я не хочу устанавливать qwargs ["arg"] по умолчанию, потому что тогда Func3 получает этот аргумент без ордера. Я мог бы сделать копию.copy qwargs и установить "arg" в копию, но qwargs может иметь большие структуры данных в нем, и я не хочу их скопировать (возможно, copy.copy не будет, только копировать. ?).
Что такое питон, чтобы сделать здесь?
Решение
Просто постройте и используйте другой Dict для целей звонка 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
Переопределяет значение в позиционном аргументе, если таковые имеются.
Другие советы
Чтобы создать новый Dict с одинаковыми клавишами и значениями, которые вы можете использовать
newdict=dict(qwargs)
Если Qwargs не содержит действительно много ключей, которые дешевые.
Если возможно, вы можете переписать функции, чтобы сделать их args действительно как Dict вместо нескольких args.