在Python中“重载”变量
我遇到了一个情况。我有一个配置类 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 ...
除此之外,我还有一个配置文件,当这个文件存在时,会覆盖其中的一些变量。为了在用户界面上显示这些“可覆盖”的配置变量,我使用了 genshi/cherrypy,并在一个名为 SettingsService 的地方有一个基础字典,里面指定了一些信息,比如(在 settingsservice.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()
,它会从配置文件中读取数据,并修改 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
中的多个不同变量提供不同的条目。
祝好,
博格丹
1 个回答
1
如果你写了 a = {1: A}
,然后把 A.x = 2
,那么 a[1].x
的新值就会变成 2。
之所以这样不管用,是因为 A.x 是一种普通的数据类型,而不是对象的引用。如果你用像 A
这样的东西,它是一个对象的引用,那么对它的修改会在后面显示出来。