python print vs __str__?

ジョー*_*ョージ 9 python python-2.7

任何人都可以启发我print sth和之间的差异print str(sth)

例如,在sqlite3官方文档的示例中,当前可以看到以下代码创建数据库,然后使用工厂类来包装从那里提取的数据:

(1)创建数据库:

# I am using CPython 2.7, but I suppose 2.6 will be Ok as well
import sqlite3
conn = sqlite3.connect(":memory:")
c = conn.cursor()

c.execute('''create table stocks
(date text, trans text, symbol text, qty real, price real)''')
c.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")
conn.commit()

c.close()
Run Code Online (Sandbox Code Playgroud)

(2)现在使用Row工厂生产一些物体:

>>> conn.row_factory = sqlite3.Row
>>> c = conn.cursor()

>>> c.execute('select * from stocks')
<sqlite3.Cursor object at 0x7f4e7dd8fa80>
>>> r = c.fetchone()
>>> type(r)
<type 'sqlite3.Row'>
>>> r
(u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
Run Code Online (Sandbox Code Playgroud)

如您所见,我们可以键入rprint r获得行对象的漂亮表示.

但是上面没有显示的是,它print str(r)会给你一些不同的东西 - 更像是:

<sqlite3.Row object at 0x7f4e7dd8abcd> 
Run Code Online (Sandbox Code Playgroud)

所以我想知道一个熟悉CPython实现的人是否可以解释什么打印从一个不支持的对象获得这种表示__str__

或者我想另一个问题是 - 在上述表达式给出不同结果的情况下 - 我如何获得一个等同于简单打印的字符串的字符串print obj

ジョー*_*ョージ 7

当我写这篇文章并寻找一些参考文献时,我实际上找到了答案的大部分内容:

  1. Python对象的C实现可以实现PyObject_Print()函数,它定义了对象打印到文件的方式,包括stdout;

  2. 因此,要获得该表示,应该使用cStringIO模块(尚未尝试,但据说这应该工作).

不过,我会在这里留下这个问题,希望有人可能觉得它有用 - 或提供更好的答案.

UPD.一个cStringIO例子:

import cStringIO as C; s = C.StringIO(); print >>s, r, ; s.getvalue()  
Run Code Online (Sandbox Code Playgroud)

- 最后一个逗号有助于摆脱换行符[我认为取决于平台]

PS.在SO上有几个相关的问题:
- "Python打印不使用__repr __,__ unicode__或__str__用于unicode子类?"
- "Python中__str__和__repr__之间的区别?"

(例如,第一个问题的答案答案有一个很好的链接PyFile_WriteObject()的代码.)

PPS.在py3k中,这种差异似乎完全消失了.