我正在尝试找到一种基本上执行后期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 有类似的定义列的模式,但它们通过跟踪 session 中所有拥有的类(即表)来实现它。如果需要的话我可以做类似的事情,但我想知道是否还有其他方法可以做到这一点。我一直在研究框架和解释器堆栈,我认为我可以使用诸如 inspect.stack()[1][0].f_locals
之类的东西来获取相关框架的局部变量,但我会必须在定义对象之前调用的 Frame.__init__ 中执行此操作。
我的问题是如何找到original_context
,但仅在需要时才找到。这归结为两个问题:
1. 如何访问实例化 Friend
的环境(或框架?)。
2.调用getobject
时如何访问它。
最佳答案
您必须使用完全限定的类名,即:
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)
关于python - 如何从代码中的不同点访问全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10241582/