2012-10-29 55 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