2011-01-11 3 views
5

J'ai lu environ repr en Python. Je me demandais ce que l'application de la sortie de repr est. par exemple.Quand la sortie de repr est-elle utile?

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>' ou '<__main__.A instance at 0x74d78>'?

Répondre

4

Parfois, vous avez à traiter avec ou present a byte string 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 essayant de comprendre votre chaîne d'octets. Dans les commentaires, John souligne que dans Windows, print(bob2) se traduit par quelque chose comme bob𤭢. Le problème est que Python détecte le codage par défaut de votre terminal/console et essaie de décoder la chaîne d'octets en fonction de cet encodage. Comme Ubuntu et Windows utilisent des codages par défaut différents (respectivement utf-8 et cp1252), différents résultats s'ensuivent.

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 à coup sûr que chaîne qu'ils traitent.

En général, le repr devrait être une représentation de chaîne sans ambiguïté de l'objet. repr(obj) appelle la méthode obj__repr__. Puisque dans votre exemple la classe A n'a pas sa propre méthode __repr__, repr(b) utilise la classe et l'adresse mémoire.

Vous pouvez remplacer la méthode __repr__ pour obtenir 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 l'espace de noms __main__ ,
  2. et que l'objet réside dans mémoire à l'adresse 0x74d78.

Vous pourriez, par exemple, avoir deux instances de classe A. S'ils ont la même adresse mémoire, vous savez qu'ils pointent vers le même objet sous-jacent. (Notez que cette information peut également être obtenue en utilisant id).

+0

(0) S'il vous plaît, ne parlez pas des chaînes d'octets sans mentionner l'encodage présumé/connu (1) En fait, ajouter du poids à la raison pour utiliser repr(), tout le monde ne reçoit pas ce caractère CJK lorsqu'il imprime cette chaîne; dans IDLE sur Windows, on obtient 'bob𤠢' ... il devrait avoir 4 caractères après 'bob' et je vois 4 dans IDLE mais dans ce commentaire SO je vois seulement 3; On suppose que \ xAD est traité comme un trait d'union. (2) Utile pour les chaînes Unicode, pas seulement pour les chaînes Octet. Exemple: 'u'bob \ U00024b62'' –

1

L'objectif principal de repr() est qu'il est utilisé dans l'interpréteur interactif et dans le débogueur pour formater les objets sous une forme lisible par l'homme. L'exemple que vous avez donné est principalement utile pour le débogage.

5

Théoriquement, 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)) 

devrait reproduire l'objet. En pratique, repr est souvent une version «allégée» de str. str peut imprimer une forme lisible par l'utilisateur de l'objet, tandis que repr imprime des informations telles que la classe de l'objet, généralement à des fins de débogage. Mais l'utilité dépend beaucoup de votre situation et comment l'objet en question gère repr.

+0

juste essayé et j'ai obtenu les éléments suivants >>> obj = eval (rééd (w)) retraçage (le plus récent appel dernier): Fichier "", ligne 1, dans Fichier "", ligne 1 <__ main __. Une instance à 0x74d78> ^ SyntaxError: syntaxe invalide – shaz

+0

@shaz: quoi de neuf? Cela devrait fonctionner avec 'w = 'une chaîne'', par exemple. – nmichaels

+0

w est une instance de la classe A, c'est-à-dire w = A() – shaz

Questions connexes