Python - 检测我的对象写入stdout的时间?

Art*_*are 10 python stdout

我有一个相当不寻常的要求,我想......在我解释之后,我会解释为什么.

什么

我想检测我的对象何时被写入stdout,以便我可以在那时执行副作用.所以,例如,当我键入:

sys.stdout.write(instance_of_my_class)
Run Code Online (Sandbox Code Playgroud)

它应该执行副作用.我做了我的课堂上的一个子类str和压倒__call__,__unicode__,__str__,__repr__,index,decode,encode,format,__format__,__getattribute__,__getitem__,并__len__让他们每个人打印一份声明中表示,他们已经被调用,但似乎sys.stdout.write为了调用这些都不打印一个对象.

请注意,我是专门讨论sys.stdout.write而不是,例如,print- 我已经发现无论给出什么,都会print调用__str__它.

为什么

这个问题继续从Windows中的彩色Python提示的答案离开了.

我发现,每次蟒蛇需要显示交互式提示,它调用__str__sys.ps1sys.ps2,然后将其保存在命令行上显示的结果.这意味着任何副作用sys.ps2.__str__都是在它们之后引起的sys.ps1.__str__,但是我希望让它们等到显示时间sys.ps2.

因此,我一直在返回我的子类,而不是返回一个strin sys.ps2.__str__,我str希望以某种方式能够捕获sys.stdout.write它的时候.

Ben*_*Ben 2

为什么不使用monkeypatch stdout.write?

stdoutRegistry = set()

class A(object):
    def __init__(self):
        self.stdoutRegistry.add(self)

    def stdoutNotify(self):
        pass

original_stdoutWrite = sys.stdout.write
def stdoutWrite(*a, **kw):
    if a in stdoutRegistry:
        a.stdoutNotify()
    original_stdoutWrite(*a, **kw)
sys.stdout.write = stdoutWrite
Run Code Online (Sandbox Code Playgroud)