__Str__ ve __repr__ aras─▒ndaki fark?


Al─▒nan cevaba git


Aras─▒ndaki fark nedir __str__ ve __repr__ Python?


2515









Cevap say─▒s─▒n─▒ say: 22






Alex iyi ├Âzetledi, ancak ┼ča┼č─▒rt─▒c─▒ bir ┼čekilde ├žok ├Âzl├╝ idi.

├ľncelikle, Alex'in g├Ârevindeki ana noktalar─▒ tekrar etmeme izin verin :

  • Varsay─▒lan uygulama yarars─▒zd─▒r (olmayaca─č─▒n─▒ d├╝┼č├╝nmek zor, ama evet)
  • __repr__ ama├ž belirsiz olmak
  • __str__ ama├ž okunabilir olmak
  • Konteynerin __str__ i├žerdi─či nesneler __repr__

Varsay─▒lan uygulama i┼če yaramaz

Bu ├žo─čunlukla bir s├╝rprizdir, ├ž├╝nk├╝ Python'un varsay─▒lan ayarlar─▒ olduk├ža faydal─▒ olma e─čilimindedir. Bununla birlikte, bu durumda, a┼ča─č─▒daki __repr__ gibi davranacak bir temerr├╝de sahip olmak :

 return "%s(%r)" % (self.__class__, self.__dict__)
 

├žok tehlikeli olurdu (├Ârne─čin, nesneler birbirlerini referans al─▒rsa, sonsuz ├Âzyineleme yapmak i├žin ├žok kolay). Demek Python polis oldu. Do─čru olan bir varsay─▒lan oldu─čuna dikkat edin: __repr__ tan─▒mlanm─▒┼čsa ve __str__ de─čilse, nesne sanki davran─▒r __str__=__repr__ .

Bunun anlam─▒, basit bir ifadeyle: Uygulad─▒─č─▒n─▒z hemen hemen her nesne __repr__ , nesneyi anlamak i├žin kullan─▒┼čl─▒ bir i┼člevselli─če sahip olmal─▒d─▒r . Uygulama __str__ iste─če ba─čl─▒d─▒r: ÔÇťg├╝zel bask─▒ÔÇŁ i┼člevine ihtiyac─▒n─▒z varsa bunu yap─▒n (├Ârne─čin, bir rapor olu┼čturucu taraf─▒ndan kullan─▒l─▒r).

Amac─▒ __repr__ a├ž─▒k olmakt─▒r

D─▒┼čar─▒ ├ž─▒k─▒p s├Âyleyeyim - hata ay─▒klay─▒c─▒lara inanm─▒yorum. Herhangi bir hata ay─▒klay─▒c─▒s─▒n─▒ nas─▒l kullanaca─č─▒m─▒ ger├žekten bilmiyorum ve hi├ž bir zaman ciddiye almad─▒m. Ayr─▒ca, hata ay─▒klay─▒c─▒lardaki b├╝y├╝k hatan─▒n temel do─čalar─▒ oldu─čuna inan─▒yorum - hata ay─▒klad─▒─č─▒m ├žo─ču hata, ├žok uzun zaman ├Ânce, ├žok uzak bir galakside ger├žekle┼čti. Bu, dini h├╝rmetle, g├╝nl├╝─če kaydetmeye inand─▒─č─▒m anlam─▒na geliyor. G├╝nl├╝k kayd─▒, herhangi bir iyi ate┼č et ve unut sunucusu sisteminin can damar─▒d─▒r. Python, g├╝nl├╝─če kaydetmeyi kolayla┼čt─▒r─▒r: baz─▒ projeye ├Âzel sar─▒c─▒larla, ihtiyac─▒n─▒z olan tek ┼čey bir

 log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C ÔÇö using default", default_c)
 

Ancak son ad─▒m─▒ atman─▒z gerekir - uygulad─▒─č─▒n─▒z her nesnenin yararl─▒ bir repr oldu─čundan emin olun, b├Âylece b├Âyle bir kod ├žal─▒┼čabilir. Bu y├╝zden ÔÇťevalÔÇŁ meselesi ortaya ├ž─▒k─▒yor: e─čer yeterince bilginiz varsa eval(repr(c))==c , bu, bilmeniz gereken her ┼čeyi bildi─činiz anlam─▒na gelir c . Yeterince kolaysa, en az─▒ndan bulan─▒k bir ┼čekilde yap─▒n. De─čilse, c yine de yeterince bilgi edindi─činizden emin olun . Genellikle, bir de─čerlendirme benzeri bir formatta kullan─▒n: "MyClass(this=%r,that=%r)" % (self.this,self.that) . Bu asl─▒nda MyClass'─▒ olu┼čturabilece─činiz veya do─čru kurucu arg├╝manlar─▒ oldu─ču anlam─▒na gelmez - ama ÔÇťbu ├Ârnekle ilgili bilmeniz gereken her ┼čey budurÔÇŁ ifadesini ifade etmek i├žin yararl─▒ bir formdur.

