任何人都可以启发我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)
如您所见,我们可以键入r或print r获得行对象的漂亮表示.
但是上面没有显示的是,它print str(r)会给你一些不同的东西 - 更像是:
<sqlite3.Row object at 0x7f4e7dd8abcd>
Run Code Online (Sandbox Code Playgroud)
所以我想知道一个熟悉CPython实现的人是否可以解释什么打印从一个不支持的对象获得这种表示__str__?
或者我想另一个问题是 - 在上述表达式给出不同结果的情况下 - 我如何获得一个等同于简单打印的字符串的字符串print obj?
当我写这篇文章并寻找一些参考文献时,我实际上找到了答案的大部分内容:
Python对象的C实现可以实现PyObject_Print()函数,它定义了对象打印到文件的方式,包括stdout;
因此,要获得该表示,应该使用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中,这种差异似乎完全消失了.
| 归档时间: |
|
| 查看次数: |
1172 次 |
| 最近记录: |