2

我正在尝试找到一种方法,基本上可以eval使用代码中不同位置的上下文来进行后期处理。例如,我有一个 class 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被实例化的环境(或框架?)。getobject2.调用当时如何访问。

4

1 回答 1

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)
于 2012-04-20T07:02:19.557 回答