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

Était-ce utile?

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:

  1. que b est une instance de classe A dans le __main__ espace de noms,
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top