Разделение kwargs между вызовами функций

Время от времени я сталкиваюсь с этой дилеммой. Предположим, у меня есть такая функция:

def foo(..., **kwargs):
    ...
    actor = make_actor(..., **a_kwargs)
    return actor.act(..., **b_kwargs)

Я хочу, чтобы вызывающая сторона указала kwargs для передачи на make_actor() (a_kwargs) и на act() (b_kwargs). Проблема, конечно, в том, что foo может взять **kwargs только один раз.

(Почти во всех случаях a_kwargs и b_kwargs не имеют общих ключей, поэтому нам не нужно беспокоиться о конфликтах имен параметров).

Я могу придумать несколько подходов, каждый из которых имеет свои явные недостатки/ограничения.

def foo1(..., **kwargs):
    ...
    a_kwargs = {k:kwargs.pop(k) for k in kwargs.keys() if k in ['arg1','arg2',...]}
    actor = make_actor(..., **a_kwargs)
    return actor.act(..., **kwargs)

def foo2(..., arg1=DEFAULT1, arg2=DEFAULT2, ..., **b_kwargs):
    ...
    actor = make_actor(..., arg1=arg1, arg2=arg2, ...)
    return actor.act(..., **b_kwargs)

def foo3(..., a_kwargs={}, **b_kwargs):
    ...
    actor = make_actor(..., **a_kwargs)
    return actor.act(..., **b_kwargs)

def foo4(..., a_kwargs={}, b_kwargs={}):
    ...
    actor = make_actor(..., **a_kwargs)
    return actor.act(..., **b_kwargs)

Какой самый питонический? Есть ли другой подход, который я упустил из виду, который превосходит четыре вышеупомянутых?

В общем случае мы можем захотеть разделить kwargs для передачи более чем двум другим функциям.


person shx2    schedule 09.12.2015    source источник


Ответы (1)


В общем, четвертый вариант самый разумный.

Несмотря на то, что это ставит под угрозу возможность использования kwargs в вашей основной функции, это делает код понятным, позволяет вносить изменения в будущем и сокращает количество аргументов. Это также не означает, что у вас есть как чрезмерный список kwargs, так и словарь, входящий в одну и ту же функцию, что кажется несовместимым.

Simple is better than complex, Readability counts, practicality beats purity

person Annonymous    schedule 09.12.2015