为什么打印对象的结果与str()和repr()不同?

17 投票
2 回答
1049 浏览
提问于 2025-04-17 05:08

我在解释器上测试一些代码时,发现了关于 sqlite3.Row 类的一些意外行为。

我原本以为,使用 print obj 的结果总是和 print str(obj) 一样,而在解释器里输入 obj 的结果也应该和 print repr(obj) 一样,但对于 sqlite3.Row 来说,这并不是这样:

>>> print row       # the row object prints like a tuple
(u'string',)
>>> print str(row)  # why wouldn't this match the output from above?
<sqlite3.Row object at 0xa19a450>

>>> row             # usually this would be the repr for an object
(u'string',)
>>> print repr(row) # but repr(row) is something different as well!
<sqlite3.Row object at 0xa19a450>

我觉得 sqlite3.Row 可能是 tuple 的一个子类,但我还是不太明白背后到底发生了什么,导致了这种行为。有没有人能解释一下?

这是在 Python 2.5.1 上测试的,不确定其他版本的 Python 是否表现一样。

不太确定这是否重要,但我设置的 row_factory 属性是 sqlite3.Row

2 个回答

0
s = str(tuple(row))

这是一个解决方法,如果你想要原始的元组字符串表示。

比如说,如果你想方便地记录这一行数据,这个方法就很有用:

logging.debug(tuple(user_row))

之所以有效,是因为行数据是可以被遍历的。

12

PySqlite 提供了一个特别的功能,可以让你使用 print 来显示内容,但它没有实现 __repr____str__ 这两个方法。我觉得这是个小遗憾,不过至少这能解释你看到的行为。

你可以查看 pysqlite 的源代码:https://github.com/ghaering/pysqlite/blob/master/src/row.c#L241,还有 Python 的文档:http://docs.python.org/c-api/typeobj.html#tp_print

撰写回答