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:
repr(x)
? (Je ne les ai pas quand je fais str(x)
)'foo'
quand je fais eval("'foo'")
et pas x qui est l'objet?>>> 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'
.
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 repr
sentation 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
.
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?
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.