使用exec()

时间:2019-07-02 05:48:44

标签: python-3.x

我正在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可以完美执行。

1 个答案:

答案 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)