2012-04-20 87 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)