Quando è l'uscita di utile Repr?
Domanda
Ho letto su repr
in Python. Mi chiedevo che cosa l'applicazione della produzione di repr
è. per es.
class A:
pass
repr(A) ='<class __main__.A at 0x6f570>'
b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
Quando sarebbe un essere interessato '<class __main__.A at 0x6f570>'
or'<__main__.A instance at 0x74d78>'
?
Soluzione
A volte si ha a che fare con o una stringa di byte come
bob2='bob\xf0\xa4\xad\xa2'
Se si stampa questo fuori (in Ubuntu) si ottiene
In [62]: print(bob2)
bob𤭢
, che non è molto utile per gli altri cercando di capire la stringa di byte. Nei commenti, John fa notare che in Windows, risultati print(bob2)
in qualcosa di simile bobð¤¢
. Il problema è che Python rileva la codifica predefinita della console / terminale e cerca di decodificare la stringa di byte in base a tale codifica. Dal momento che Ubuntu e Windows utilizza differenti codifiche predefinite (possibilmente utf-8
e cp1252
rispettivamente), risultati diversi derivarne.
Al contrario, il repr di una stringa è univoca:
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
Quando la gente postare domande qui su SO sulle stringhe di Python, sono spesso chiesto di mostrare il repr della stringa in modo che sappiamo per certo quale stringa di cui si occupano.
In generale, il repr dovrebbe essere una rappresentazione stringa univoca dell'oggetto. repr(obj)
chiama il metodo obj
del __repr__
dell'oggetto. Dal momento che nel tuo esempio il A
classe non ha un proprio metodo __repr__
, resort repr(b)
ad indicare l'indirizzo di classe e la memoria.
È possibile eseguire l'override del metodo __repr__
per dare informazioni più pertinenti.
Nel tuo esempio, '<__main__.A instance at 0x74d78>'
ci dice due cose utili:
- che
b
è un'istanza della classeA
nel__main__
namespace, - e che risiede in oggetto memoria all'indirizzo 0x74d78.
Si potrebbe, per esempio, hanno due istanze della classe A
. Se hanno lo stesso indirizzo di memoria allora si sarebbe sapere che stanno "puntano" per lo stesso oggetto sottostante. (Nota queste informazioni possono essere ottenute utilizzando id
).
Altri suggerimenti
Teoricamente, repr(obj)
dovrebbe sputare una stringa tale che può essere alimentato in eval
ricreare l'oggetto. In altre parole,
obj2 = eval(repr(obj1))
dovrebbe riprodurre l'oggetto.
In pratica, repr
è spesso una versione "lite" di str
. str
potrebbe stampare un formato leggibile dell'oggetto, mentre le stampe repr
out informazioni come la classe dell'oggetto, di solito a scopo di debug. Ma l'utilità dipende molto dalla vostra situazione e di come l'oggetto in questione maniglie repr
.
Lo scopo principale di repr()
è che esso viene utilizzato in l'interprete interattivo e nel debugger per formattare gli oggetti in forma leggibile. L'esempio che ha dato è particolarmente utile per il debug.