我发现了与此问题相关的一些模糊的问题,但没有找到任何针对CPython的干净且特定的解决方案。我认为“有效”解决方案是特定于解释器的。
首先,我认为我了解:
locals()
给出了不可修改的字典。
函数可以(并且确实确实)使用某种优化来访问其局部变量
frame.f_locals
给出了locals()
类似的字典,但不太容易通过hackhacking exec
。或至少我没有能力做些骇人听闻的未证明的事情,例如locals()['var'] = value ; exec ""
exec
能够对局部变量做一些奇怪的事情,但它并不可靠-例如,我读到某处它在Python 3中不起作用。未经测试。
因此,我了解到,鉴于这些限制,向局部变量添加额外的变量永远是不安全的,因为这会破坏解释器的结构。
但是,应该可以更改已经存在的变量,不是吗?
我考虑过的事情
在一种功能中f
,可以访问f.func_code.co_nlocals
和f.func_code.co_varnames
。
在一个框架中,可以通过访问/检查/读取变量frame.f_locals
。这是通过设置跟踪器的用例sys.settrace
。
可以很容易地访问框架所在的功能-结合使用设置跟踪的用例,并使用它在给定触发器或任何给定局部变量的情况下“执行操作”。
变量应该在某个地方,最好是可写的...但是我找不到它。即使它是一个数组(用于有效的解释器访问),或者我需要一些额外的C特定接线,我也准备提交。
如何从跟踪函数或修饰的包装函数或类似的东西实现对变量的修改?
完整的解决方案当然会受到赞赏,但即使是某些指针也会对我有很大帮助,因为我在这里遇到了很多不可写的字典:-/
编辑:hackish的exec
是做这样的事情这还是本