从外部文件设置模块范围设置的 Pythonic 方法

Pythonic way to set module-wide settings from external file

一些背景知识(不是强制性的,但可能很高兴知道): 我正在编写一个 Python 命令行模块,它是 [=10] 的包装器=].在将文件传递给 latexdiff 之前,它基本上用写出且格式正确的引用替换了 LaTeX 文件中的所有 \cite{ref1, ref2, ...} 命令,因此 latexdiff 将正确标记对文本中引用的更改(否则,它将整个 \cite{...} 命令视为单个 "word")。所有代码目前都在一个文件中,可以是 运行 和 python -m latexdiff-cite,我还没有决定如何打包或分发它。为了使脚本对其他人有用,引文格式需要是可配置的。我已经实现了一个可选的命令行参数 -c CONFIGFILE 以允许用户指向他们自己的 JSON 配置文件(默认文件驻留在模块文件夹中,如果不使用参数则加载)。

当前实现: 我的单文件命令行 Python 模块当前解析 if __name__ == '__main__' 中的命令行参数,并加载配置文件 (由用户在 -c CONFIGFILE) 此处在 运行 程序的主要功能之前指定。因此,配置变量在整个模块中可用,一切都很好。但是,我正在考虑按照 this guide 发布到 PyPI,这似乎要求我将命令行解析放在 main() 函数中,这意味着配置变量将 可用于其他函数,除非作为参数传递到需要它的地方。这种 "passing down by arguments" 方法对我来说似乎有点混乱。

问题:是否有更 pythonic 的方法来在模块中设置一些配置全局变量或以其他方式完成我正在尝试的事情? (我不想依赖第 3 方模块。)我是否可能在某些基本方面完全偏离了轨道?

一种方法是在 class 或简单的字典中定义配置:

class Config(object):
    setting1 = "default_value"
    setting2 = "default_value"

    @staticmethod
    def load_config(json_file):
        """ load settings from config file """
        with open(json_file) as f:
            config = json.load(f)
        for k, v in config.iteritems():
            setattr(Config, k, v)

然后您的应用程序可以通过此 class 访问设置:Config.setting1 ...