Not: %r Yukar─▒da kullanm─▒┼čt─▒m %s . Uygulamada her zaman repr() [veya %r bi├žimlendirme karakterini, e┼čit olarak] kullanmak istersiniz veya __repr__ repr'in hedefine kar┼č─▒ koymu┼č olursunuz. Sen ay─▒rt edebilmek istiyorum MyClass(3) ve MyClass("3") .

Amac─▒ __str__ okunabilir olmak

Spesifik olarak, kesin olmas─▒ ama├žlanmad─▒ - buna dikkat edin str(3)==str("3") . Ayn─▒ ┼čekilde, bir IP soyutlamas─▒ uygularsan─▒z, bunun 192.168.1.1 gibi g├Âr├╝nmesi iyi olur. Bir tarih / saat soyutlamas─▒ uygularken, str "2010/4/12 15:35:22", vb. Olabilir. Ama├ž, bir programc─▒n─▒n de─čil, bir kullan─▒c─▒n─▒n onu okumak isteyece─či ┼čekilde g├Âsterilmesidir. Faydas─▒z rakamlar─▒ kesin, ba┼čka bir s─▒n─▒f gibi g├Âr├╝n├╝n - okunabilirli─či destekledi─či s├╝rece, bir geli┼čmedir.

Konteynerin __str__ i├žerdi─či nesneler __repr__

Bu ┼ča┼č─▒rt─▒c─▒ g├Âr├╝n├╝yor, de─čil mi? Biraz, ama ne kadar okunabilir

 [moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]
 

olabilir mi? ├çok de─čil. Spesifik olarak, bir konteyn─▒r i├žindeki dizgiler, dizgi g├Âsterimini bozman─▒n ├žok kolay olaca─č─▒n─▒ g├Ârecektir. Belirsizlik kar┼č─▒s─▒nda, unutmay─▒n, Python, tahmin etme e─čilimine direnir. Bir listeyi yazd─▒r─▒rken yukar─▒daki davran─▒┼č─▒ istiyorsan─▒z, sadece

 print "[" + ", ".join(l) + "]"
 

