Ich habe eine ziemlich ungewöhnliche Anfrage, ich denke ... Ich werde das Warum erklären, nachdem ich das was erklärt habe.Python - erkennen, wenn mein Objekt in stdout geschrieben ist?
Was
Ich möchte erkennen, wenn mein Objekt auf diese geschrieben wird, so dass ich Nebenwirkungen zu dieser Zeit durchführen können. Also, zum Beispiel, wenn ich tippe:
sollte es Nebenwirkungen ausführen. Ich habe meine Klasse eine Unterklasse von str
und overrode __call__
, __unicode__
, __str__
, __repr__
, index
, decode
, encode
, format
, __format__
, __getattribute__
, __getitem__
und __len__
so gemacht, dass jeder von ihnen eine Erklärung druckt darauf hinweist, dass sie haben wurde aufgerufen, aber es scheint, dass sys.stdout.write
keine von denen aufruft, um ein Objekt zu drucken.
Bitte beachte, dass ich speziell rede über sys.stdout.write
und nicht zum Beispiel print
- Ich habe festgestellt, dass print
Anrufe __str__
auf, was es gegeben ist.
Warum
Diese Frage weiter, von wo aus der Antwort auf Colored Python Prompt in Windows? aufhörte.
ich gefunden habe, dass jedes Mal, Python eine interaktive Eingabeaufforderung angezeigt werden muss, ruft es __str__
auf sys.ps1
und sys.ps2
, und dann speichert sie die Ergebnisse auf der Kommandozeile angezeigt werden. Dies bedeutet, dass alle Nebenwirkungen in sys.ps2.__str__
direkt nach denen in sys.ps1.__str__
verursacht werden, aber ich möchte diese warten, bis es Zeit ist, sys.ps2
anzuzeigen.
Also anstatt zurückgeben str
in sys.ps2.__str__
, ich habe meine Unterklasse von str
worden Rückkehr, die ich bin der Hoffnung, irgendwie fangen können, wenn sys.stdout.write
auf sie aufgerufen wird.
Das ist eine interessante Idee. Ich frage mich, ob es wirklich tun würde, was ich will ... es gibt eine Menge wirklich cooler Sachen, um das Verhalten der Standard-REPL leicht zu modifizieren, wenn das funktionieren würde. Ich werde später am Abend darüber nachdenken und Sie wissen lassen, ob es funktioniert oder nicht (und ich werde Ihre Antwort akzeptieren, wenn es funktioniert). – ArtOfWarfare
+1 Ben: Das funktioniert, um die Frage zu beantworten, die ich gestellt habe, aber leider erkennt es nicht wirklich, wenn sys.ps2 gedruckt wird. – ArtOfWarfare
Sie können einfach nach 'if a is sys.ps2' suchen. – Ben