2012-10-29 37 views
2

我试图让我的绘图程序(用python写pygame)的用户重命名所选对象,然后能够通过他们的名字通过实时解释器访问它们。以下是所有可绘制对象的基类的一种方法。当这段代码运行时,我没有得到任何错误,但是当我尝试通过它的新名称访问对象时,我被告知具有该名称的变量没有被定义。 任何想法,为什么这可能是?使用eval在全局范围创建新变量

def rename(self,newName): 

    """ 
    Gives this drawable a new name by which the user my reference it in 
    code 
    """ 

    #Create a new variable in the global scope 
    command = 'global ' + newName + '\n' 

    #Tie it to me 
    command += newName + ' = self' + '\n' 

    #If I already had a name, I'll remove this reference 
    if self.name != None: 
     command += 'del ' + self.name 

    #Execute the command 
    exec(command) 

    #Make this adjustment internally 
    self.name = newName 

回答

2

我不认为这会工作,因为exec功能都有自己的全局变量conecpt,独立于你的一个函数发现。

一般来说,操纵模块的字典比较容易。请注意,全局范围实际上是当前模块的成员名称。

例如,如果您使用的是__main__模块,添加一个变量:

sys.modules['__main__'].__setattr__('xxx', 42) 

,并删除它:

sys.modules['__main__'].__delattr__('xxx') 

UPDATE:关于第二个想法,如果你不不关心模块,最好使用globals()字典。要添加变量:

globals()['xxx'] = 42 

,并删除它:

del globals()['xxx'] 

自然,这等同于前者,因为globals()返回类似(sys.modules[__name__].__dict__)。

漂亮。结论是:如果您使用eval做反思,那么你做错了。

+0

这似乎是为我工作。感谢你的帮助,rodrigo! – hedgehogrider

+0

虽然,我仍然不明白exec为什么不起作用。它不能与exec(command,globals())一起工作。任何文献,我可以阅读这个? – hedgehogrider

+0

嗯,经过一些测试,看起来我错了'exec'使用另一个'globals'。其实,一些简单的例子对我来说很有效......但是,我觉得在删除之前你并没有添加''global'+ self.name',它并没有失败,所以我猜测你是在删除插入之后立即使用相同的名称! – rodrigo