(muhtemelen s├Âzl├╝kler hakk─▒nda ne yapaca─č─▒n─▒z─▒ da ├ž├Âzebilirsiniz.

├Âzet

Uygulamak __repr__ uygulamak herhangi bir s─▒n─▒f i├žin. Bu ikinci do─ča olmal─▒. __str__ Okunabilirlik taraf─▒nda olan bir dize s├╝r├╝m├╝ne sahip olman─▒n yararl─▒ olaca─č─▒n─▒ d├╝┼č├╝n├╝yorsan─▒z uygulay─▒n .


2561







Temel kural: __repr__ geli┼čtiriciler i├žindir, __str__ m├╝┼čteriler i├žindir.


471







Aksi halde emin olmak i├žin harekete ge├žmedi─činiz s├╝rece, ├žo─ču s─▒n─▒f─▒n ikisinde 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 - fark yok, s─▒n─▒f ve nesnenin ├Âtesinde bilgi yok id . Sadece ikisinden 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, ge├žersiz k─▒ld─▒─č─▒n─▒zda __repr__ , ALSO __str__ bunun i├žin kullan─▒l─▒r , ancak bunun tersi ge├žerli de─čildir.

Bilmeniz gereken di─čer ├Ânemli bilgiler: __str__ yerle┼čik bir kapta i├žerdi─či e┼čyalar i├žin __repr__ , DE─×─░L kullan─▒l─▒r __str__ . Ayr─▒ca, konuyla ilgili tipik dok├╝manlardaki kelimelere ra─čmen, hi├ž kimse __repr__ nesnelerin nesnelerini yapmay─▒ eval e┼čit bir nesne olu┼čturmak i├žin kullan─▒labilecek bir dize haline getirmeyi zorla┼čt─▒r─▒yor (bu ├žok zor, VE ilgili mod├╝l├╝n ger├žekte nas─▒l i├že aktar─▒ld─▒─č─▒n─▒ bilmemek ger├žekten zor. imkans─▒z d├╝md├╝z).

├ľyleyse tavsiyem: __str__ Makul olarak insan taraf─▒ndan okunabilir hale gelmeye ve m├╝mk├╝n __repr__ oldu─ču kadar belirsiz __repr__ olmaya odaklan─▒n, bu , elde edilemez de─čerin girilen de─čer olarak kabul edilebilir hale getirilmesinde bulan─▒k ula┼č─▒lamaz hedefine m├╝dahale etse bile __eval__ !


377







__repr__ : python nesnesinin temsili, genellikle eval, onu tekrar o nesneye ├ževirir.

__str__ : ne d├╝┼č├╝n├╝yorsun o nesne metin bi├žiminde

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

158


2009-09-17





K─▒sacas─▒, hedefi __repr__ a├ž─▒k ve __str__ okunakl─▒ olmakt─▒r.

─░┼čte g├╝zel bir ├Ârnek:

 >>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2012-03-14 09:21:58.130922'
>>> repr(today)
'datetime.datetime(2012, 3, 14, 9, 21, 58, 130922)'
 

Repr i├žin bu belgeleri okuyun:

repr(object)

Bir nesnenin yazd─▒r─▒labilir g├Âsterimini i├žeren bir dize d├Ând├╝r. Bu, d├Ân├╝┼č├╝mler taraf─▒ndan ├╝retilen ayn─▒ de─čerdir (ters t─▒rnak). Bu i┼čleme s─▒radan bir i┼člev olarak eri┼čebilmek bazen yararl─▒ olabilir. Bir├žok t├╝r i├žin, bu i┼člev, iletildi─činde ayn─▒ de─čere sahip bir nesneyi veren bir dize d├Ând├╝rme giri┼čiminde bulunur eval() ; aksi halde g├Âsterim, ek t├╝r bilgilerle birlikte nesnenin t├╝r├╝n├╝n ad─▒n─▒ i├žeren a├ž─▒l─▒ ayra├žlar i├žine al─▒nm─▒┼č bir dizedir. genellikle nesnenin ad─▒ ve adresi dahil. Bir s─▒n─▒f, bir __repr__() metot tan─▒mlayarak bu fonksiyonun ├Ârnekleri i├žin neyin d├Ând├╝─č├╝n├╝ kontrol edebilir .

─░┼čte str belgeleri:

str(object='')

Bir nesnenin yazd─▒r─▒labilir g├Âsterimini i├žeren bir dize d├Ând├╝r. Dizeler i├žin bu, dizenin kendisini d├Ând├╝r├╝r. ─░le fark─▒ repr(object) D─░R str(object) her zaman kabul edilebilir bir dize d├Ând├╝r├╝r etmeye ├žal─▒┼čmaz eval() ; amac─▒ yazd─▒r─▒labilir bir dize d├Ând├╝rmektir. E─čer arg├╝man verilmezse, bo┼č dizgeyi d├Ând├╝r├╝r '' .


141







Aras─▒ndaki fark nedir __str__ ve __repr__ Python?

__str__ ("dunder (├žift alt ├žizgi) dize" __repr__ olarak okunur ) ve ("dunder-repper" olarak okunur ("g├Âsterim" i├žin)), nesnenin durumuna g├Âre dizeleri d├Ând├╝ren ├Âzel y├Ântemlerdir.

__repr__ __str__ eksikse yedekleme davran─▒┼č─▒ sa─člar .

├ľyleyse, ├Ânce bir Python kabu─čundaki karakter karakterine yazarak veya onu __repr__ kullanarak, d├Ând├╝rd├╝─č├╝ dizeden e┼čde─čer bir nesneyi eski haline getirmenize izin veren bir yaz─▒ yazmal─▒s─▒n─▒z eval .

Herhangi bir zamanda, __str__ gerekli oldu─čuna inan─▒ld─▒─č─▒nda, kullan─▒c─▒ taraf─▒ndan okunabilen bir dize temsili i├žin bir ki┼či yazabilir .

__str__

Bir nesneyi yazd─▒rmak veya ba┼čar─▒l─▒ olursa etmek format , str.format ya da str , bir o zaman __str__ y├Ântem tan─▒mlan─▒r, bu y├Ântem ad─▒ verilecek, aksi takdirde __repr__ kullan─▒lacakt─▒r.

__repr__

Bu __repr__ y├Ântem yerle┼čik i┼člev taraf─▒ndan ├ža─čr─▒l─▒r repr ve bir nesneyi d├Ând├╝ren bir ifadeyi de─čerlendirirken python kabu─čunuzda yank─▒lanan ┼čeydir.

Bunun i├žin bir yedekleme sa─člad─▒─č─▒ndan __str__ , yaln─▒zca bir tane yazabiliyorsan─▒z, __repr__

─░┼čte yerle┼čik yard─▒m repr :

 repr(...)
    repr(object) -> string

    Return the canonical string representation of the object.
    For most object types, eval(repr(object)) == object.
 

Yani, ├žo─ču nesne i├žin, neyin bas─▒ld─▒─č─▒n─▒ yazd─▒─č─▒n─▒zda repr , e┼čde─čer bir nesne yaratabilmelisiniz. Ancak bu varsay─▒lan uygulama de─čildir.

Varsay─▒lan Uygulamas─▒ __repr__

Varsay─▒lan nesne __repr__ ┼čudur ( C Python kayna─č─▒ ) ┼čunun gibi:

 def __repr__(self):
    return '<{0}.{1} object at {2}>'.format(
      self.__module__, type(self).__name__, hex(id(self)))
 

Bu, varsay─▒lan olarak nesnenin bulundu─ču mod├╝l├╝, s─▒n─▒f ad─▒n─▒ ve haf─▒zas─▒ndaki konumunun onalt─▒l─▒k g├Âsterimini yazd─▒raca─č─▒n─▒z anlam─▒na gelir - ├Ârne─čin:

 <__main__.Foo object at 0x7f80665abdd0>
 

Bu bilgi ├žok kullan─▒┼čl─▒ de─čildir, ancak verilen herhangi bir vakan─▒n kanonik bir sunumunu nas─▒l do─čru bir ┼čekilde olu┼čturabilece─čimizi t├╝retmenin bir yolu yoktur ve en az─▒ndan bize haf─▒zada benzersiz bir ┼čekilde nas─▒l tan─▒mlayabilece─čimizi bize s├Âyler.

Nas─▒l __repr__ faydal─▒ olabilirim ?

Python kabu─čunu ve datetime nesnelerini kullanarak ne kadar yararl─▒ olabilece─čine bakal─▒m . ─░lk ├Ânce datetime mod├╝l├╝ i├že aktarmam─▒z gerekiyor :

 import datetime
 

datetime.now Kabu─ču ├ža─č─▒r─▒rsak , e┼čde─čer bir datetime nesnesini yeniden olu┼čturmak i├žin gereken her ┼čeyi g├Ârece─čiz. Bu tarih saat taraf─▒ndan olu┼čturulur __repr__ :

 >>> datetime.datetime.now()
datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)
 

