在函数调用之间拆分kwargs

时间:2015-12-09 17:18:00

标签: python arguments parameter-passing keyword-argument

我不时会面临这种困境。假设我有这样的函数:

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)

哪个是最pythonic?我忽略了另一种方法,它优于上述四种方法吗?

在一般情况下,我们可能希望拆分kwargs以传递给两个以上的其他函数。

1 个答案:

答案 0 :(得分:3)

一般来说,第四种选择最有意义。

即使它在主函数中使用kwargs的能力受到损害,它也会使代码变得清晰,允许将来的更改并减少过多的参数列表。它也不意味着你有一个过多的kwargs列表和一个进入同一个函数的字典,这似乎不一致。

Simple is better than complexReadability countspracticality beats purity