Python - 替换 exec 中的函数和其中导入的模块
Python - Replace function in exec and modules imported inside it
我想用 exec
替换我 运行 代码中的一些内置函数。可以通过将其作为字典条目传递到第二个 exec
参数中。但是当我尝试在执行的代码中导入模块时,在导入的模块中调用时,函数与原始 bultins 中一样。
这是我要实现的示例:
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
有没有办法将新的全局变量、内置函数或变量列表传递给正在导入的模块?
我不确定它是否正是您想要的,但是将字典参数传递给函数并更新其模块全局变量是可行的。
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()
""")
我想用 exec
替换我 运行 代码中的一些内置函数。可以通过将其作为字典条目传递到第二个 exec
参数中。但是当我尝试在执行的代码中导入模块时,在导入的模块中调用时,函数与原始 bultins 中一样。
这是我要实现的示例:
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
有没有办法将新的全局变量、内置函数或变量列表传递给正在导入的模块?
我不确定它是否正是您想要的,但是将字典参数传递给函数并更新其模块全局变量是可行的。
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()
""")