Bir datetime nesnesi basarsak g├╝zel bir insan okunabilir (asl─▒nda, ISO) format─▒ g├Âr├╝r├╝z. Bu datetime taraf─▒ndan uygulanmaktad─▒r __str__ :

 >>> print(datetime.datetime.now())
2015-01-24 20:05:44.977951
 

Kaybetti─čimiz nesneyi yeniden olu┼čturmak i├žin basit bir meseledir ├ž├╝nk├╝ __repr__ ├ž─▒kt─▒dan kopyalay─▒p yap─▒┼čt─▒rarak de─či┼čkene atamad─▒k ve sonra onu yazd─▒rd─▒k ve di─čer nesneyle ayn─▒ okunabilir ├ž─▒kt─▒ya ald─▒k:

 >>> the_past = datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)
>>> print(the_past)
2015-01-24 20:05:36.491180
 

Onlar─▒ nas─▒l uygular─▒m?

Geli┼čirken, m├╝mk├╝nse, ayn─▒ durumdaki nesneleri ├žo─čaltmak isteyeceksiniz. Bu, ├Ârne─čin, datetime nesnesinin nas─▒l tan─▒mland─▒─č─▒ __repr__ ( Python kayna─č─▒ ). B├Âyle bir nesneyi ├žo─čaltmak i├žin gerekli t├╝m ├Âzniteliklerden dolay─▒ olduk├ža karma┼č─▒kt─▒r:

 def __repr__(self):
    """Convert to formal string, for repr()."""
    L = [self._year, self._month, self._day,  # These are never zero
         self._hour, self._minute, self._second, self._microsecond]
    if L[-1] == 0:
        del L[-1]
    if L[-1] == 0:
        del L[-1]
    s = "%s.%s(%s)" % (self.__class__.__module__,
                       self.__class__.__qualname__,
                       ", ".join(map(str, L)))
    if self._tzinfo is not None:
        assert s[-1:] == ")"
        s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"
    if self._fold:
        assert s[-1:] == ")"
        s = s[:-1] + ", fold=1)"
    return s
 

Nesnenizin daha insan taraf─▒ndan okunabilir bir temsiline sahip olmas─▒n─▒ istiyorsan─▒z, daha __str__ sonra uygulayabilirsiniz . Datetime nesnesinin ( Python kayna─č─▒ ) __str__ , ISO bi├žiminde g├Âr├╝nt├╝lemek i├žin zaten bir i┼člevi oldu─čundan, kolayca ger├žekle┼čtirdi─či:

 def __str__(self):
    "Convert to string, for str()."
    return self.isoformat(sep=' ')
 

Ayarlad─▒n __repr__ = __str__ m─▒?

Bu, burada ayar yap─▒lmas─▒n─▒ ├Âneren ba┼čka bir cevab─▒n ele┼čtirisidir __repr__ = __str__ .

