2016-03-22 2 views
0

Ich habe ein Objekt, das ich an das Terminal drucken bekam, und es sieht wie folgt aus:Welche Funktion verwendet Python?

>>> print b 
<p>„De neergang kan een duikvlucht worden.”</p> 

So fragte ich mich dann aus, welche Funktion das ist das Ergebnis. Also habe ich versucht, die folgenden:

>>> b.__repr__() 
'<lxml.etree._XSLTResultTree object at 0x112c6a980>' 
>>> b.__str__() 
'\xe2\x80\x9eDe neergang kan een duikvlucht worden.\xe2\x80\x9d</p>' 
>>> b.__unicode__() 
'u'<p>\u201eDe neergang kan een duikvlucht worden.\u201d</p>' 

Wie Sie sehen können, keine dieser Funktionen zeigt, was die print Anweisung zeigt. Ich dachte immer, dass print tatsächlich das Ergebnis entweder __repr__(), __str__() oder __unicode__() zeigt, aber das ist eindeutig nicht der Fall.

Also was nennt print eigentlich?

+6

Es ist '__str__', aber wenn Sie nur' b .__ str __() 'machen, machen Sie' print b .__ str __() .__ repr __() ', so dass es immer noch anders gedruckt wird. – zondo

+0

Versuchen Sie 'print b .__ str __()' – khelwood

Antwort

2

Es ist leicht genug, um diese Art der Sache zu überprüfen:

>>> class C(object): 
    def __repr__(self): 
     print("repr called") 
     return "repr" 
    def __str__(self): 
     print("str called") 
     return "str" 
    def __unicode__(self): 
     print("unicode called") 
     return "unicode" 


>>> print C() 
str called 
str 
>>> 

In der Tat, was intern passiert ist, dass print (als eine Funktion, die ist, habe ich nicht den Opcode überprüft, obwohl ich denke, dass es das ist, same) ruft PyFile_WriteObject mit dem Py_PRINT_RAW-Flag auf.

int PyFile_WriteObject (PyObject * obj, PyObject * p, int flags)

schreiben Objekt obj Objekt p Datei. Das einzige unterstützte Flag für Flags ist Py_PRINT_RAW; falls angegeben, wird das str() des Objekts anstelle von der repr() geschrieben. Rückgabe 0 bei Erfolg oder -1 bei Fehler; Die entsprechende Ausnahme wird festgelegt.