当我尝试运行使用runpy模块加载的文件中定义的方法时,出现意外行为。这些方法看不到在该方法之外定义的任何变量(包括导入的模块)。这是我的做法:
#test.py
import runpy
env = runpy.run_path('test', {'y':'world'})
env['fn']()
~
#test
import re
print(re.compile(r'^hello', re.IGNORECASE).sub('', "hello world"))
x = "hello"
print(x)
print(y)
def fn():
try:
print(re.compile(r'^hello', re.IGNORECASE).sub('', "hello world"))
except:
print("No re")
try:
print(x)
except:
print("No x")
try:
print(y)
except:
print("No y")
我预期的 test.py 输出将是:
world
hello
world
world
hello
world
因为 fn 会形成 re、x 和 y 的闭包。
但是,相反,我得到:
world
hello
world
No re
None
None
看起来 re 没有在 fn 中定义,即使它应该具有正常的关闭行为。x 和 y 更奇怪,因为它们似乎已定义但设置为 None。
为什么会这样以及闭包如何与 runpy 一起使用?如何实现正常行为,使 fn 可以“看到”外部变量?