Ayar __repr__ = __str__ aptalca - ve bir hata ay─▒klama geli┼čtiricilerin kullan─▒m─▒ i├žin yaz─▒lm─▒┼č __repr__ bir geri d├Ân├╝┼č, bir yazmadan ├Ânce yaz─▒lmal─▒d─▒r . __str__ __repr__ __str__

Bir ihtiya├ž __str__ nesnenin metin bi├žimini gerekti─činde sadece.

Sonu├ž

__repr__ Yazd─▒─č─▒n─▒z nesneleri tan─▒mlay─▒n , b├Âylece siz ve di─čer geli┼čtiricilerin, onu geli┼čtirirken kullan─▒rken tekrarlanabilir bir ├Ârne─če sahip olacaks─▒n─▒z. __str__ Bir insan okunabilir dize temsili gerekti─činde tan─▒mlay─▒n .


107







Verilen t├╝m cevaplar─▒n yan─▒ s─▒ra, birka├ž puan eklemek istiyorum: -

1) __repr__() sadece interaktif python konsoluna nesnenin ad─▒n─▒ yaz─▒p enter tu┼čuna bast─▒─č─▒n─▒zda ├ža─čr─▒l─▒r.

2) __str__() print c├╝mlesiyle nesneyi kulland─▒─č─▒n─▒zda ├ža─čr─▒l─▒r.

3) __str__ Eksikse, o zaman yazd─▒r─▒n ve nesnenin str() ├ža─čr─▒c─▒lar─▒n─▒ kullanarak herhangi bir i┼člevi kullan─▒n __repr__() .

4) __str__() konteynerlerin, ├ža─čr─▒ld─▒─č─▒nda __repr__() i├žerdi─či elementlerin y├Ântemini uygulayacakt─▒r.

5) str() i├žinde ├ža─čr─▒lan __str__() potansiyel olarak temel bir durum olmadan tekrarlanabilir ve maksimum tekrarlama derinli─činde hata olabilir.

6) __repr__() arayabilir repr() ile ├Ânceden temsil nesne yerine, otomatik olarak sonsuz ├Âzyinelemeye ├Ânlemek i├žin ├žal─▒┼čacakt─▒r olan ... .


25







Python'un Hans Petter Langtangen taraf─▒ndan hesaplamal─▒ bilim i├žin yazd─▒─č─▒ kitab─▒n 358. sayfas─▒nda a├ž─▒k├ža belirtildi─či gibi

  • __repr__ Nesnenin tam bir dize g├Âsterimi de ama├žlar─▒;
  • __str__ Bask─▒ i├žin g├╝zel bir dize d├Ând├╝rmektir.

Bu y├╝zden onlar─▒ olarak anlamay─▒ tercih ederim.

  • repr = ├žo─čalt
  • str = string (g├Âsterim)

Kullan─▒c─▒n─▒n bak─▒┼č a├ž─▒s─▒na g├Âre bu python ├Â─črenirken yapt─▒─č─▒m bir yanl─▒┼č anlama olmas─▒na ra─čmen.

Ayn─▒ sayfada ayn─▒ zamanda k├╝├ž├╝k ama iyi bir ├Ârnek verilmi┼čtir:

├ľrnek

 In [38]: str('s')
Out[38]: 's'

In [39]: repr('s')
Out[39]: "'s'"

In [40]: eval(str('s'))
Traceback (most recent call last):

  File "<ipython-input-40-abd46c0c43e7>", line 1, in <module>
    eval(str('s'))

  File "<string>", line 1, in <module>

NameError: name 's' is not defined


In [41]: eval(repr('s'))
Out[41]: 's'
 

22







T├╝m d├╝r├╝stl├╝kte, eval(repr(obj)) asla kullan─▒lmaz. Kendinizi kullanmay─▒ bulursan─▒z, durmal─▒s─▒n─▒z, ├ž├╝nk├╝ eval tehlikelidir ve dizeler nesnelerinizi serile┼čtirmek i├žin ├žok yetersiz bir yoldur ( pickle bunun yerine kullan─▒n).

Bu nedenle, ayar tavsiye ederim __repr__ = __str__ . Sebebi elementlerin str(list) ├ža─čr─▒lmas─▒d─▒r repr (bunu Python 3 taraf─▒ndan ele al─▒nmam─▒┼č en b├╝y├╝k tasar─▒m hatalar─▒ndan biri olarak g├Âr├╝yorum). Bir ger├žek repr muhtemelen ├ž─▒kt─▒s─▒ olarak ├žok yararl─▒ olmayacakt─▒r print [your, objects] .

Bunu nitelemek i├žin, benim tecr├╝beme g├Âre, repr i┼člevin en yararl─▒ kullan─▒m durumu ba┼čka bir dizgenin i├žine bir dizge koymakt─▒r (dize bi├žimlendirme kullanarak). Bu ┼čekilde, ka├žan t─▒rnak veya ba┼čka bir ┼čey i├žin endi┼čelenmenize gerek yok. Ama eval burada olmad─▒─č─▒na dikkat edin .


