通过导入重置全局

时间:2010-05-08 05:37:45

标签: python python-3.x

我有这个代码(Reset.py),除非我导入它,否则它的工作方式。

class Res(object):
    defaults={}
    class NoKey: pass
    def __init__(self):
        for key, values in defaults.items():
            globals()[key]=values
    def add_defaults(key, values):
        Res.defaults[key]=value
    def remove_defaults(key=NoKey, remove_all=False):
        if remove_all:
            Res.defaults={}
        else:
            del Res.defaults[key]

不导入:

>>> a=54
>>> Res.add_default('a', 3)
>>> Res()
<__main__.Res object at 0x>
>>> a
3
>>> #great! :D

导入:

>>> a=54
>>> Res.add_default('a', 3)
>>> Res()
<Reset.Res object at 0x>
>>> a
54

这必须意味着在导入它时会更改重置下的globals()而不是__main__。我该如何解决这个问题?

[编辑默认为remove_defaults下的Res.defaults(默认值不是全局变量)。]

1 个答案:

答案 0 :(得分:2)

你没有解决这个问题:它没有被破坏。变异全局变量,特别是在另一个模块的命名空间中隐式变换全局变量,是一个非常糟糕的想法,会导致令人困惑,不可维护,不可测试的代码。

你的设计看起来真的很混乱。 Res似乎不是一个班级。它的大多数方法根本不是方法(它们不会改变存储在self中的某些状态);唯一一个被定义为方法的是你的__init__,它不起作用(defaults不应该从给定的片段中定义;类命名空间只在原始定义中查找你有其他的东西,一个名为defaults的全局吗?)如果你试图用Res对相关的东西进行分组,那就不要使用一个类;这就是Python中的模块。

也许你应该发一个问题来描述你正在解决的问题。我怀疑这段代码表明设计非常不理想。