我正在exec()中练习函数定义,但是在调用函数时,一些奇怪的行为使我感到困惑,请您帮忙!
在练习1中,即使我可以在locals()中找到'exec_func'对象,但在调用该函数时仍收到错误'NameError:名称'exec_func'未定义'。 在Practice-2和Practice-3中,该功能可以完美执行。
### Practice-1 ###
# Define exec_func in function body, and invoked directly
def main_func():
x = 5
exec('''def exec_func(p1, p2):
return p1 + p2''')
print('locals = ', locals())
print('exec_func=', exec_func(x, 3))
if __name__ == '__main__':
main_func()
### Practice-2 ###
# Define exec_func in function body, and invoked through locals()
def main_func():
x = 5
func = None
exec('''def exec_func(p1, p2):
return p1 + p2''')
print('locals = ', locals())
func = locals()['exec_func']
print('exec_func=', func(x, 3))
if __name__ == '__main__':
main_func()
### Practice-3 ###
# define exec_func out of function body, and invoked directly
x = 5
dic = None
exec('''def exec_func(p1, p2):
return p1 + p2''')
print('locals = ', locals())
print('exec_func=', exec_func(x, 3))
所以,基本上让我感到困惑的是: 1.在练习1中,为什么不能直接调用“ exec_func”,即使在locals()中也是如此。 2. Practice-3与Practice-1类似,区别仅在于,一个在函数体内,另一个在函数体内,为什么Practice-3可以完美执行。
答案 0 :(得分:0)
那么,如果您在globals
中进行如下设置,则Practise-1代码将起作用。默认情况下,将仅在globals
中查找任何符号(此处为函数)。
def main_func():
x = 5
exec('''def exec_func(p1, p2):
\treturn p1 + p2''')
print('locals = ', locals())
globals()['exec_func'] = locals()['exec_func']
print('exec_func=', exec_func(x, 3))
if __name__ == '__main__':
main_func()
输出:
locals = {'x': 5, 'exec_func': <function exec_func at 0x10f695378>}
exec_func= 8
这是本地人的文档
Help on built-in function locals in module builtins:
locals()
Return a dictionary containing the current scope's local variables.
NOTE: Whether or not updates to this dictionary will affect name lookups in
the local scope and vice-versa is *implementation dependent* and not
covered by any backwards compatibility guarantees.
(END)