我想替换用exec
运行的代码中的一些内置函数。可以通过将其作为第二个exec
参数中的字典条目来传递。但是,当我尝试在执行的代码中导入模块时,在导入的模块内部调用时,功能与原始公告相同。
这是我要达到的目标的示例:
from inspect import cleandoc
def new_print(val):
print('Hello', val)
code_inner = cleandoc("""
def bar():
print('Inner')
""")
with open('inner.py', 'w') as f:
f.write(code_inner)
code_outer = cleandoc("""
import inner
print('Outer')
inner.bar()
""")
exec(code_outer, {'print': new_print}, {})
这是我收到的回复:
Hello Outer
Inner
这就是我想要的:
Hello Outer
Hello Inner
是否有任何方法可以将新的全局变量,内置函数或变量列表传递给导入的模块?
答案 0 :(得分:0)
我不确定这是否正是您想要的,但是将字典参数传递给该函数并更新其模块全局变量是可以的。
code_inner = cleandoc("""
def bar(d):
globals().update(d)
print('Inner')
""")
code_outer = cleandoc("""
import inner
print('Outer')
inner.bar({'print': print})
""")
或者,无需修改bar功能,您可以将其模块传递给全局,如下所示:
code_outer = cleandoc("""
import inner
inner.print = print
print('Outer')
inner.bar()
""")