注意:此问题仅供参考.我很有兴趣看到Python内部有多深入,可以使用它.
不久前,在一个问题内部开始讨论是否可以在调用之后/期间修改传递给print语句的字符串print.例如,考虑功能:
def print_something():
print('This cat was scared.')
Run Code Online (Sandbox Code Playgroud)
现在,当print运行时,输出到终端应该显示:
This dog was scared.
Run Code Online (Sandbox Code Playgroud)
请注意,"cat"一词已被"dog"一词取代.在某处某处能够修改那些内部缓冲区来改变打印的内容.假设这是在没有原始代码作者的明确许可的情况下完成的(因此,黑客/劫持).
这个评论从智者@abarnert,尤其让我思考:
有几种方法可以做到这一点,但它们都非常丑陋,永远不应该完成.最简单的方法是
code将函数内的对象替换为 具有不同co_consts列表的对象.接下来可能会进入C API来访问str的内部缓冲区.[...]
所以,看起来这实际上是可行的.
这是我解决这个问题的天真方式:
>>> import inspect
>>> exec(inspect.getsource(print_something).replace('cat', 'dog'))
>>> print_something()
This dog was scared.
Run Code Online (Sandbox Code Playgroud)
当然,这exec很糟糕,但这并没有真正回答这个问题,因为在 print调用时/后调用时它实际上并没有修改任何内容.
如果@abarnert解释了它会怎么做?