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

标签 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 有类似的定义列的模式,但它们通过跟踪 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/

相关文章:

python - 需要 Microsoft Visual C++ 14.0。用 "Microsoft Visual C++ Build Tools": http://landinghub. visualstudio.com/visual-cpp-build-tools 获取

Python:如何在对象列表上链接方法?

python - MemoryError:在python中使用word2vec时无法分配形状和数据类型为float32的数组

python - 无法从消息包(Ruby openssl)解码 python 中的加密字符串

python - virtualenv virtualenvwrapper virtualenv : error: unrecognized arguments: --no-site-packages

python - 如何让 Userb 第一条消息给我?下面的代码有助于获取最新消息。我想要该用户的第一条消息给我

python - 即使代码正在运行,Spyder也无法使用opencv打开网络摄像头结果窗口

python - 如何进行嵌套列表理解 (Python)

python-3.x - 值错误: The number of class labels must be greater than one in Passive Aggressive Classifier

Python字典编辑词条