【问题标题】:Which function does Python print use?Python print 使用哪个函数?
【发布时间】:2016-07-09 09:19:03
【问题描述】:

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

>>> 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 实际调用的是什么?

【问题讨论】:

  • 它是__str__,但是当你只做b.__str__()时,你实际上是在做print b.__str__().__repr__(),所以它仍然打印不同。
  • 试试print b.__str__()

标签: python string printing repr


【解决方案1】:

检查这类事情很容易:

>>> 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() 而不是 代表()。成功返回 0,失败返回 -1;适当的 将设置异常。

【讨论】:

    【解决方案2】:

    object.__str__(self)

    str(object) 和内置函数format()print() 调用,以计算对象的 >'informal' 或可很好打印的字符串表示。返回值必须>是一个字符串对象。

    这是来自 python documentation。很明显,print 函数将调用定义的__str()__,如果你在类中同时定义了__str()____repr()__。但是如果你只是实现__repr()__,那么print(object)应该使用__repr()__

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 2013-03-24
      • 2018-03-21
      相关资源
      最近更新 更多