所以我有以下情况。我有一个配置类config.py,它包含许多系统设置变量,如:
class TVBSettings():
TVB_CONFIG_FILE = os.path.expanduser(os.path.join("~", 'tvb.configuration'))
TVB_STORAGE = os.path.expanduser(os.path.join("~", "TVB" + os.sep))
.... etc ...
现在除此之外我还有一个配置文件,当它存在时会覆盖其中的几个变量。为了在UI中显示这些“可覆盖的”配置变量,我使用的是genshi / cherrypy,我在SettingsService中有一个基本字典,用于表示一些信息,如(在setttingsservice.py中):
from tvb.config import TVBSettings as cfg
CONFIGURABLE_KEYS = {'TVB_STORAGE':{'label':'Root used for all you projects:',
'value':cfg.TVB_STORAGE,
'type':'text'},
'SERVER_IP':{'label':'Server name:',
'value':cfg.SERVER_IP,
'type':'text'},
'WEB_SERVER_PORT':{'label':'The port used by cherrypy:',
'value':cfg.WEB_SERVER_PORT,
'dtype':'primitive',
'type':'text'},
... other entries ... }
现在这个settingsservice.py还有一个方法update_configuration()
,它从配置文件中读取并修改了frim cfg的默认参数。这工作正常,并且可以在系统的其余部分看到更改,但是CONFIGURABLE_KEYS字典仍然保留旧值(即在上面的示例中,即使从配置文件中修改cfg.TVB_STORAGE,在字典中旧值仍然是保持)。现在我猜这是因为如果我这样做的话,改变没有完成:
>>> class A:
... x = 1
>>> a = {1: A.x}
>>> A.x = 2
>>> a
{1: 1}
所以我的问题是有没有办法强迫python“重新加载”该变量以考虑新的变化。
编辑(在sblom回复之后):
在我的情况下,这不是一个真正的选项,cfg
将是该示例中的A
,而CONFIGURABLE_KEYS
需要来自cfg
的多个不同变量的不同条目
此致 波格丹
答案 0 :(得分:1)
如果您说a = {1: A}
,然后A.x = 2
,则a[1].x
的新值将为2。
它不能正常工作的原因是A.x是普通的旧数据类型,而不是对象引用。如果您使用类似A
的内容, 对象引用,则稍后会对其进行更改。