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

cme*_*ren 3 python config configuration-files

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

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

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

sir*_*rfz 6

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

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)
Run Code Online (Sandbox Code Playgroud)

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