是否更好的做法是将有时复杂的dicts传递给参数而不是参数对象?

时间:2014-12-09 14:29:20

标签: python parameters arguments

我一直在编写Python一年,来自Java背景,我注意到,至少在我的组织中,将复杂参数传递给函数的方式是使用dicts或元组,而不是比专业参数类的实例。例如,我们有一个方法,它采用三个dicts,每个dicts以特定的方式构造,每个dicet本身被格式化为元组。构建args和读取代码对我来说很复杂。这是传递arg的一个例子:

{'[A].X': ((DiscreteMarginalDistribution, ('red', 'blue')), ()),
 '[A].Y': ((DiscreteConditionalDistribution, ('yellow', 'green'), ('red', 'blue')),
           (IdentityAggregator('[A].X'), ))

我的问题是:

  1. 像这样传递dicts /元组是一个常见的Python习惯用法吗?
  2. 如果有的话,你是否编写Python代码来使用后者(参数实例)?例如,当嵌套结构超过某些复杂性阈值时。
  3. 提前致谢!

1 个答案:

答案 0 :(得分:3)

  • 是的,通常将字典传递给Python函数以减少参数的数量。具有正确键命名的字典式配置比仅使用元组更具可读性。

  • 我认为动态构建自定义配置类的专用实例并不常见。我为此坚持使用词典。如果您的配置字典与其消费者不同步,您将获得KeyError s,这非常适合调试。

一些建议和推理:

如果您的应用程序的某些部分需要非常复杂的配置,我认为最好有一个正确表示当前配置的配置对象。但是,在我的项目中,我从未最终传递过像函数参数这样的对象。这闻起来。在某些应用程序中,我有一个常量全局配置对象,在bootstrap期间设置。这样的对象是全局可用的,并被视为" immutable"。

单个函数永远不应该如此复杂,以至于它们需要检索极其复杂的配置。这表明您应该将代码分成几个组件,每个子组都有一个相当简单的参数化。

如果函数的运行时配置比普通(关键字)参数更容易处理复杂性,那么传递字典是绝对常见的,所以说作为" leightweight"配置对象。经过深思熟虑的关键名称选择使这种方法具有很好的可读性。当然,如果一个级别不足以满足您的用例,您也可以构建一个层次结构。

最重要的是,请注意,在许多情况下,最好的方法是使用常规参数规范通过其签名显式定义函数的参数化:

def f(a, b, c, d, e):
    ...

在调用代码中,您可以在字典中准备这些参数的值:

arguments = {
    a = 1,
    b = 2,
    c = 3,
    d = 4,
    e = "x"
}

然后在函数调用时使用Python的snytactic糖进行关键字扩展:

f(**arguments)