Python3: фильтруйте кварги перед их передачей

#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. Вы знакомы с цепными картами ? Это позволит вам объединить словари и определить, какие из них имеют приоритет и т.д. Действительно ли важно, если у вас есть несколько дополнительных ключей, если они никогда не вызываются?