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

从外部文件设置模块范围设置的Pythonic方法,python,config,configuration-files,Python,Config,Configuration Files,一些背景(不是强制性的,但可能很高兴知道):我正在编写一个Python命令行模块,它是latexdiff的包装器。在将文件传递给latexdiff之前,它基本上将LaTeX文件中的所有\cite{ref1,ref2,…}命令替换为已写出且格式正确的引用,这样latexdiff将正确标记文本中引用的更改(否则,它将整个\cite{…命令视为一个单独的命令)“字”)。所有代码当前都在一个文件中,可以使用python-m latexdiff-cite运行,我还没有决定如何打包或分发它。为了使脚本对其他

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

当前实现:我的单文件命令行Python模块当前解析
中的命令行参数,如果
中的,并加载配置文件(由用户在
-c CONFIGFILE
中指定)在运行程序的主要功能之前,这里显示。因此,配置变量在整个模块中都可用,一切正常。但是,我正在考虑通过以下方式发布到PyPI,这似乎需要我将命令行解析放在
main()中
function,这意味着配置变量将不可用于其他函数,除非将其作为参数传递到需要的位置。我觉得这个“按参数传递”方法有点混乱


问题:是否有一种更具python风格的方式来设置模块中的一些全局配置,或者以其他方式完成我试图完成的任务?(我不想依赖第三方模块。)我是否在某些基本方面完全偏离了轨道?

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

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

通常会将配置传递给类构造函数。谢谢。我不在这个项目中使用类,但在其他项目中我就这样做了。哇!我不知道这是可能的。以一种简洁的方式解决了我的问题。谢谢!我想知道,我像这样直接使用和操作类而不实例化它们,这是一种好的做法吗?或者这是一种“有更好的方法来构造程序”的情况吗?为什么不是“好的做法”?它符合您的要求,这是配置的单一访问点,听起来对我来说几乎是正确的(不需要使事情复杂化)。这是从烧瓶的配置方式中得到启发的。