从外部文件

时间:2015-05-23 14:12:09

标签: python config configuration-files

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

当前实现:我的单文件命令行Python模块当前解析if __name__ == '__main__'中的命令行参数,并加载配置文件(由用户在{{1}中指定) })在运行程序的main函数之前。因此,配置变量在整个模块中都可用,并且一切都很好。但是,我考虑通过跟随this guide发布到PyPI,这似乎要求我将命令行解析放在-c CONFIGFILE函数中,这意味着配置变量将不< / em>可用于其他函数,除非作为参数传递给它所需的位置。这个&#34;通过参数传递&#34;方法似乎有点混乱。

问题:是否有更多的pythonic方法在模块中设置一些配置全局变量或以其他方式完成我尝试的操作? (我不想依赖第三方模块。)我是否可能完全偏离轨道?

1 个答案:

答案 0 :(得分:2)

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

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 ...