Question
Je suis en train de lire à propos repr
en Python. Je me demandais ce que l'application de la sortie de repr
est. par exemple.
class A:
pass
repr(A) ='<class __main__.A at 0x6f570>'
b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
Quand peut-on être intéressé par '<class __main__.A at 0x6f570>'
or'<__main__.A instance at 0x74d78>'
?
La solution
Parfois, vous avez à traiter avec ou une chaîne d'octets tels que
bob2='bob\xf0\xa4\xad\xa2'
Si vous imprimez ceci (dans Ubuntu), vous obtenez
In [62]: print(bob2)
bob𤭢
qui est pas très utile pour les autres essayer de comprendre votre chaîne d'octets. Dans les commentaires, John souligne que dans Windows, des résultats d'print(bob2)
à quelque chose comme bobð¤¢
. Le problème est que Python détecte l'encodage par défaut de votre console terminal / et tente de décoder la chaîne d'octets selon ce codage. Depuis Ubuntu et Windows utilise différents encodages par défaut (et éventuellement utf-8
cp1252
respectivement), des résultats différents en découlent.
En revanche, la rééd d'une chaîne est sans ambiguïté:
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
Quand les gens posent des questions par ici sur le SO sur les chaînes Python, ils sont souvent appelés à montrer l'rééd de la chaîne, donc nous savons avec certitude quelle chaîne ils traitent.
En général, le rééd doit être une représentation de chaîne non ambiguë de l'objet. repr(obj)
appelle la méthode obj
de l'objet __repr__
. Etant donné que dans votre exemple la A
de classe n'a pas sa propre méthode de __repr__
, stations repr(b)
à indiquer la classe et l'adresse mémoire.
Vous pouvez remplacer la méthode __repr__
pour donner des informations plus pertinentes.
Dans votre exemple, '<__main__.A instance at 0x74d78>'
nous dit deux choses utiles:
- que
b
est une instance de classeA
dans le__main__
espace de noms, - et que réside l'objet dans mémoire à l'adresse 0x74d78.
Vous pouvez par exemple, deux instances de A
de classe. Si elles ont la même adresse de mémoire, alors vous sauriez qu'ils sont « pointant » sur le même objet sous-jacent. (Notez ces informations peuvent également être obtenus en utilisant id
).
Autres conseils
En théorie, repr(obj)
devrait cracher sur une chaîne de telle sorte qu'il peut être introduit dans eval
pour recréer l'objet. En d'autres termes,
obj2 = eval(repr(obj1))
doit reproduire l'objet.
Dans la pratique, repr
est souvent une version "lite" de str
. str
peut imprimer une forme lisible par l'homme de l'objet, alors que imprime repr
des informations comme la classe de l'objet, le plus souvent à des fins de débogage. Mais l'utilité dépend beaucoup de votre situation et comment l'objet en question poignées repr
.
Le but principal de repr()
est qu'il est utilisé dans l'interpréteur interactif et dans le débogueur aux objets de format sous forme lisible par l'homme. L'exemple que vous avez donné est surtout utile pour le débogage.