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())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>>
Gördüğünüz gibi -- hiçbir fark yok ve sınıf ve nesnenin id
si 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())
<__main__.Sic object at 0x2617f0>
>>>
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 eval
in 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!
__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 "<stdin>", line 1, in <module>
File "<string>", line 1
w'o"w
^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
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çin
repr`'den farklıdır: bunun yerine daha uygun veya kısa bir temsil kullanılabilir.*"