161 votes

Comprendre la fonction repr( ) en Python

repr() Représentation d'une chaîne de caractères évaluable d'un objet (on peut "eval()"). ce qui signifie que c'est une représentation de chaîne de caractères qui s'évalue en un objet Python Python)

En d'autres termes :

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

Questions :

  1. Pourquoi est-ce que j'ai les guillemets quand je fais repr(x) ? (Je ne les reçois pas quand je le fais str(x) )
  2. Pourquoi est-ce que j'ai 'foo' quand je le fais eval("'foo'") et non pas x qui est l objet ?

172voto

ovgolovin Points 5990
>>> x = 'foo'
>>> x
'foo'

Donc le nom x est attaché à 'foo' chaîne. Lorsque vous appelez par exemple repr(x) l'interprète met 'foo' au lieu de x et appelle ensuite repr('foo') .

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

repr appelle en fait une méthode magique __repr__ de x ce qui donne le chaîne de caractères contenant la représentation de la valeur 'foo' affecté à x . Il retourne donc 'foo' à l'intérieur de la chaîne "" ce qui entraîne "'foo'" . L'idée de repr est de donner une chaîne de caractères contenant une série de symboles que nous pouvons taper dans l'interpréteur et obtenir la même valeur que celle envoyée en argument à repr .

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

Quand nous appelons eval("'foo'") c'est la même chose que lorsque nous tapons 'foo' dans l'interpréteur. C'est comme si nous tapions directement le contenu de la chaîne extérieure "" 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 lorsque nous tapons foo dans l'interpréteur. Mais il n'y a pas de foo disponible et une exception est levée.

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

str est juste la représentation en chaîne de l'objet (rappelez-vous, x la variable se réfère à 'foo' ), cette fonction renvoie donc une chaîne.

>>> str(5)
'5'

Représentation en chaîne de l'entier 5 es '5' .

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

Et la représentation de la chaîne de caractères 'foo' est la même chaîne 'foo' .

0 votes

Pouvez-vous également nous faire part de quelques cas d'utilisation de la fonction repr ? Je ne parviens pas à comprendre que

14voto

delnan Points 52260

Le feedback que vous obtenez sur l'interprète interactif utilise repr aussi. Lorsque vous tapez une expression (qu'elle soit expr ), l'interprète fait essentiellement result = expr; if result is not None: print repr(result) . Ainsi, la deuxième ligne de votre exemple es formatage de la chaîne de caractères foo dans la représentation que vous voulez ( 'foo' ). Et ensuite, l'interpréteur crée le repr esentation de que ce qui vous laisse avec des guillemets.

Pourquoi, lorsque je combine %r avec des échappatoires de guillemets doubles et simples et que je les imprime, l'impression se fait de la manière dont je l'aurais écrite dans mon fichier .py, mais pas de la manière dont je voudrais la voir ?

Je ne suis pas sûr de ce que vous demandez ici. Le texte single ' and double " quotes lorsqu'il est exécuté par repr comprend des échappatoires pour un type de guillemets. Bien sûr que oui, sinon ce ne serait pas une chaîne littérale valide selon les règles de Python. C'est précisément ce que vous avez demandé en appelant repr .

Notez également que le eval(repr(x)) == x L'analogie n'est pas littérale. Il s'agit d'une approximation et elle est vraie 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 l'icône repr sortie.

2 votes

A l'origine, il s'agissait en fait était doit être littérale : chaque valeur repr doit être soit quelque chose qui peut être passé à eval (ou copié-collé dans votre code source) pour produire une valeur égale, ou quelque chose qui soulèvera une SyntaxError lorsque vous essayerez de le faire (généralement l'option <…> style produit par object.__repr__ ). Cela a été progressivement atténué au fil des ans, et en 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 namedtuple créé en tant que local vous donnera un repr vous ne pouvez pas eval ), mais c'était l'idée originale.

4voto

phihag Points 89765

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

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

x = 'foo'
y = x

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

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

2voto

IfLoop Points 59461

Quand vous dites

foo = 'bar'
baz(foo)

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

-3voto

SubodhD Points 46

Alors pourquoi cette sortie ? (les guillemets simples sont à l'extérieur des guillemets doubles)

 >>>repr("What's up")
 >>>'"What\'s up"'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X