为什么打印对象的结果与str()和repr()不同?
我在解释器上测试一些代码时,发现了关于 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