在Python中“重载”变量

0 投票
1 回答
2983 浏览
提问于 2025-04-17 11:56

我遇到了一个情况。我有一个配置类 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 这样的东西,它是一个对象的引用,那么对它的修改会在后面显示出来。

撰写回答