2010-05-08 64 views
0

我有这个代码(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 

这必然意味着当它被导入它改变了全局()下复位,而不是__main__。我怎样才能解决这个问题?

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

回答

2

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

你的设计看起来很混乱。 Res doens't似乎是一个类。它的大部分方法根本不是方法(它们不会改变某些存储在自己中的状态);唯一一个像方法定义的是你的__init__,这将不起作用(defaults不应该从给出的片段中定义;类名称空间只在类的原始定义期间在那里查找。 ,全球名为defaults?)如果您尝试使用Res来分组相关内容,请不要使用该类;这就是Python中的模块。

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

+0

我只是想知道这是否可能,但我明白了你的观点。谢谢。 – what 2010-05-08 06:00:42

+0

简短的答案是否定的,方法不知道它们被称为哪个模块,事实上,这个概念很难精确定义。 – 2010-05-08 06:24:46