在函数调用之间拆分 kwargs

shx*_*hx2 10 python arguments parameter-passing keyword-argument

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

def foo(..., **kwargs):
    ...
    actor = make_actor(..., **a_kwargs)
    return actor.act(..., **b_kwargs)
Run Code Online (Sandbox Code Playgroud)

我想让调用者指定要传递给make_actor()(a_kwargs) 和act()(b_kwargs) 的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)
Run Code Online (Sandbox Code Playgroud)

哪个是最pythonic的?有没有我忽略的另一种方法优于上述四种方法?

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

Ann*_*ous 7

一般来说,第四个选项最有意义。

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

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