Python 函数的全局视图是否继承自调用方,我可以注入实际上不是全局的东西吗?



在试图找出这个答案时,我从文档中看到每个堆栈帧都有一个f_globals成员。

这是为了在每个被调用者的基础上进行操作而设计的吗?

我想把一个局部变量通告给一个函数的被调用者;当我们在这个调用树中时,这是上下文装饰器和实用程序将使用的";这样,就不必修改潜在调用图中的每个函数来传递它。毕竟,当您必须重写修饰函数时,它不是一个好的修饰器。

所以我认为到目前为止我学到了什么:

调用堆栈可以为每个帧包含不同的CCD_ 2值;全局";在定义它的模块内共享的状态,而不是整个执行状态。由于调用可以在模块之间交叉,因此r_globals在每一帧中都可能不同。

即使您创建了一个新模块并将一个函数复制到其中,__globals__也是该函数对象的只读成员,因此当您调用它时,它的全局变量会恢复到最初定义它的原始模块,而不是它所采用的父对象的已修改全局变量。

类似地,如果您将exec()与修改的全局变量一起使用,或者如果您可以使用修改的__globals__构建自己的被调用者代码副本,那么在后续调用返回到该函数的全局变量的原始视图之前,您将只获得一层深度。


看起来这个问题的预期解决方案是上下文变量,它解决了线程本地存储无法处理的一些问题。

最新更新