Scopo del __repr__ di Python


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Qual è il significato / lo scopo di questo metodo?


@ zjm1126: vuoi sapere perché >>> variablestampa cosa __repr__()ritorna?
Esteban Küber,

19
Quella documentazione mette le persone a dormire. Inoltre, è utile imparare dagli altri come viene utilizzato.
Concerned_Citizen il


2
Per gli sviluppatori Java che stanno imparando Python, il modo migliore per vedere questo è toString () in Java.
Ravi,

Risposte:


188

__repr__dovrebbe restituire una rappresentazione stampabile dell'oggetto, molto probabilmente uno dei modi possibili per creare questo oggetto. Vedi la documentazione ufficiale qui . __repr__è più per gli sviluppatori mentre __str__è per gli utenti finali.

Un semplice esempio:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1: principalmente volevo correggere la formattazione (è utile che gli esempi corrispondano il più vicino possibile a ciò che vedranno in una sessione di esempio), ma ho anche modificato il formato di output in modo che sia esplicitamente diverso dall'assegnazione, in quanto migliora notevolmente la chiarezza per qualcuno confuso su questo, imho. (Se sono andato troppo lontano, basta modificarlo e ti devo una birra.)


1
Questo dovrebbe forse usare% r invece di% s: stackoverflow.com/questions/6005159/…
Jonathan Adelson

43
Questo non è proprio corretto. __str__è l'output che dovrebbe essere leggibile dall'uomo: __repr__dovrebbe essere una rappresentazione leggibile per l'interprete Python (cioè alimentare la stringa all'interprete dovrebbe ricreare l'oggetto). Se un oggetto non ha un __str__metodo, tuttavia, __repr__viene utilizzato al suo posto. Inoltre, come notato: questo esempio in realtà stampa il __str__metodo di self.xe self.y: %rdovrebbe essere usato al posto dell'operazione %sdi formattazione della stringa (poiché la classe non definisce __str__, __repr__viene effettivamente restituita comunque, ma è un'anomalia).
Daniel Andersson,

20

Questo è spiegato abbastanza bene nella documentazione di Python :

repr ( oggetto ): restituisce una stringa contenente una rappresentazione stampabile di un oggetto. Questo è lo stesso valore prodotto dalle conversioni (virgolette inverse). A volte è utile poter accedere a questa operazione come una normale funzione. Per molti tipi, questa funzione tenta di restituire una stringa che restituisce un oggetto con lo stesso valore quando viene passata eval(), altrimenti la rappresentazione è una stringa racchiusa tra parentesi angolari che contiene il nome del tipo di oggetto insieme a informazioni aggiuntive spesso includendo il nome e l'indirizzo dell'oggetto. Una classe può controllare ciò che questa funzione restituisce per le sue istanze definendo un __repr__()metodo.

Quindi quello che vedi qui è l'implementazione predefinita di __repr__, che è utile per la serializzazione e il debug.


5
Penso che il metodo delle virgolette inverse (o "backtick") per ottenere la "rappresentazione" di un oggetto sia deprecato e sia stato rimosso per la versione 3.0
MatrixFrog

MatrixFrog: entrambi veri, ma l'attuale documentazione 2.x dice ancora questo, da dove proviene la citazione.

Per molti oggetti, __repr__ e __str__ hanno la stessa funzione. In effetti, se si definisce solo __str__, per impostazione predefinita __repr__ chiama semplicemente __str__. Il caso più ovvio in cui ciò non è vero sono le stringhe stesse: str ("stackoverflow") restituisce stackoverflowma repr ("stackoverflow") lo è 'stackoverflow'.
MatrixFrog,

6
Hai questo all'indietro, __repr__ non usa mai __str__, ma potrebbe accadere il contrario. Vedi docs.python.org/reference/…

13

__repr__viene utilizzato dall'interprete Python autonomo per visualizzare una classe in formato stampabile. Esempio:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

Nei casi in cui un __str__metodo non è definito nella classe, chiamerà la __repr__funzione nel tentativo di creare una rappresentazione stampabile.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Inoltre, print()ing la classe chiamerà __str__per impostazione predefinita.


Documentazione , per favore


7

Il metodo __repr__ dice semplicemente a Python come stampare oggetti di una classe


1

Un esempio per vedere le differenze tra loro (ho copiato da questa fonte ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

I rendimenti di repr()e str()sono identici per int x, ma c'è una differenza tra i valori di ritorno per str y- uno è formale e l'altro è informale . Una delle differenze più importanti tra le rappresentazioni formali e informali è che l'implementazione predefinita di __repr__per un valore str può essere chiamata come argomento da valutare, e il valore restituito sarebbe un oggetto stringa valido, come questo:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Se si tenta di chiamare il valore restituito di __str__come argomento da valutare, il risultato non sarà valido.


1

Quando creiamo nuovi tipi definendo le classi, possiamo sfruttare alcune funzionalità di Python per rendere le nuove classi convenienti da usare. Una di queste caratteristiche sono i "metodi speciali", detti anche "metodi magici".

I metodi speciali hanno nomi che iniziano e finiscono con due trattini bassi. Li definiamo, ma di solito non li chiamiamo direttamente per nome. Invece, si eseguono automaticamente in circostanze specifiche.

È conveniente poter generare il valore di un'istanza di un oggetto usando un'istruzione print. Quando lo facciamo, vorremmo che il valore fosse rappresentato nell'output in un formato comprensibile e inequivocabile. Il metodo speciale repr può essere utilizzato per far sì che ciò accada. Se definiamo questo metodo, può essere chiamato automaticamente quando stampiamo il valore di un'istanza di una classe per la quale abbiamo definito questo metodo. Va detto, tuttavia, che esiste anche un metodo speciale str , usato per uno scopo simile, ma non identico, che può avere la precedenza, se lo abbiamo anche definito.

Se non abbiamo definito, il repr metodo per la classe Point3D, e hanno my_point istanziato come un esempio di Point3D, e poi lo facciamo ...

stampa my_point ... potremmo vedere questo come output ...

Non molto carino, eh?

Quindi, definiamo il metodo speciale repr o str , o entrambi, per ottenere un output migliore.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Produzione ...

(1, 2, 3) (1, 2, 3)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.