如何修补函数的__code__?

时间:2017-10-10 20:42:26

标签: python abstract-syntax-tree

我正在探索__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

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您可能认为已将foo.__code__设置为打印bar的代码对象,但这不是您所做的。您已将foo.__code__设置为定义打印foo的新bar函数的代码对象。这有点像

def foo():
    global foo
    def foo():
        print('bar')

第一次运行后,foo是新的条形打印功能,运行新功能会打印bar