在运行以下脚本时,我遇到了一些奇怪的行为。
如您所见,好像write被多次调用了,我不知道为什么会这样,因为我已经明确覆盖了file=sys.stdout行为。
引擎盖下的打印管道流如何精确地输送到所有通道?它是否具有某些默认行为,除了以下内容外,文档不是很具体:
file参数必须是带有write(string)方法的对象;如果不存在或无,则将使用sys.stdout。
测试脚本
import sys
def debug(*args, **kwargs):
pass
def _debugwrite(obj):
print("You're looking at Attila, the psychopathic killer, the caterpillar")
out = sys.stderr
out.write(obj)
debug.write = _debugwrite
print("Don't you ever disrespect the caterpillar", file=debug)
输出:
You're looking at Attila, the psychopathic killer, the caterpillar
You're looking at Attila, the psychopathic killer, the caterpillar
Don't you ever disrespect the caterpillar
我所期望的:
You're looking at Attila, the psychopathic killer, the caterpillar
Don't you ever disrespect the caterpillar
我试了一下:
我试图使用inspect模块来获取调用方,也许看到实际的调用是谁写的,但是我得到了moduleidk为什么:(这很明显吗?
进一步的问题:
有什么方法可以调试超出函数范围Python并进入基础C调用的方法?因为主Python分布很好,所以CPython,如果我的理解是正确的,Python则它只是api基础C代码的一个。通话最终Python会转换为C后台通话。因此,举例来说,我发现print C在C中定义如下,但是对我来说很难理解那里发生了什么(因为erm,我不知道C),但是也许通过调试器我可以打印出一些东西,看看是什么,并弄清楚至少是流程,如果不是全部的话。我非常想了解引擎盖下的总体情况,而不是理所当然地认为。
宝慕林4294392
相关分类