Python:如何设置程序的配置变量?

时间:2014-12-16 02:00:41

标签: python

我正在编写一个以目录作为输入的脚本。该目录将被许多不同的函数使用,这些函数从磁盘读取数据。目前,目录名称存储在一个变量中,该变量将传递给使用它的每个函数或类:

data_dir = get_data_dir()
spam = calculate_spam(foo, bar, data_directory=data_dir)
eggs = calculate_eggs(spam, baz, data_directory=data_dir)

不幸的是,函数签名和函数调用变得非常长,这使得代码不必要地难以阅读并因此容易出错。是否有更好的(即Pythonic)方式处理这样的配置参数?

2 个答案:

答案 0 :(得分:2)

如果您有许多共享许多必需参数的函数,例如:

foo(x, y, z, alpha)
bar(x, y, z, beta)
baz(x, y, z, gamma)

可以xyz一起属于字典或命名元组的标志。您可以沿着这条路线将配置的各个部分放在一起,形成一个命名元组。但请注意,您通常只想将确切所需的传递给函数,而不是更多。因此,如果你的函数使用一堆配置参数的字典只是为了使用一个条目,那么它可能是设计糟糕的标志。

xyz放入一个类中,然后制作foobar和{{1方法:

baz

然后,配置将成为您班级状态的一部分。

另一方面,长参数列表可能表示您的函数执行的操作超出了所需的范围。考虑一下你的函数class XYZ: def __init__(self, x, y, z): ... def foo(self, alpha): ... def bar(self, beta): ... def baz(self, gamma): ... 。据推测,此函数从目录加载一些数据并计算一些数据。将加载和计算分成两个单独的函数更合理,例如calculate_spam(foo, bar, data_dir)加载数据,然后load_spam(data_dir)来计算它?

我经常发现,当我有太多的参数时,我只需要将函数拆分成更小的部分。这不是法律,而是一条经验法则,对我来说很有用。

答案 1 :(得分:0)

您可以尝试为每个函数创建一个列表参数,如果这样可以更容易。