2014-10-15 27 views
5

Basit bir sınıfı myattribute özniteliğinde hata ayıklamak istiyorum.str.format öğesini doğrudan '__repr__` olarak kullanabilir miyim?

class SimpleClass: 
    def __repr__(self): 
    return "{0.myattribute}".format(self) 

Biraz gereksiz hissediyor, bu yüzden doğrudan format kullanmayı tercih ediyorum: Böyle bir repr yöntemi oluşturmak

class SimpleClass: 
    __repr__ = "{0.myattribute}".format 

... ama bu bir IndexError: tuple index out of range başarısız olur. format'un self argümanına erişemediğini anlıyorum, ancak nedenini göremiyorum.

ben yanlış mı yapıyorum, bu CPython sınırlama – veya başka nedir?

+0

Bunu yapamazsınız '__repr__ = lambda self:" {0.myattribute} ". Format (self)' ama bence bir 'def' –

+2

notundan daha beter: bunu yapma. –

+1

El ışık açıklamanızın, muhtemelen ciltli ve ilişkisiz yöntemler arasındaki farkla ilgili olması gerektiğidir. – NPE

cevap

2

"{0.myattribute}".format önceden String nesnesi ("{0.myattribute}") ilişkili bir yöntemdir. Böylece çağıran kod, x.__repr__ (xSimpleClass örneğidir) aramaya çalıştığında, Python SimpleClass__repr__ özniteliğini bulur, ancak SimpleClass yöntemi olarak tanıyamaz - tanımlayıcı protokolü onurlandırılmaz (dize yöntemi __get__ özniteliği vardır).

Ben önceki sürümlerinde gerçek işlevi olması gerekiyordu yemin rağmen 3.4'de, bir lambda kullanarak çalışacaktır anlaşılmaktadır. functools.partial çalışmayacak. Ama yine de gerçekten gerçek bir işlev kullanmalısın. Üzgünüm, istediğiniz gibi DRY değil.

+1

Lambdas bunu 2.7 –

+0

'da yapabilir. Açıklama için teşekkürler, ama '__get__' argümantasyonundan emin misiniz? Bulduğumdan, '__self__' özniteliğiyle ilgilidir. Her neyse, neden böyle dizayn edilmiş bir yöntem bağlaması olduğuna dair biraz araştırma yapmalıyım. – emu

+0

Aha, gerçekten '__get__'. Sadece resmi belgelerde bulunmayan bir acayip, birkaç blog yazısı okumak zorunda kaldım. – emu

İlgili konular