打印对象如何产生与str()和repr()不同的输出?

时间:2011-10-27 18:05:28

标签: python sqlite

我在解释器上测试了一些代码,我注意到了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版本的行为是否相同。

不确定这是否重要,但我的Connection的{​​{3}}属性设置为sqlite3.Row

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

providesB2
如果你想要原始的元组字符串表示,

是一种解决方法。

例如,如果您想要轻松记录行,则非常有用:

s = str(tuple(row))

可以使用,因为行是可迭代的。