如何修补函数的__code__?
How to patch function's __code__?
我正在探索 __code__
属性和 ast
模块并发现了奇怪的行为,函数的第一次调用没有输出任何内容:
In [3]: def foo():
...: print('foo')
...:
In [4]: p = ast.parse("".join(inspect.getsourcelines(foo)[0]))
In [5]: p.body[0].body = ast.parse("print('bar')").body
In [6]: foo.__code__ = compile(p, foo.__code__.co_filename, 'exec')
In [7]: foo() # Nothing happens??
In [8]: foo() # Okay, let's try again
bar
这里发生了什么?
您可能认为您已将 foo.__code__
设置为打印 bar
的代码对象,但这不是您所做的。您已将 foo.__code__
设置为一个代码对象,该代码对象 定义了一个新的 foo
函数 ,它打印 bar
。有点像
def foo():
global foo
def foo():
print('bar')
在第一个运行之后,foo
是新的条形打印函数,运行ning新函数打印bar
.
我正在探索 __code__
属性和 ast
模块并发现了奇怪的行为,函数的第一次调用没有输出任何内容:
In [3]: def foo():
...: print('foo')
...:
In [4]: p = ast.parse("".join(inspect.getsourcelines(foo)[0]))
In [5]: p.body[0].body = ast.parse("print('bar')").body
In [6]: foo.__code__ = compile(p, foo.__code__.co_filename, 'exec')
In [7]: foo() # Nothing happens??
In [8]: foo() # Okay, let's try again
bar
这里发生了什么?
您可能认为您已将 foo.__code__
设置为打印 bar
的代码对象,但这不是您所做的。您已将 foo.__code__
设置为一个代码对象,该代码对象 定义了一个新的 foo
函数 ,它打印 bar
。有点像
def foo():
global foo
def foo():
print('bar')
在第一个运行之后,foo
是新的条形打印函数,运行ning新函数打印bar
.