#python #python-3.x
Вопрос:
У меня есть набор функций, которые создают сложный объект. Это выглядит так:
def build_stuff(body_fn, head_fn, attach_top=True, **kwargs):
body = body_fn(**kwargs)
head = head_fn(body, **kwargs)
if attach_top:
top = attach_top_on_head(head, **kwargs)
return top
return head
def attach_top_on_head(head, **kwargs):
top = Top(**kwargs)
return top(head)
class Top(StandardClass):
def __init__(self, arg1, arg2, **kwargs):
...
super(Top, self).__init__(**kwargs)
def __call__(head):
pass
Как вы можете видеть, у меня есть словарь с параметрами конфигурации, которые используются на нескольких этапах сборки в нескольких функциях и классах. Необходимые аргументы потребляются, остальное поглощается вложенными **kwargs
.
Это работает нормально, но я получаю ошибку «Ключевое слово не понято» при вызове super(Top, self).__init__(**kwargs)
, так StandardClass.__init__
что с моим обычаем kwargs
.
Мое решение для этого состоит в том, чтобы отфильтровать kwargs
его перед передачей в Top()
:
import inspect
....
def attach_top_on_head(head, **kwargs):
extra_args = inspect.getfullargspec(Top.__init__).args
extra_args_dict = {}
for k in extra_args:
if k in kwargs:
extra_args_dict[k] = kwargs[k]
top = Top(**extra_args_dict)(head)
return top
Но у меня такое чувство, что я приглашаю сюда колесо. Существует ли рекомендуемый или, по крайней мере, более элегантный способ передачи только необходимых аргументов ключевых слов?
Комментарии:
1. Вы знакомы с цепными картами ? Это позволит вам объединить словари и определить, какие из них имеют приоритет и т.д. Действительно ли важно, если у вас есть несколько дополнительных ключей, если они никогда не вызываются?