Учитывая функцию, которая принимает **kwargs
, я хочу динамически устанавливать значения по умолчанию для этих аргументов ключевого слова. Возможно ли это сделать в Python 2.7 и Python 3?Изменить kwarg defaults
В коде я хочу set_kw_defaults
, что:
def f(**kwargs):
print kwargs
# in practice, much complicated black-box processing happens
# here; printing the kwargs is just an example
set_kw_defaults(f, {'magic': 'is possible'})
f()
печатает:
{'magic': 'is possible'}
Я знаю, как выполнить этот вид динамического Arg-умолчанию переписывания для позиционных аргументов, и для Python 3/PEP 3102 "только ключевые слова". Я также знаю, как создавать декораторы для обертывания f
и перехватывать/модифицировать kwargs. Это не что я хочу здесь. Я хочу установить значения по умолчанию для произвольных kwargs, которые не были задуманы, когда был определен f
, и я не могу украсить f
. С этими ограничениями возможно set_kw_defaults
?
Чтобы уточнить: f
не является функцией, для которой я могу изменить исходный код или украсить. К лучшему или худшему, он уже принимает свои аргументы как **kwargs
. Это не обычный вопрос, связанный с передачей аргументов, а странный выброс. Я ищу помощь от тех, кто понимает внутренности передачи аргументов Python.
Разъяснение повторно украшения: Я не могу украсить или обернуть f
, потому что оформление и упаковка создает новый объект (назовем его f2
), который называется в качестве прокси-сервера для оригинального f
. Если сделано с @decorator
синтаксиса, простой функциональной обертке, или схемы на основе классов, все они сводятся к:
def f2(**kwargs):
kwargs.setdefault('color', 'green')
f(**kwargs)
Но если другие части работающей системы уже указывают на f
, они не будут затронуты мое создание f2
. Если бы это были позиционные аргументы или аргументы kw-only, мне нужно было изменить значения по умолчанию, я мог бы сделать это в исходном объекте f
, и все пользователи f
получат новые значения по умолчанию. Если я украшу, это не так.
Я не понимаю, что вы имеете в виду при настройке значений по умолчанию для «произвольных кваргов, которые не были задуманы, когда был определен« f »». Если у вас есть аргумент, который вы хотите запомнить (например, ваш '{'magic': 'possible'}'), вы можете написать свою функциональную строку, например 'def f (magic = 'possible', ** kwargs) '. Если нет, то как вы придумываете ключи для своего «dict», вы переходите к гипотетическим «set_kw_defaults»? –
Невозможно это сделать. –
@ Two-BitAlchemist Я считаю, что op хочет установить значение по умолчанию для всех аргументов '** kwargs'. –