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>'?

È stato utile?

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:

  1. che b è un'istanza della classe A nel __main__ namespace,
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top