У меня довольно необычный запрос, я думаю... Я объясню, почему после того, как я объясню, что.
Что
Я хочу, чтобы каждый раз, когда мой объект записывался в stdout, я мог выполнять побочные эффекты в это время. Так, например, когда я печатаю:
sys.stdout.write(instance_of_my_class)
он должен выполнять побочные эффекты. Я сделал свой класс подклассом str
и переделал __call__
, __unicode__
, __str__
, __repr__
, index
, decode
, encode
, format
, __format__
, __getattribute__
, __getitem__
и __len__
, чтобы каждый из них печатал оператор, указывающий, что они были вызваны, но кажется, что sys.stdout.write
не вызывает ни одного из них для печати объекта.
Обратите внимание, что я специально говорю о sys.stdout.write
, а не, например, print
- я обнаружил, что print
вызывает __str__
на все, что он задан.
Почему
Этот вопрос продолжается, после того, как был отключен ответ Цветной запрос на Python в Windows?.
Я обнаружил, что каждый раз, когда python должен отображать интерактивное приглашение, он вызывает __str__
на sys.ps1
и sys.ps2
, а затем сохраняет результаты, которые будут отображаться в командной строке. Это означает, что любые побочные эффекты в sys.ps2.__str__
вызываются сразу после тех, что находятся в sys.ps1.__str__
, но я хочу, чтобы они подождали, пока не покажут sys.ps2
.
Вместо того, чтобы возвращать str
в sys.ps2.__str__
, я возвращаю свой подкласс str
, который, как я надеюсь, каким-то образом сможет поймать, когда на него вызывается sys.stdout.write
.