12







Basit├že s├Âylemek gerekirse:

__str__ , ba┼čkalar─▒ taraf─▒ndan kolayca okunmas─▒ i├žin nesnenizin bir dize g├Âsterimini g├Âstermek i├žin kullan─▒l─▒r .

__repr__ bir dize temsilini g├Âstermek i├žin kullan─▒l─▒r nesne.

Diyelim ki Fraction kesirin dize g├Âsteriminin '(1/2)' ve nesnenin (Kesir s─▒n─▒f─▒) 'Kesir (1,2)' olarak g├Âsterilece─či bir s─▒n─▒f olu┼čturmak istiyorum.

B├Âylece basit bir kesir s─▒n─▒f─▒ olu┼čturabiliriz:

 class Fraction:
    def __init__(self, num, den):
        self.__num = num
        self.__den = den

    def __str__(self):
        return '(' + str(self.__num) + '/' + str(self.__den) + ')'

    def __repr__(self):
        return 'Fraction (' + str(self.__num) + ',' + str(self.__den) + ')'



f = Fraction(1,2)
print('I want to represent the Fraction STRING as ' + str(f)) # (1/2)
print('I want to represent the Fraction OBJECT as ', repr(f)) # Fraction (1,2)
 

11


2016-01-12





G├Ânderen bir (An resmi olmayan) Python Referans Wiki (ar┼čiv kopya) effbot taraf─▒ndan:

__str__ " bir nesnenin" gayri resmi "dize g├Âsterimini hesaplar. Bu __repr__ , ge├žerli bir Python ifadesi olmas─▒ gerekmedi─činden farkl─▒d─▒r : bunun yerine daha uygun veya k─▒sa bir g├Âsterim kullan─▒labilir. "


10







Di─čer cevaplarda eksik olan bir y├Ân. Genelde modelin do─čru oldu─ču do─črudur:

  • Hedef __str__ : ─░nsan taraf─▒ndan okunabilir
  • Amac─▒ __repr__ : belirsiz, muhtemelen makineden okunabilir eval

Ne yaz─▒k ki, Python REPL ve ayr─▒ca IPython __repr__ bir REPL konsolundaki nesneleri basmak i├žin kulland─▒─č─▒ i├žin bu farkl─▒la┼čma kusurludur ( Python ve IPython ile ilgili sorulara bak─▒n─▒z ). Bu nedenle, etkile┼čimli konsol ├žal─▒┼čmas─▒ i├žin hedeflenen projeler (├Ârne─čin, Numpy veya Pandalar) yukar─▒daki kurallar─▒ g├Ârmezden gelmeye ve __repr__ bunun yerine insan taraf─▒ndan okunabilir bir uygulama sa─člamaya ba┼člad─▒ .


7







str - Verilen nesneden yeni bir dize nesnesi olu┼čturur.

repr - Nesnenin kurall─▒ dize temsilini d├Ând├╝r├╝r.

Farkl─▒l─▒klar:

str ():

  • nesneyi okunabilir hale getirir
  • son kullan─▒c─▒ i├žin ├ž─▒kt─▒ ├╝retir

Repr ():

  • nesne ├╝reten kod gerekiyor
  • geli┼čtirici i├žin ├ž─▒kt─▒ ├╝retir

6







Fluent Python kitab─▒ndan :

Bir Python nesnesi i├žin temel bir gereksinim, biri hata ay─▒klamak ve g├╝nl├╝─če kaydetmek i├žin kullan─▒lan, di─čeri son kullan─▒c─▒lara sunulacak ┼čekilde kullan─▒labilir dize g├Âsterimleri sa─člamakt─▒r. Bu y├╝zden veri modelinde
├Âzel y├Ântemler __repr__ ve __str__ varl─▒klar var.


5







M├╝kemmel cevaplar __str__ ve __repr__ benim i├žin aras─▒ndaki fark─▒ , benim i├žin bir ├Âncekinin son kullan─▒c─▒lar taraf─▒ndan bile okunabilece─či ve ikincisi geli┼čtiriciler i├žin m├╝mk├╝n oldu─ču kadar kullan─▒┼čl─▒ hale getirdi─či i├žin. Buna g├Âre, varsay─▒lan uygulaman─▒n __repr__ genellikle bu hedefe ula┼čmak i├žin ba┼čar─▒s─▒z oldu─čunu, ├ž├╝nk├╝ geli┼čtiriciler i├žin yararl─▒ olan bilgileri ihmal etti─čini d├╝┼č├╝n├╝yorum.

