Python打印使用哪个功能?

时间:2016-03-22 13:06:19

标签: python string printing repr

我有一个打印到终端的对象,它看起来像这样:

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

所以我想知道结果是哪个函数。所以我尝试了以下内容:

>>> 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>'

如您所见,这些函数都不会显示print语句显示的内容。我一直认为print实际上会显示__repr__()__str__()__unicode__()的结果,但事实显然并非如此。

那么print实际上会调用什么?

2 个答案:

答案 0 :(得分:2)

检查这类事情很容易:

>>> 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
>>> 

事实上,内部发生的是print(作为一个函数,我没有检查操作码,虽然我认为它是相同的)使用Py_PRINT_RAW标志调用PyFile_WriteObject。

  

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

     

写入   对象obj到文件对象p。标志唯一支持的标志是   Py_PRINT_RAW;如果给定,则写入对象的str()而不是   repr()。成功时返回0或失败时返回-1;适当的   异常将被设定。

答案 1 :(得分:0)

  

object.__str__(self)

     

str(object)和内置函数format()print()调用,以计算对象的“非正式”或可很好打印的字符串表示形式。返回值必须>是字符串对象。

这来自python documentation。很明显,如果您在类中同时定义了print__str()__,则__str()__函数将调用已定义的__repr()__。但是,在仅实现__repr()__的情况下,则print(object)应该使用__repr()__

希望这会有所帮助。