2

我试图让我的绘图程序的用户(用 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
4

1 回答 1

2

我认为这不会起作用,因为该exec函数有自己的全局变量conecpt,与您的函数看到的变量无关。

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

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

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

并删除它:

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

更新:再想一想,如果您不关心模块,最好使用globals()字典。要添加变量:

globals()['xxx'] = 42

并删除它:

del globals()['xxx']

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

漂亮。结论是:如果你习惯eval做反思,那你就做错了。

于 2012-10-29T17:44:32.493 回答