Bu nedenle, yeterince basit bir __str__ ┼čeye sahipsem, genellikle sadece ┼ču iki d├╝nyan─▒n en iyisini almaya ├žal─▒┼č─▒yorum:

 def __repr__(self):
    return '{0} ({1})'.format(object.__repr__(self), str(self))
 

4







Ak─▒lda tutulmas─▒ gereken ├Ânemli bir ┼čey, konteynerin __str__ kullan─▒m─▒n─▒n nesneleri i├žerdi─čidir __repr__ .

 >>> from datetime import datetime
>>> from decimal import Decimal
>>> print (Decimal('52'), datetime.now())
(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 51, 26, 185000))
>>> str((Decimal('52'), datetime.now()))
"(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 52, 22, 176000))"
 

Python okunabilirli─či ├╝zerinde net g├Âsterilmesini yana , __str__ bir ├ža─čr─▒ tuple ├ža─čr─▒lar─▒ bulunan nesneleri __repr__ , 'resmi' bir nesnenin temsili. Resmi temsili gayri resmi olandan daha zor okumakla birlikte, belirsizdir ve b├Âceklere kar┼č─▒ daha sa─člamd─▒r.


3







K─▒saca:

 class Demo:
  def __repr__(self):
    return 'repr'
  def __str__(self):
    return 'str'

demo = Demo()
print(demo) # use __str__, output 'str' to stdout

s = str(demo) # __str__ is used, return 'str'
r = repr(demo) # __repr__ is used, return 'repr'

import logging
logger = logging.getLogger(logging.INFO)
logger.info(demo) # use __str__, output 'str' to stdout

from pprint import pprint, pformat
pprint(demo) # use __repr__, output 'repr' to stdout
result = pformat(demo) # use __repr__, result is string which value is 'str'
 

3







 >>> print(decimal.Decimal(23) / decimal.Decimal("1.05"))
21.90476190476190476190476190
>>> decimal.Decimal(23) / decimal.Decimal("1.05")
Decimal('21.90476190476190476190476190')
 

Ne zaman print() bir sonucu olarak adland─▒r─▒l─▒r decimal.Decimal(23) / decimal.Decimal("1.05") ham say─▒ bas─▒l─▒r; Bu ├ž─▒kt─▒ ile elde edilebilir dize bi├žimindedir __str__() . Basit├že ifadeye girersek bir decimal.Decimal ├ž─▒kt─▒ elde ederiz - bu ├ž─▒kt─▒ elde edilebilecek temsil bi├žimindedir __repr__() . T├╝m Python nesnelerinin iki ├ž─▒k─▒┼č formu vard─▒r. Dize formu insan taraf─▒ndan okunabilecek ┼čekilde tasarlanm─▒┼čt─▒r. Temsil formu, bir Python yorumlay─▒c─▒s─▒na beslendi─činde (m├╝mk├╝n oldu─čunda) temsil edilen nesneyi ├žo─čaltaca─č─▒ ├ž─▒kt─▒ ├╝retmek ├╝zere tasarlanm─▒┼čt─▒r.


3







Onlar─▒ anlay─▒n __str__ ve __repr__ sezgisel ve kal─▒c─▒ olarak ay─▒rt edin.

__str__ g├Âzlerin okunabilmesi i├žin verilen nesnenin k─▒l─▒k de─či┼čtirmi┼č g├Âvdesinin belirli bir nesnenin
__repr__ ger├žek beden g├Âvdesinin (kendi kendine d├Ând├╝─č├╝n├╝n), tan─▒mlanamayan bir ┼čekilde tan─▒mlanmas─▒ i├žin d├Ând├╝r├╝lmesi.

Bir ├Ârnekte g├Âr├╝n

 In [30]: str(datetime.datetime.now())
Out[30]: '2017-12-07 15:41:14.002752'
Disguised in string form
 

Benzer __repr__

 In [32]: datetime.datetime.now()
Out[32]: datetime.datetime(2017, 12, 7, 15, 43, 27, 297769)
Presence in real body which allows to be manipulated directly.
 

__repr__ Sonu├žlarda aritmetik i┼člemi rahatl─▒kla yapabiliriz.

 In [33]: datetime.datetime.now()
Out[33]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521)
In [34]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521) - datetime.datetime(2
    ...: 017, 12, 7, 15, 43, 27, 297769)
Out[34]: datetime.timedelta(0, 222, 443752)
 

i┼člemi uygularsan─▒z __str__

 In [35]: '2017-12-07 15:43:14.002752' - '2017-12-07 15:41:14.002752'
TypeError: unsupported operand type(s) for -: 'str' and 'str'
 

Hata d─▒┼č─▒nda hi├žbir ┼čey d├Ând├╝rmez.

Ba┼čka bir ├Ârnek.

 In [36]: str('string_body')
Out[36]: 'string_body' # in string form

In [37]: repr('real_body')
Out[37]: "'real_body'" #its real body hide inside
 

