python3 exec locals()
起因
因为需要一边调试写python脚本, 一边在interpeter里面测试,但import
只能导入一次,所以想要用execfile
,但是python3没有这个函数,官方的推荐是exec(open(path).read())
,但是这样要写好长.于是,想要自己写一个
经过
自己写出的代码是这样的.
def execfile(path):
'''
execute file in local scope and then add local new added variables to globals.
'''
ori=locals().copy()
with open(path) as f:
exec(f.read())
del f
loc=locals()
del loc['ori']
for i in loc:
if not i in ori:
globals()[i]=loc[i]
由于需要将exec加入到局部域中的变量,加入到全局域中,所以有了这样的代码,但是当使用这个函数加载某脚本的时候,发生了错误.
加载的脚本抽象如下:
def a():
return 0
def b():
return a
b()
然后就报错了.然后搜了一下,果然在stackoverflow上有说.
就是说exec
对locals()是不"打算"修改并且修改的行为是和globals()不同的.可以认为locals()是没有被修改的,但是其中有一些相当微妙的东西.
比如,如下代码
def foo():
exec('''
def a():
pass''')
def b():
pass
print(locals())
foo()
的输出结果
{'a': <function a at 0x000001790A5392F0>, 'b': <function foo.<locals>.b at 0x000001790A539268>}
至于如何微妙我就不懂了.
结果
结果就是我知道了exec
的两个参数,所以,我最后的execfile
函数改成
def execfile(path):
with open(path) as f:
exec(f.read(),globals())
就行了.