如何在python包中优雅地处理全局配置

时间:2017-03-08 12:40:08

标签: python global-variables global

我正在编写一个需要一些全局常量变量的包。虽然常量,但在执行任何其他操作之前,可以更改这些变量例如,nproc是使用的处理器数量。由于允许全局变量更改是危险的,因此在导入包之后应锁定这些变量。

我提出的唯一方法是读取配置文件。但是,作为一个python包(而不是一个应用程序),需要一个配置文件才是真正的奇怪的

处理此类全局配置的正确方法是什么?

修改

重要的是要注意这些变量不会像pi那样永远不会改变。它可以更改,但在使用此包时应保持不变。

2 个答案:

答案 0 :(得分:1)

如果您的意思是将变量与源代码分开,那么我可能会建议python-decouple。我希望这有帮助

答案 1 :(得分:0)

您可以创建一个在初始化时设置变量的类,然后使用@property声明getter而不是setter。例如:

# For Python 2, inherit from object
# (otherwise @property will not work)

class MyGlobals():

    # Possibly declare defaults here
    def __init__(self, nproc, var1, var2):
        self.__nproc = nproc
        self.__var1  = var1
        self.__var2  = var2

    @property
    def nproc(self):
        return self.__nproc

    @property
    def var1(self):
        return self.__var1

    @property
    def var2(self):
        return self.__var2



myg = MyGlobals(4, "hello", "goodbye")

print(myg.nproc, myg.var1, myg.var2)

myg.nproc = 42

给出:

4 hello goodbye
Traceback (most recent call last):
  File "gash.py", line 29, in <module>
    myg.nproc = 42
AttributeError: can't set attribute

MyGlobals类可能会放在一个模块中。