2014-10-15 23 views
5

dire che voglio eseguire il debug di una semplice classe con un attributo myattribute. Creo un metodo repr come questo:Come posso usare `str.format` direttamente come` __repr__`?

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

ci si sente un po 'ridondante, quindi io preferirei usare format direttamente:

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

... ma che non riesce con un IndexError: tuple index out of range. Capisco che che format non può accedere l'argomento self, ma non vedo il motivo.

sto facendo qualcosa di sbagliato, è questa una limitazione CPython – o che altro?

+0

Si potrebbe fare questo '__repr__ = auto lambda:" {0.myattribute} ". Format (self)' ma penso che sia peggio di un 'def' –

+2

nota: non farlo. –

+1

La mia spiegazione relativa alla movimentazione a mano è che probabilmente ha a che fare con la differenza tra i metodi legati e quelli non associati. – NPE

risposta

2

"{0.myattribute}".format è già un metodo associato sull'oggetto stringa ("{0.myattribute}"). Così, quando il codice chiamante tenta di guardare in alto, diciamo, x.__repr__ (dove x è un'istanza SimpleClass), Python Trova l'attributo __repr__ di SimpleClass, ma poi non può riconoscere come metodo SimpleClass - il protocollo descrittore non è onorato (il metodo di stringa non ha l'attributo __get__).

Sembra che in 3.4, utilizzando un lambda funzionerà, anche se avrei potuto giurare che doveva essere una funzione reale nelle versioni precedenti. functools.partial non funzionerà. Ma dovresti davvero usare una vera funzione comunque. Spiacente, non è ASCIUTTO come vorresti.

+1

Lambdas può farlo in 2.7 –

+0

Grazie per la spiegazione, ma sei sicuro dell'argomento '__get__'? Da quello che ho trovato, è correlato all'attributo '__self__'. Ad ogni modo, dovrò fare qualche ricerca sul perché il metodo è progettato in questo modo. – emu

+0

Aha, è davvero '__get__'. E 'solo un peccato che non sembra essere nella documentazione ufficiale, ho dovuto leggere qualche blogposts. – emu

Problemi correlati