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

标签 python config configuration-files

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

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

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

最佳答案

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

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)

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

关于从外部文件设置模块范围设置的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413691/

相关文章:

具有双循环的 Python lambda

python - Python 中 Azure Functions 上的文件操作

multithreading - 如何在一台服务器上配置Elasticsearch集群以获得最佳搜索性能

java - 多久需要设置一次log4j2的配置文件?

python - PyQt中带有QThread的后台线程

python - Pandas 行值到列标题

scala - 在 play 的配置文件中定义一个数组

java - 通过 slf4j 配置 log4j

ios - 在哪里放置 Constants.swift?