Вопрос

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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top