在函数调用之间拆分 kwargs
Splitting kwargs between function calls
我时常面临这样的困境。假设我有这样一个函数:
def foo(..., **kwargs):
...
actor = make_actor(..., **a_kwargs)
return actor.act(..., **b_kwargs)
我想让调用者指定要传递给 make_actor()
(a_kwargs) 和 act()
(b_kwargs) 的 kwargs。当然,问题是 foo
只能取 **kwargs
一次。
(在几乎所有情况下,a_kwargs 和 b_kwargs 不共享公共键,因此我们无需担心参数名称冲突)。
我能想到几种方法,各有各的道理disadvantages/limitations。
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 以传递给两个以上的其他函数。
总的来说,第四个选项最合理。
尽管它在您的主函数中使用 kwargs
的能力有所妥协,但它使代码清晰,允许将来更改并减少过多的参数列表。这也不意味着您同时拥有过多的 kwargs
列表和进入同一功能的字典,这看起来不一致。
Simple is better than complex
、Readability counts
、practicality beats purity
我时常面临这样的困境。假设我有这样一个函数:
def foo(..., **kwargs):
...
actor = make_actor(..., **a_kwargs)
return actor.act(..., **b_kwargs)
我想让调用者指定要传递给 make_actor()
(a_kwargs) 和 act()
(b_kwargs) 的 kwargs。当然,问题是 foo
只能取 **kwargs
一次。
(在几乎所有情况下,a_kwargs 和 b_kwargs 不共享公共键,因此我们无需担心参数名称冲突)。
我能想到几种方法,各有各的道理disadvantages/limitations。
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 以传递给两个以上的其他函数。
总的来说,第四个选项最合理。
尽管它在您的主函数中使用 kwargs
的能力有所妥协,但它使代码清晰,允许将来更改并减少过多的参数列表。这也不意味着您同时拥有过多的 kwargs
列表和进入同一功能的字典,这看起来不一致。
Simple is better than complex
、Readability counts
、practicality beats purity