Comprendre la fonction repr () en Python

152

repr(): représentation sous forme de chaîne évaluable d'un objet (peut "eval ()" it, ce qui signifie qu'il s'agit d'une représentation sous forme de chaîne qui évalue un objet Python)

En d'autres termes:

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

Des questions:

  1. Pourquoi est-ce que j'obtiens les guillemets doubles quand je le fais repr(x)? (Je ne les reçois pas quand je le fais str(x))
  2. Pourquoi est-ce que j'obtiens 'foo'quand je fais eval("'foo'")et non x quel est l'objet?
0101amt
la source

Réponses:

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

Le nom xest donc attaché à une 'foo'chaîne. Lorsque vous appelez par exemple, repr(x)l'interpréteur met 'foo'au lieu de xpuis appelle repr('foo').

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

reprappelle en fait une méthode magique __repr__de x, qui donne la chaîne contenant la représentation de la valeur 'foo'assignée à x. Donc, il retourne 'foo'à l'intérieur de la chaîne ""résultant en "'foo'". L'idée de represt de donner une chaîne qui contient une série de symboles que nous pouvons taper dans l'interpréteur et obtenir la même valeur qui a été envoyée en argument repr.

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

Lorsque nous appelons eval("'foo'"), c'est la même chose que nous tapons 'foo'dans l'interpréteur. C'est comme nous tapons directement le contenu de la chaîne externe ""dans l'interpréteur.

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

Si nous appelons eval('foo'), c'est la même chose que nous tapons foodans l'interpréteur. Mais il n'y a pas de foovariable disponible et une exception est levée.

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

strest juste la représentation sous forme de chaîne de l'objet (rappelez-vous, la xvariable fait référence à 'foo'), donc cette fonction renvoie une chaîne.

>>> str(5)
'5'

La représentation sous forme de chaîne d'un entier 5est '5'.

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

Et la représentation sous forme de chaîne de chaîne 'foo'est la même chaîne 'foo'.

ovgolovin
la source
Pouvez-vous également nous faire part de certains cas d'utilisation où il faut utiliser la fonction repr. Je suis incapable de comprendre cela
gaurav parashar
14

Les commentaires que vous obtenez sur l'interprète interactif sont reprégalement utiles. Lorsque vous tapez une expression (que ce soit le cas expr), l'interpréteur le fait essentiellement result = expr; if result is not None: print repr(result). Ainsi, la deuxième ligne de votre exemple met en forme la chaîne foodans la représentation souhaitée ( 'foo'). Et puis l'interprète crée l' representation de cela , vous laissant avec des guillemets doubles.

Pourquoi lorsque je combine% r avec des échappements à guillemets doubles et simples et que je les imprime, il l'imprime comme je l'écrirais dans mon fichier .py mais pas comme je voudrais le voir?

Je ne sais pas ce que vous demandez ici. Le texte single ' and double " quotes, lorsqu'il est parcouru repr, inclut des échappements pour un type de citation. Bien sûr, c'est le cas, sinon ce ne serait pas un littéral de chaîne valide par les règles Python. C'est précisément ce que vous avez demandé en appelant repr.

Notez également que l' eval(repr(x)) == xanalogie n'est pas littérale. C'est une approximation et c'est vrai pour la plupart (tous?) Des types intégrés, mais l'essentiel est que vous ayez une assez bonne idée du type et de la "valeur" logique en regardant la reprsortie.

Vlad
la source
2
À l'origine, il était censé être littéral: chaque valeur reprdevrait être quelque chose qui peut être passé eval(ou copié et collé dans votre code source) pour produire une valeur égale, ou quelque chose qui lèvera une SyntaxError lorsque vous essayez cela (généralement le <…>style produit par object.__repr__). Cela a été progressivement atténué au fil des ans, et par 2.7 et 3.x c'est juste vrai "pour de nombreux types", et il y a des exceptions même dans la stdlib (par exemple, un namedtupletype créé en tant que local vous donnera un reprvous pouvez ' t eval), mais c'était l'idée originale.
abarnert le
7

str () est utilisé pour créer une sortie pour l'utilisateur final tandis que repr () est utilisé pour le développement de débogage et il représente le fonctionnaire de object.

Exemple:

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

À partir de la sortie, nous voyons que repr () montre la représentation officielle de l'objet date.

Tanim_113
la source
3

1) Le résultat de repr('foo')est la chaîne 'foo' . Dans votre shell Python, le résultat de l'expression est également exprimé sous forme de représentation, donc vous voyez essentiellement repr(repr('foo')).

2) evalcalcule le résultat d'une expression. Le résultat est toujours une valeur (comme un nombre, une chaîne ou un objet). Plusieurs variables peuvent faire référence à la même valeur, comme dans:

x = 'foo'
y = x

x et y font désormais référence à la même valeur.

3) Je n'ai aucune idée de ce que vous vouliez dire ici. Pouvez-vous publier un exemple et ce que vous aimeriez voir?

Phihag
la source
1

Quand tu dis

foo = 'bar'
baz(foo)

vous ne passez pas fooà la bazfonction. fooest juste un nom utilisé pour représenter une valeur, dans ce cas 'bar', et cette valeur est transmise à la bazfonction.

SingleNegationElimination
la source