2012-04-20 97 views
2

我試圖找到一種基本上使用代碼中不同位置的上下文來執行eval的方法。舉個例子,我有一個類Friend,它可以這樣使用:如何從代碼中的不同點訪問全局變量

>>> class A: 
...  friend = Friend('B') 
... 
>>> class B: 
...  friend = Friend('A') 
... 
>>> A.friend.getobject() 
<class '__main__.B'> 

然而,Friend在代碼的其他地方定義,在一個單獨的圖書館,並會是這個樣子:

class Friend: 

    def __init__(self, objname): 
     self.objname = objname 

    def getobject(self): 
     return eval(self.objname, original_context) 

sqlalchemy ORM具有類似的列定義模式,但它們通過跟蹤會話中所有擁有的類(即表)來實現它。如果需要,我可以做類似的事情,但我想知道是否有另一種方法可以做到這一點。我一直在尋找框架和解釋器堆棧,我想我可以使用像inspect.stack()[1][0].f_locals之類的東西到達相關框架的本地人,但是我必須在定義該對象之前調用的Frame.__init__中執行此操作。

我的問題是如何找到,但只在需要的時候。這歸結爲兩個問題: 1.如何訪問實例化Friend的環境(或幀?)。 2.如何在getobject被調用時訪問它。

回答

2

你將不得不使用完全合格的類名,即:

class A: 
    friend = Friend('themodule.B') 

再取該字符串,提取出來的模塊和導入B級,併產生像這樣。

然而,在一般情況下,更好的辦法是做:

class A: 
    friend = Friend(B) 

在這種情況下,B沒有在這一點上定義的,但你可以很容易做到:

class A: 
    pass 

class B: 
    pass 

A.friend = Friend(B) 
B.friend = Friend(A)