web-dev-qa-db-fra.com

Comprendre la fonction repr () dans Python

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

En d'autres termes:

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

Des questions:

  1. Pourquoi ai-je les guillemets doubles lorsque je fais repr(x)? (Je ne les ai pas quand je fais str(x))
  2. Pourquoi ai-je 'foo' quand je fais eval("'foo'") et pas x qui est l'objet?
136
0101amt
>>> x = 'foo'
>>> x
'foo'

Ainsi, le nom x est associé à la chaîne 'foo'. Lorsque vous appelez par exemple repr(x), l'interpréteur place 'foo' à la place de x, puis appelle repr('foo').

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

repr appelle en fait une méthode magique __repr__ sur x, qui donne le chaîne contenant la représentation de la valeur 'foo' attribuée à x. Donc, il retourne 'foo' à l'intérieur de la chaîne "", ce qui donne "'foo'". L'idée de repr est de donner une chaîne contenant 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 tant qu'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 on tape 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 foo dans l'interpréteur. Mais il n'y a pas de variable foo disponible et une exception est déclenchée.

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

str est simplement la représentation sous forme de chaîne de l'objet (rappelez-vous que x variable fait référence à 'foo'), cette fonction renvoie donc chaîne.

>>> str(5)
'5'

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

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

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

158
ovgolovin

Le retour que vous obtenez sur l'interpréteur interactif utilise également repr. Lorsque vous tapez une expression (que ce 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 is formate la chaîne foo dans la représentation souhaitée ('foo'). Et ensuite, l'interprète crée la reprsentation de that, vous laissant ainsi des guillemets doubles.

Pourquoi, lorsque je combine% r avec des échappements entre guillemets et entre guillemets simples et que je les imprime, ils sont imprimés comme je les ai écrits dans mon fichier .py, mais pas comme je les aimerais.

Je ne suis pas sûr de 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 que si, sinon ce ne serait pas un littéral de chaîne valide selon les règles Python. C'est précisément ce que vous avez demandé en appelant repr.

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

9
user395760

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

2) eval calcule le résultat d'une expression. Le résultat est toujours un valeur (tel qu'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 maintenant référence à la même valeur.

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

3
phihag

Quand tu dis

foo = 'bar'
baz(foo)

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

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 l'agent officiel de l'objet.

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

En sortie, nous voyons que repr () montre la représentation officielle de l’objet date.

2
Tanim_113