我有一个callback
内部计算的可赎回债券exec()
。
我_globals
和_locals
那名在此使用exec()
。还有一个关键的值variable_from_context
在_locals
。
但是,当我尝试调用时callback()
,它是在当前上下文中执行的,而不是在其原始上下文中执行的。它找不到variable_from_context
。
exec()
只接受一个str
或一个代码对象。我找到了这种方法来访问callback
的代码对象,并尝试调用此方法:
exec(callback.__code__, scenario._globals, scenario._locals)
但是我又得到了NameError: name 'variable_from_context' is not defined
。
callback
给定的globals
和打电话的正确方法是什么locals
?
代码示例:
der_callback = None
def save_callback(cb):
der_callback = cb
_locals = {}
_globals = {'save_callback': save_callback}
text = r'''
zoo = ['we']
def foo():
print(zoo[0])
save_callback(foo)
'''
exec(text, _globals, _locals)
print(_locals)
# One can also try this:
# exec(_locals['foo'].__code__, _globals, _locals)
# EDIT: Now, why doesn't _locals get used when invoking a function?
# This works:
# exec('print(zoo[0])', _globals, _locals)
# EDIT continues: This doesn't:
# exec('foo()', _globals, _locals)
_locals['foo']()
输出:
Traceback (most recent call last):
{'zoo': ['we'], 'foo': <function foo at 0x1020b2d90>}
File "/Users/me/pyzoo/callback_from_eval.py", line 22, in <module>
exec(_locals['foo'].__code__, _globals, _locals)
File "<string>", line 5, in foo
NameError: name 'zoo' is not defined
首先,任何上下文都有其全局变量和局部变量。在模块级别,它们是等效的(同一词典)。在其他情况下,它们通常有所不同。除非您将东西声明为global
,否则任何赋值都会修改上下文局部变量,而不是全局变量。
然后,任何功能都有其自己的本地变量。结果,当输入时foo
,_globals
被视为全局变量,而_locals
未被视为本地变量。所以,zoo
是不可见的。直接解决方法是global zoo
在将其分配给块之前说。
同样,您在中也暴露了相同的问题save_callback
:分配给der_callback
不会更改全局变量,而是会导致局部变量退出后立即丢失。要修复,请der_callback
在函数内部声明为全局。
UPD:如果您需要本地顶级本地人,可以尝试以下技巧之一:
T1。在块全局级别上,为locals()分配一个名称,并在foo()中重用它:
globals()['xl'] = locals()
zoo = ['we']
def foo():
print(xl['zoo'][0])
T2。使用调用堆栈框架查找:
块外:
def save_callback(cb):
global der_callback
der_callback = lambda: cb(sys._getframe(1).f_locals)
在foo定义中:
def foo(xl):
print(xl['zoo'][0])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句