'重载'python中的变量

时间:2012-01-30 07:41:30

标签: 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 ...

现在除此之外我还有一个配置文件,当它存在时会覆盖其中的几个变量。为了在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的多个不同变量的不同条目

此致 波格丹

1 个答案:

答案 0 :(得分:1)

如果您说a = {1: A},然后A.x = 2,则a[1].x的新值将为2。

它不能正常工作的原因是A.x是普通的旧数据类型,而不是对象引用。如果您使用类似A的内容, 对象引用,则稍后会对其进行更改。