2011-10-27 9 views
17

私はインタプリタでいくつかのコードをテストしていましたが、sqlite3.Rowクラスの予期しない動作に気付きました。私が思うオブジェクトを印刷すると、str()とrepr()のどちらとも異なる出力が得られますか?

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

私の理解では、print objが常にprint str(obj)と同じ結果を得るだろう、とインタプリタにobjを入力するとprint repr(obj)と同じ結果を得るだろうということでしたが、これはsqlite3.Rowのためのケースではありませんsqlite3.Rowtupleのサブクラスでなければなりませんが、この現象を引き起こす可能性があるシーンの背後には何が起こっているのかはまだ分かりません。誰もこれを説明できますか?

これはPython 2.5.1でテストされましたが、動作が他のPythonバージョンと同じかどうかは不明です。

これが重要かどうかはわかりませんが、のrow_factory属性はsqlite3.Rowに設定されています。

+0

投稿する前にhttp://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-pythonを見ましたか? – ktdrv

+0

@kaloyan - あなたが私にそれを指摘することができれば、私は私の質問に答える何も見つけることができません。 –

+0

興味深い行動。 'sqlite3.Row'はtupleをサブクラス化していないようですので、継承よりもいくつかの基準に基づいてprint文の特殊ケースリストやタプルを推測していますが、これを説明することははるかに少ない。 – millimoose

答えて

11

PySqliteはprintの特別なネイティブフックを提供しますが、__repr__または__str__を実装していません。私はそれが少し逃したチャンスだと言っていますが、少なくともあなたが観察している行動を説明します。 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_reprまたはtp_strとは異なる出力を生成するような方法でtp_printを実装するべきではありません"と "tp_printを定義するのではなく、印刷のためにtp_reprとtp​​_strに依存することをお勧めします。 –

+3

私はこのトピックをpysqliteのbugtrackerにリンクしました:http://code.google.com/p/pysqlite/issues/detail?id=4 – Ondergetekende

+0

@Ondergetekendeバグのリンクが壊れてしまった、それは別の場所に終わったのでしょうか?新しいものを開く(http://bugs.python.org/?) –

0
s = str(tuple(row)) 

が回避策です

はpysqliteのソースを参照してください。

あなたはのように簡単に行をログに記録したい場合には、例えば便利です。

logging.debug(tuple(user_row)) 

作品行が反復可能であるため。

関連する問題