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:
- que
b
est une instance de classe A
dans l'espace de noms __main__
,
- 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) 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'' –