str__ ve __repr__ arasındaki fark nedir?

Python'da __str__ ve __repr__ arasındaki fark nedir?

Aksini sağlamak için özel olarak hareket etmediğiniz sürece, çoğu sınıfın her ikisi için de yararlı sonuçları yoktur:

>>> class Sic(object): pass
... 
>>> print str(Sic())

>>> print repr(Sic())

>>> 

Gördüğünüz gibi -- hiçbir fark yok ve sınıf ve nesnenin idsi dışında hiçbir bilgi yok. Eğer ikisinden sadece birini geçersiz kılarsanız...:

>>> class Sic(object): 
...   def __repr__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())
foo
>>> class Sic(object):
...   def __str__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())

>>> 

Gördüğünüz gibi, eğer __repr__ geçersiz kılınırsa, __str__ için de kullanılır, ancak tersi geçerli değildir.

Bilinmesi gereken diğer önemli bilgiler: Yerleşik bir konteyner üzerindeki __str__, içerdiği öğeler için __str__ DEĞİL, __repr__ kullanır. Ve, tipik dokümanlarda bulunan konuyla ilgili kelimelere rağmen, neredeyse hiç kimse nesnelerin __repr__sini evalin eşit bir nesne oluşturmak için kullanabileceği bir dize yapmakla uğraşmaz (çok zor, VE ilgili modülün aslında nasıl içe aktarıldığını bilmemek aslında bunu imkansız kılar).

Bu nedenle, benim tavsiyem: __str__'yi makul ölçüde insan tarafından okunabilir hale getirmeye ve __repr__'yi olabildiğince açık hale getirmeye odaklanın; bu, __repr__'nin döndürdüğü değeri __eval__ için girdi olarak kabul edilebilir hale getirme gibi bulanık ve ulaşılamaz bir hedefe engel olsa bile!

Yorumlar (4)

__repr__: python nesnesinin temsili genellikle eval onu bu nesneye geri dönüştürecektir

__str__: metin biçiminde o nesne olduğunu düşündüğünüz şeydir

Örneğin.

>>> s="""w'o"w"""
>>> repr(s)
'\'w\\\'o"w\''
>>> str(s)
'w\'o"w'
>>> eval(str(s))==s
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    w'o"w
       ^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
Yorumlar (0)

effbot tarafından an (An Unofficial) Python Reference Wiki (archive copy) adresinden alınmıştır:

str"*bir nesnenin "gayri resmi" dize gösterimini hesaplar. Bu, geçerli bir Python ifadesi olması gerekmediği içinrepr`'den farklıdır: bunun yerine daha uygun veya kısa bir temsil kullanılabilir.*"

Yorumlar (1)