どのようにしてオブジェクトを出力すると、str()とrepr()のどちらとも異なる出力が得られますか?

私はインタプリタでいくつかのコードをテストしていましたが、 sqlite3.Row クラスを使用します。

私の理解は、 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?


>>> row             # usually this would be the repr for an object
(u'string',)
>>> print repr(row) # but repr(row) is something different as well!

私は sqlite3.Rowtuple のサブクラスでなければならないと思いますが、この現象を引き起こす可能性のあるシーンの裏側で何が起こっているのかはまだ分かりません。誰もこれを説明できますか?

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

これが重要かどうかは不明ですが、 row_factory 私の Connection の属性は sqlite3.Row に設定されていました。

17
@kaloyan - あなたが私にそれを指摘することができれば、私はそこに何かを見つけることができません。
追加された 著者 Andrew Clark,
興味深い行動。 sqlite3.Row はタプルをサブクラス化していないようですので、継承よりもいくつかの基準に基づいてprint文の特殊ケースリストやタプルを推測していますが、それをはっきりと説明することはできません。
追加された 著者 millimoose,
追加された 著者 ktdrv,

2 答え

PySqliteは print に特殊なネイティブフックを提供しますが、 __ repr ____ str __ は実装していません。私はそれが少し逃したチャンスだと言っていますが、少なくともあなたが観察している行動を説明します。

See pysqlite source: https://github.com/ghaering/pysqlite/blob/master/src/row.c#L241 And python docs: http://docs.python.org/c-api/typeobj.html#tp_print

11
追加された
私はこのトピックをpysqliteのbugtrackerにリンクしました: code.google.com/ p/pysqlite/issues/detail?id = 4
追加された 著者 Ondergetekende,
@CiroSantilli私はgithubへの移行を説明するために私の答えを更新しました。貧弱な機能はまだ解決されていません
追加された 著者 Ondergetekende,
ニースを見つける! sqliteの開発者は推奨事項に反しているようで、これはおそらくこれがより多くの場所で見られない理由です。ドキュメントから: "タイプは、tp_reprまたはtp_strとは異なる出力を生成するような方法でtp_printを実装するべきではありません"と "tp_printを定義するのではなく、印刷のためにtp_reprとtp​​_strに依存することをお勧めします。
追加された 著者 Andrew Clark,
@Ondergetekendeバグのリンクが壊れてしまった、それがどこかで終わったのか、新しいものを開くのか( bugs.python。 org ?)
追加された 著者 Ciro Santilli 包子露宪 六四事件 法轮功,
s = str(tuple(row))

元のタプル文字列表現が必要な場合の回避策です。

たとえば、次のように簡単に行を記録したい場合に便利です。

logging.debug(tuple(user_row))

行は反復可能であるため、動作します。

0
追加された