我正在尝试启用我的绘图程序的用户(用pygame编写的python)来重命名所选对象,然后能够通过实时解释器按名称访问它们。以下是所有可绘制对象的基类的方法。运行此代码时,我没有错误,但是当我尝试通过其新名称访问该对象时,我被告知没有定义具有该名称的变量。 任何想法为什么会这样?
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
答案 0 :(得分: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
进行反思,那么您做错了。