224

__str__()対を実装する必要がある場合のPython規則はありますか__unicode__()__unicode__()クラスがより頻繁にオーバーライドするのを見てきまし__str__()たが、一貫性がないようです。一方を他方よりも実装する方が良い場合、特定のルールはありますか?両方を実装する必要がある/良い習慣ですか?

4

6 に答える 6

268

__str__()は古いメソッドです -- バイトを返します。__unicode__()は新しい優先メソッドです。文字を返します。名前は少し紛らわしいですが、2.x では互換性の理由からそれらに固執しています。一般に、すべての文字列フォーマットを に置き__unicode__()、スタブ__str__()メソッドを作成する必要があります。

def __str__(self):
    return unicode(self).encode('utf-8')

3.0 ではstrに文字が含まれているため、同じメソッドに と という名前が付けられ__bytes__()__str__()います。これらは期待どおりに動作します。

于 2009-08-20T16:04:34.463 に答える
24

特定のクラスの文字列化をマイクロ最適化することを特に気にしない場合は__unicode__、より一般的であるため、常に実装のみを行います。そのような細かいパフォーマンスの問題 (これは例外であり、ルールではありません) を__str__気にする場合、(文字列化された出力に非 ASCII 文字が決して存在しないことを証明できる場合) または両方 (両方が可能である場合) のみを使用すると、ヘルプ。

これらは堅実な原則だと思いますが、実際には、それを証明する努力をしなくても ASCII 文字しかないことを知っているのは非常に一般的です (たとえば、文字列化された形式には数字、句読点、およびおそらく短い ASCII 名しかありません;-) 「ただの」アプローチに直接移行するのが非常に一般的__str__です (しかし、私が一緒に働いていたプログラミング チームがそれを回避するためのローカル ガイドラインを提案した場合、これらの問題で間違いを犯しやすいため、私はその提案に +1 します。 「時期尚早の最適化は、プログラミングにおけるすべての悪の根源です」;-)。

于 2009-08-20T16:04:22.390 に答える
15

世界が狭くなるにつれて、遭遇する文字列には最終的に Unicode が含まれる可能性があります。したがって、新しいアプリの場合は、少なくとも__unicode__(). オーバーライドも行うかどうか__str__()は、好みの問題です。

于 2009-08-20T16:00:08.137 に答える