gpt4 book ai didi

python 打印与 __str__?

转载 作者:太空狗 更新时间:2023-10-29 20:20:21 26 4
gpt4 key购买 nike

谁能告诉我 print sthprint str(sth) 之间的区别?

例如在 official documentation for 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()

(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)

如您所见,我们可以键入 rprint r 来获得行对象的这种很好的表示形式。

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

<sqlite3.Row object at 0x7f4e7dd8abcd> 

所以我想知道是否有熟悉 CPython 实现的人可以解释 print 是如何从不支持 __str__ 的对象中获取这种表示的?

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

最佳答案

当我写这篇文章并寻找一些引用资料时,我实际上找到了大部分答案:

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

  2. 因此,要获得该表示,可能应该使用 cStringIO模块(还没有尝试过,但应该可以)。

不过,我会把这个问题留在这里,希望有人会觉得它有用——或者提供更好的答案。

更新 cStringIO 示例:

import cStringIO as C; s = C.StringIO(); print >>s, r, ; s.getvalue()  

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

附言。关于 SO 的一些相关问题:
-- "Python print isn't using __repr__, __unicode__ or __str__ for unicode subclass?"
-- "Difference between __str__ and __repr__ in Python?"

(例如,第一个问题的 answer 答案有一个很好的 linkPyFile_WriteObject() 的代码。)

PPS。在 py3k 中,这个差异 seems to be gone completely .

关于python 打印与 __str__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com