如何从代码中的不同点访问全局变量

时间:2012-04-20 06:52:23

标签: python python-3.x

我正在尝试使用代码中不同位置的上下文找到一种基本上做晚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__之前执行此操作。对象已定义。

我的问题是如何查找original_context,但仅限于需要时。这归结为两个问题: 1.如何访问实例化Friend的环境(或框架?)。 2.调用getobject时如何访问它。

1 个答案:

答案 0 :(得分: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)