Umar─▒m bu, daha fazla cevap bulmak i├žin somut bir temel olu┼čturman─▒za yard─▒mc─▒ olur.


2







__repr__ print ve str y├Ântemleri d─▒┼č─▒nda her yerde kullan─▒l─▒r (a __str__ tan─▒mland─▒─č─▒nda!)


1







  1. __str__ string nesnesini d├Ând├╝rmek gerekir, ancak __repr__ herhangi bir python ifadesini d├Ând├╝r├╝r.
  2. E─čer __str__ uygulama daha sonra eksik olan __repr__ i┼člev yedek olarak kullan─▒l─▒r. __repr__ ─░┼člev uygulamas─▒ eksikse geri d├Ân├╝┼č yoktur .
  3. E─čer __repr__ fonksiyon nesnenin String g├Âsterimini d├Ând├╝r├╝yorsa, __str__ fonksiyonun uygulanmas─▒n─▒ atlayabiliriz .

Kaynak: https://www.journaldev.com/22460/python-str-repr-functions


0







__str__ ├ža─čr─▒larak bir nesneye ├ža─čr─▒labilir str(obj) ve insan taraf─▒ndan okunabilir bir dize d├Ând├╝rmelidir.

__repr__ ├ža─čr─▒larak bir nesneye ├ža─čr─▒labilir repr(obj) ve dahili nesneyi d├Ând├╝rmelidir (nesne alanlar─▒ / ├Âznitelikleri)

Bu ├Ârnek yard─▒mc─▒ olabilir:

 class C1:pass

class C2:        
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")

class C3:        
    def __repr__(self):        
         return str(f"{self.__class__.__name__} class repr")

class C4:        
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")
    def __repr__(self):        
         return str(f"{self.__class__.__name__} class repr")


ci1 = C1()    
ci2 = C2()  
ci3 = C3()  
ci4 = C4()

print(ci1)       #<__main__.C1 object at 0x0000024C44A80C18>
print(str(ci1))  #<__main__.C1 object at 0x0000024C44A80C18>
print(repr(ci1)) #<__main__.C1 object at 0x0000024C44A80C18>
print(ci2)       #C2 class str
print(str(ci2))  #C2 class str
print(repr(ci2)) #<__main__.C2 object at 0x0000024C44AE12E8>
print(ci3)       #C3 class repr
print(str(ci3))  #C3 class repr
print(repr(ci3)) #C3 class repr
print(ci4)       #C4 class str 
print(str(ci4))  #C4 class str 
print(repr(ci4)) #C4 class repr
 

0



─░lgili yay─▒nlar


Neden null bir nesnedir ve null ile undefined aras─▒ndaki fark nedir?

<b> ve <strong>, <i> ve <em> aras─▒ndaki fark nedir?

Ne sebep olur ve NoClassDefFoundError ve ClassNotFoundException aras─▒ndaki farklar nelerdir?

Typeof ve instanceof aras─▒ndaki fark nedir ve biri di─čerine ne zaman kullan─▒lmal─▒d─▒r?

Map ve flatMap ve her biri i├žin iyi bir kullan─▒m durumu aras─▒ndaki fark nedir?

Read () ve recv () ile ve G├Ânderen () ve write () Aras─▒ndaki Fark Nedir?

Yineleyici ile yinelenebilir aras─▒ndaki fark nedir ve nas─▒l kullan─▒l─▒r?

$ .Ajax () ve $ .get () ve $ .load () aras─▒ndaki fark

CSS'de id ve class aras─▒ndaki fark ve ne zaman kullan─▒laca─č─▒ [duplicate]

Xcode4'te ├žer├ževe ile statik kitapl─▒k aras─▒ndaki fark ve bunlar─▒n nas─▒l aranaca─č─▒

Etiketle ilgili di─čer sorular [python]


ÔÇŽ De─čerlerine gir (SELECTÔÇŽ FROMÔÇŽ)

JavaScriptÔÇÖte bir ad alan─▒n─▒ nas─▒l ilan ederim?

Rasgele alfan├╝merik dizeleri nas─▒l olu┼čturabilirim?

Kavanoza maven 2 build classpath ├╝r├╝n├╝n├╝ kurmadan ekleyebilir miyim?

Yararl─▒ Eclipse Java kodu ┼čablonlar─▒ aran─▒yor [kapal─▒]

Yaz─▒l─▒m lisans anahtarlar─▒ nas─▒l olu┼čturulur?

Neden super.super.method (); JavaÔÇÖya izin verilmiyor mu?

Yakuttaki bir nesnenin t├╝r├╝n├╝ belirleme

DateTimeÔÇÖda saat nas─▒l de─či┼čtirilir?

ASP.NET Razor'da HTML.ActionLink ve Url.Action