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

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

问题描述:

我在写一个需要一些全局常量变量的包。虽然不变,但在做其他事情之前可以改变这些变量。例如,nproc是使用的处理器数量。由于允许全局变量变化是危险的,所以这些变量在导入包后应该被锁定。如何优雅地处理python包中的全局配置

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

处理这种全局配置的正确方法是什么?

编辑

它注意到,这些变量是不是像pi永远不变是很重要的。它可以改变,但在使用这个软件包时应该保持不变。

+0

为什么不使用环境变量?如果没有设置环境变量,那么可能使用合理的默认值或其他东西 – loganasherjones

+0

[如何在python中设置全局常量变量]的可能重复(http://*.com/questions/18224991/how-to-set-global-const -variables-in-python) – Tzomas

如果你的意思是从源代码分离变量,那么也许我会建议python-decouple。我希望这可以帮助

您可以创建一个类,其中变量是在初始化时设置的,然后使用@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类可能会被放置在模块中。

+0

如何设置默认值? –

+0

可以像这样设置默认值(例子):'def __init __(self,nproc = 2,var1 ='hello',var2 = None):'。 – cdarke