如何优雅地处理python包中的全局配置
我在写一个需要一些全局常量变量的包。虽然不变,但在做其他事情之前可以改变这些变量。例如,nproc
是使用的处理器数量。由于允许全局变量变化是危险的,所以这些变量在导入包后应该被锁定。如何优雅地处理python包中的全局配置
我想出的唯一方法是读取配置文件。但是,作为一个python包(不是应用程序),真的需要配置文件很奇怪。
处理这种全局配置的正确方法是什么?
编辑:
它注意到,这些变量是不是像pi
永远不变是很重要的。它可以改变,但在使用这个软件包时应该保持不变。
您可以创建一个类,其中变量是在初始化时设置的,然后使用@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
类可能会被放置在模块中。
如何设置默认值? –
可以像这样设置默认值(例子):'def __init __(self,nproc = 2,var1 ='hello',var2 = None):'。 – cdarke
为什么不使用环境变量?如果没有设置环境变量,那么可能使用合理的默认值或其他东西 – loganasherjones
[如何在python中设置全局常量变量]的可能重复(http://stackoverflow.com/questions/18224991/how-to-set-global-const -variables-in-python) – Tzomas