我有一个相当不寻常的要求,我想......在我解释之后,我会解释为什么.
什么
我想检测我的对象何时被写入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.ps1和sys.ps2,然后将其保存在命令行上显示的结果.这意味着任何副作用sys.ps2.__str__都是在它们之后引起的sys.ps1.__str__,但是我希望让它们等到显示时间sys.ps2.
因此,我一直在返回我的子类,而不是返回一个strin sys.ps2.__str__,我str希望以某种方式能够捕获sys.stdout.write它的时候.
为什么不使用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)
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |