如何设计具有许多配置选项的程序?

qsc*_*qsc 13 python api coding-style

假设我有一个包含大量配置选项的程序.用户可以在配置文件中指定它们.我的程序可以解析这个配置文件,但它应该如何在内部存储并传递选项?

就我而言,该软件用于执行科学模拟.大约有200个选项,其中大多数具有合理的默认值.通常,用户只需指定十几个左右.我面临的困难是如何设计我的内部代码.许多需要构造的对象依赖于许多配置选项.例如,一个对象可能需要几个路径(用于存储数据的位置),一些需要传递给对象将调用的算法的选项,以及一些由对象本身直接使用的选项.

这导致需要构造大量参数的对象.此外,由于我的代码库处于非常活跃的开发阶段,因此通过调用堆栈并将新的配置选项一直传递到需要的地方是一件非常大的痛苦.

防止这种痛苦的一种方法是拥有一个可以在代码中的任何地方自由使用的全局配置对象.我并不特别喜欢这种方法,因为它导致函数和类不采用任何(或只有一个)参数,并且读者不清楚函数/类处理什么数据.它还可以防止代码重用,因为所有代码都依赖于巨大的配置对象.

任何人都可以给我一些关于如何构建这样的程序的建议吗?

以下是我对配置选项传递样式的一个示例:

class A:
    def __init__(self, opt_a, opt_b,  ..., opt_z):
        self.opt_a = opt_a
        self.opt_b = opt_b
        ...
        self.opt_z = opt_z

    def foo(self, arg):
        algo(arg, opt_a, opt_e)
Run Code Online (Sandbox Code Playgroud)

以下是全局配置样式的示例:

class A:
    def __init__(self, config):
        self.config = config

    def foo(self, arg):
        algo(arg, config)
Run Code Online (Sandbox Code Playgroud)

示例是在Python中,但我的问题代表任何类似的编程语言.

HYR*_*YRY 5

matplotlib是一个包含许多配置选项的大型包.它使用rcParams模块来管理所有默认参数.rcParams保存dict中的所有默认参数.

每个函数都将从关键字argurments中获取选项:

例如:

def f(x,y,opt_a=None, opt_b=None):
    if opt_a is None: opt_a = rcParams['group1.opt_a']
Run Code Online (Sandbox Code Playgroud)