在Python 2(不确定3)中,locals 字典仅在您实际调用 locals() 时才会更新。所以例如
l=locals()
x=2
l['x']
失败是因为l
里面没有键“x”,但是
l=locals()
x=2
locals()
l['x']
返回 2。
我正在寻找一种强制更新本地字典的方法,但诀窍是我处于不同的堆栈框架中。所以例如我正在寻找做
l=locals()
x=2
force_update()
l['x']
我需要写force_update()
功能。我知道从上述函数我可以通过获取父框架inspect.currentframe().f_back
,甚至父级(未更新的)本地人通过inspect.currentframe().f_back.f_locals
,但是我怎样才能强制更新呢?
如果这看起来很复杂,我的主要目标是编写一个函数,它是"{some} string".format(**dict(globals(),**locals()))
所以我不必每次都输入它,而是可以这样做fmt("{some} string")
。这样做我遇到了上面的问题。
Edit:下面是 Martjin 的回答,下面基本上就是我正在寻找的解决方案。人们可以确切地研究如何获取被调用者的堆栈帧,这里我通过partial
.
from functools import partial
from inspect import currentframe
fmt = partial(lambda s,f: s.format(**dict(globals(),**f.f_locals)),f=currentframe())
x=2
print fmt("{x}") #prints "2"
Simply 访问f_locals
在框架对象上触发复制,因此使用inspect.currentframe().f_back.f_locals
足够.
See the frame_getlocals()功能 https://hg.python.org/cpython/file/v3.5.1/Objects/frameobject.c#l21 in the frameobject.c
执行:
static PyObject *
frame_getlocals(PyFrameObject *f, void *closure)
{
PyFrame_FastToLocals(f);
Py_INCREF(f->f_locals);
return f->f_locals;
}
PyFrame_FastToLocals
是用于将数据从跟踪局部值的内部数组复制到字典的函数。frame_getlocals
用于实现frame.f_locals
描述符(属性);看到frame_getsetlist定义 https://hg.python.org/cpython/file/v3.5.1/Objects/frameobject.c#l366.
The PyFrame_FastToLocalsWithError
上面使用的函数是exactly what locals()
用于生成相同的字典(通过wrapping https://hg.python.org/cpython/file/v3.5.1/Python/bltinmodule.c#l1465 the PyEval_GetLocals功能 https://hg.python.org/cpython/file/v3.5.1/Python/ceval.c#l4437).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)