【问题标题】:Splitting kwargs between function calls在函数调用之间拆分 kwargs
【发布时间】:2016-03-15 02:11:48
【问题描述】:

我有时会面临这种困境。假设我有这样的功能:

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)

哪个是最蟒蛇的?还有其他我忽略的方法优于上述四种方法吗?

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

【问题讨论】:

    标签: python arguments parameter-passing keyword-argument


    【解决方案1】:

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

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

    Simple is better than complexReadability countspracticality beats purity

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多