SORU
17 EYLÜL 2009, PERŞEMBE


__Arasındaki fark__ __Python__ Xi str

Python __str__ __repr__ arasındaki fark nedir?

CEVAP
13 NİSAN 2010, Salı


Alex iyi özetlenebilir ancak, şaşırtıcı bir şekilde, çok kısa ve öz oldu.

İlk olarak, bana Alex sonrası ana noktaları tekrar edeyim:

  • Varsayılan uygulama işe yaramaz (sabit, ama evet olmaz bir düşünün)
  • 6* *hedef net
  • 7* *gol okunabilir
  • Kap __str__ bulunan nesneleri’ __repr__ kullanır

Varsayılan uygulama bir işe yaramaz

Bu Python öntanımlı ayarları oldukça yararlı olma eğilimindedir, çünkü çoğunlukla bir sürpriz oldu. Gibi davran ki: ancak, bu durumda, __repr__ için bir varsayılan sahip

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

çok tehlikeli olmuştur (örneğin, sonsuz özyineleme içine almak çok kolay eğer nesneleri referans birbirimizi). Dışarı Python polisler. __repr__ tanımlanmış ve __str__ değilse, nesne __str__=__repr__ sanki davranır. gerçek olan bir varsayılan olduğunu unutmayın:

Bunun anlamı, basit bir dille: sen uygulamak nesneyi anlamak için kullanılabilir __repr__ bir işlevsel olmalıdır hemen hemen her nesne. __str__ uyguluyor isteğe bağlı: eğer bir “baskı” (örneğin, rapor jeneratör tarafından kullanılan) işlevi. çok ihtiyacın varsa bunu

__repr__ hedefi net

Bana doğru söyle bakalım — hata olduğuna inanmıyorum. Gerçekten herhangi bir hata ayıklayıcı kullanmak için nasıl bilmiyorum, ve hiç bir zaman ciddiye kullanmış. Ayrıca, hata büyük hata temel doğası olduğuna inanıyorum — ben hata ayıklama hataları çoğu uzun zaman önce bir uzun, bir galaksinin çok uzakta oldu. Bu, dini şevk ile, günlüğü inanıyorum anlamına gelir. Oturum yangın ve unut server iyi herhangi bir sistemin can damarı. Belki bazı özel ambalajı, tüm ihtiyacınız olan bir proje . Python kolay oturum açmak için yapar:

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)

Ama son adımı her uygulamaya yararlı bir Xi, böyle bir kodu sadece çalışabilmesi için nesne emin olun. Bu yüzden” şey gelir: eğer her şeyi biliyorsun demektir eval(repr(c))==c, yeteri kadar bilgi varsa c hakkında bilinmesi gereken “eval Eğer o olmazsa, en azından bulanık bir şekilde yap. Eğer, c hakkında yeterli bilgiye zaten sahip olduğunuzdan emin olun. Ben genellikle eval gibi bir format kullanın: "MyClass(this=%r,that=%r)" % (self.this,self.that). O demek değil olabilir aslında inşa Sınıfım, ya da bu hakkı yapıcı argümanlar — ama yararlı bir form express “bu her şeyi bilmek bu örneği”.

Not: %r yukarıda %s kullandım. Sen her zaman __repr__ uygulama içinde repr() [veya %r karakter biçimlendirmesini kullanır] kullanmak istiyor, ya da Xi amacı yenerek. MyClass(3) MyClass("3") ayırt etmek mümkün olmak istiyorum.

__str__ amacı okunabilir

Özellikle, anlaşılır olması amaçlanmıştır — str(3)==str("3") dikkat edin. Size bir IP soyutlama, str gibi olan uygulamaya benzer şekilde, 192.168.1.1 gayet iyi. Zaman soyut bir tarih/uygularken, str olabilir "2010/4/12 15:35:22", vb. Amaç, bir kullanıcı, bir programcı değil, okumak istemezdi bir şekilde temsil etmektir. İşe yaramaz basamak kesip, başka bir sınıf gibi — uzun okunabilirlik desteklediği için, bu da bir gelişme.

Kap __str__ bulunan nesneleri kullanır’ __repr__

Bu şaşırtıcı görünüyor, değil mi? Okunabilir olur biraz, ama

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

? Çok değil. Özellikle, bir kap içinde dizeleri çok kolay dize gösterimine rahatsız bulur. Belirsizlik karşısında, unutma, Python tahmin cazibesine karşı koyar. Eğer bir liste yazdırırken yukarıdaki davranış istiyorsanız, sadece

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

(belki de sözlük hakkında ne yapacağımıza karar verebilirsiniz.

Özet

Herhangi bir sınıf için __repr__ uygulamak uygulamak. Bu ikinci doğa olmalıdır. Eğer okunabilirliği daha fazla belirsizlik lehine daha fazla yan tarafında hataları olan bir dize sürümü için yararlı olacağını düşünüyorsanız __str__ uygulamak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • pjtoohot

    pjtoohot

    15 NİSAN 2008
  • POGProductionz

    POGProductio

    27 NİSAN 2012