我正在尝试使用代码中不同位置的上下文找到一种基本上做晚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
时如何访问它。
答案 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)