我一直在编写Python一年,来自Java背景,我注意到,至少在我的组织中,将复杂参数传递给函数的方式是使用dicts或元组,而不是比专业参数类的实例。例如,我们有一个方法,它采用三个dicts,每个dicts以特定的方式构造,每个dicet本身被格式化为元组。构建args和读取代码对我来说很复杂。这是传递arg的一个例子:
{'[A].X': ((DiscreteMarginalDistribution, ('red', 'blue')), ()),
'[A].Y': ((DiscreteConditionalDistribution, ('yellow', 'green'), ('red', 'blue')),
(IdentityAggregator('[A].X'), ))
我的问题是:
提前致谢!
答案 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)