在试图找出这个答案时,我从文档中看到每个堆栈帧都有一个f_globals
成员。
这是为了在每个被调用者的基础上进行操作而设计的吗?
我想把一个局部变量通告给一个函数的被调用者;当我们在这个调用树中时,这是上下文装饰器和实用程序将使用的";这样,就不必修改潜在调用图中的每个函数来传递它。毕竟,当您必须重写修饰函数时,它不是一个好的修饰器。
所以我认为到目前为止我学到了什么:
调用堆栈可以为每个帧包含不同的CCD_ 2值;全局";在定义它的模块内共享的状态,而不是整个执行状态。由于调用可以在模块之间交叉,因此r_globals
在每一帧中都可能不同。
即使您创建了一个新模块并将一个函数复制到其中,__globals__
也是该函数对象的只读成员,因此当您调用它时,它的全局变量会恢复到最初定义它的原始模块,而不是它所采用的父对象的已修改全局变量。
类似地,如果您将exec()
与修改的全局变量一起使用,或者如果您可以使用修改的__globals__
构建自己的被调用者代码副本,那么在后续调用返回到该函数的全局变量的原始视图之前,您将只获得一层深度。
看起来这个问题的预期解决方案是上下文变量,它解决了线程本地存储无法处理的一些问题。