2011-10-27 60 views
17

我正在測試解釋器上的一些代碼,我注意到一些sqlite3.Row類的意外行爲。如何打印一個對象導致不同的輸出比str()和repr()?

我的理解是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版本的行爲是否相同。

不確定這是否重要,但我的Connectionrow_factory屬性設置爲sqlite3.Row

+0

發佈之前,你看過http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python嗎? – ktdrv

+0

@kaloyan - 我找不到任何回答我的問題的東西,如果你能指點我的話。 –

+0

有趣的行爲。 'sqlite3.Row'似乎不是子類的元組,所以我的猜測是print語句的特例列表和/或基於除繼承之外的其他標準的元組,但是我在文檔中找不到任何可以承認的東西,更不用說解釋了。 – millimoose

回答

11

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

+2

不錯的發現!看來,sqlite開發人員反對這可能是爲什麼這在更多地方沒有看到的建議。從文檔:「類型永遠不應該實現tp_print產生不同的輸出比tp_repr或tp_str會」和「建議不要定義tp_print,而是依賴於tp_repr和tp_str打印」。 –

+3

我已經在pysqlite的錯誤跟蹤器中鏈接了這個主題:http://code.google.com/p/pysqlite/issues/detail?id=4 – Ondergetekende

+0

@Ondergetekende錯誤鏈接被破壞,它是否在別的地方結束,或者我們會打開一個新的(在http://bugs.python.org/?) –

0
s = str(tuple(row)) 

是一個解決辦法,如果你想在原來的元組字符串表示。

,如果你想輕鬆地登錄該行作爲它是有用的,例如:

logging.debug(tuple(user_row)) 

工作,因爲行是可迭代。

相關問題