2014-10-15 35 views
5

Powiedz, że chcę debugować prostą klasę z atrybutem myattribute. Tworzę metodę repr tak:Jak mogę użyć `str.format` bezpośrednio jako` __repr__`?

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

Czuje się nieco zbędny, więc wolałbym użyć format bezpośrednio:

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

... ale to nie z IndexError: tuple index out of range. Rozumiem, że format nie może uzyskać dostępu do argumentu self, ale nie widzę powodu.

Czy robię coś złego, czy jest to ograniczenie CPython – lub co jeszcze?

+0

Można to zrobić "__repr__ = lambda self:" {0.myattribute} ".format (self)' ale myślę, że jest gorszy niż 'def' –

+2

uwaga: nie rób tego. –

+1

Moje wyjaśnienie rączki ręki polega na tym, że prawdopodobnie ma to związek z różnicą między metodami związanymi i niezwiązanymi. – NPE

Odpowiedz

2

"{0.myattribute}".format jest już związaną metodą na obiekcie tekstowym ("{0.myattribute}"). Tak więc, gdy kod wywołujący próbuje wyszukać, powiedzmy, x.__repr__ (gdzie x jest instancją SimpleClass), Python znajduje atrybut __repr__ z SimpleClass, ale nie może rozpoznać go jako metoda SimpleClass - protokół deskryptora nie jest honorowany (metoda łańcuchowa nie ma atrybutu __get__).

Wygląda na to, że w wersji 3.4 będzie działał kod lambda, chociaż mógłbym przysiąc, że musi to być prawdziwa funkcja w poprzednich wersjach. functools.partial nie będzie działać. Ale tak naprawdę powinieneś używać prawdziwej funkcji. Przepraszam, że nie jest tak SUCHA, jak byś chciał.

+1

Lambdas może to zrobić w 2.7 –

+0

Dzięki za wyjaśnienie, ale czy jesteś pewny z argumentacją "__get__"? Z tego, co znalazłem, wiąże się z atrybutem "__self__". W każdym razie, będę musiał zrobić kilka badań na temat, dlaczego metoda jest tak zaprojektowana. – emu

+0

Aha, to naprawdę '__get__'. Szkoda tylko, że nie jest to w oficjalnej dokumentacji, musiałem przeczytać kilka blogów. – emu