Comprensione della funzione repr () in Python


152

repr(): rappresentazione di stringa valutabile di un oggetto (può "eval ()" esso, nel senso che è una rappresentazione di stringa che valuta un oggetto Python)

In altre parole:

>>> x = 'foo'
>>> repr(x)
"'foo'"

Domande:

  1. Perché ottengo le doppie virgolette quando lo faccio repr(x)? (Non li capisco quando lo faccio str(x))
  2. Perché ottengo 'foo'quando lo faccio eval("'foo'")e non x quale sia l'oggetto?

Risposte:


166
>>> x = 'foo'
>>> x
'foo'

Quindi il nome xè associato alla 'foo'stringa. Quando chiamate ad esempio repr(x)l'interprete inserisce 'foo'invece di xe quindi chiama repr('foo').

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

reprin realtà chiama un metodo magico __repr__di x, che fornisce la stringa contenente la rappresentazione del valore 'foo'assegnato a x. Quindi ritorna 'foo'all'interno della stringa ""risultante "'foo'". L'idea reprè di dare una stringa che contenga una serie di simboli che possiamo digitare nell'interprete e ottenere lo stesso valore a cui è stato inviato come argomento repr.

>>> eval("'foo'")
'foo'

Quando chiamiamo eval("'foo'"), è lo stesso che digitiamo 'foo'nell'interprete. È come digitiamo direttamente il contenuto della stringa esterna ""nell'interprete.

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

Se chiamiamo eval('foo'), è lo stesso che digitiamo foonell'interprete. Ma non è foodisponibile alcuna variabile e viene sollevata un'eccezione.

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strè solo la rappresentazione in forma di stringa dell'oggetto (ricorda, la xvariabile si riferisce a 'foo'), quindi questa funzione restituisce una stringa.

>>> str(5)
'5'

La rappresentazione in formato stringa dell'intero 5è '5'.

>>> str('foo')
'foo'

E la rappresentazione in formato stringa di stringa 'foo'è la stessa stringa 'foo'.


Puoi anche farci sapere alcuni casi d'uso quando si dovrebbe usare la funzione repr. Non riesco a comprenderlo
gaurav parashar,

14

Usa repranche il feedback che ricevi sull'interprete interattivo . Quando digiti un'espressione (lascia che sia expr), l'interprete sostanzialmente lo fa result = expr; if result is not None: print repr(result). Quindi la seconda riga nell'esempio sta formattando la stringa foonella rappresentazione desiderata ( 'foo'). E poi l'interprete crea l' represpressione di quello , lasciandoti con doppie virgolette.

Perché quando combino% r con escape di virgolette doppie e virgolette singole e le stampo, le stampa nel modo in cui le scrivo nel mio file .py ma non nel modo in cui mi piacerebbe vederle?

Non sono sicuro di quello che stai chiedendo qui. Il testo single ' and double " quotes, una volta eseguito repr, include delle escape per un tipo di citazione. Certo che lo è, altrimenti non sarebbe una stringa valida letterale secondo le regole di Python. Questo è esattamente ciò che hai chiesto chiamando repr.

Si noti inoltre che l' eval(repr(x)) == xanalogia non è letterale. È un'approssimazione e vale per la maggior parte (tutti?) Tipi incorporati, ma la cosa principale è che hai un'idea abbastanza buona del tipo e del "valore" logico guardando l' reproutput.


2
In origine, in realtà è stata pensata per essere letterale: ogni valore di reprdovrebbero essere sia qualcosa che può essere passato a eval(o copiato e incollato nel codice sorgente) per produrre un valore uguale, o qualcosa che alzerà uno SyntaxError quando si tenta che (di solito lo <…>stile prodotto da object.__repr__). Questo è stato gradualmente attenuato nel corso degli anni, e di 2.7 e 3.x è solo vero "per molti tipi", e ci sono eccezioni anche nello stdlib (ad esempio, un namedtupletipo creato come locale ti darà un reprche puoi " t eval), ma era l'idea originale.
abarnert,

7

str () viene utilizzato per creare output per l'utente finale mentre repr () viene utilizzato per lo sviluppo di debuggin e rappresenta il funzionario dell'oggetto.

Esempio:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

Dall'output vediamo che repr () mostra la rappresentazione ufficiale dell'oggetto data.


3

1) Il risultato di repr('foo')è la stringa 'foo' . Nella tua shell Python, il risultato dell'espressione è espresso anche come rappresentazione, quindi essenzialmente stai vedendo repr(repr('foo')).

2) evalcalcola il risultato di un'espressione. Il risultato è sempre un valore (come un numero, una stringa o un oggetto). Più variabili possono fare riferimento allo stesso valore, come in:

x = 'foo'
y = x

xey ora si riferiscono allo stesso valore.

3) Non ho idea di cosa intendevi qui. Puoi pubblicare un esempio e cosa ti piacerebbe vedere?


1

Quando dici

foo = 'bar'
baz(foo)

non stai passando fooalla bazfunzione. fooè solo un nome usato per rappresentare un valore, in questo caso 'bar', e quel valore viene passato alla bazfunzione.

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.