web-dev-qa-db-fra.com

Que fait! R dans str () et repr ()?

Selon la documentation Python 2.7.12 :

!s (Appliquer str()) et !r (Appliquer repr()) peuvent être utilisés pour convertir la valeur avant qu'elle ne soit formatée.

>>> import math
>>> print 'The value of PI is approximately {}.'.format(math.pi)
The value of PI is approximately 3.14159265359.
>>> print 'The value of PI is approximately {!r}.'.format(math.pi)
The value of PI is approximately 3.141592653589793.

Fait intéressant, la valeur convertie est la sortie de repr(), plutôt que str().

>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'

Que signifie "convertir la valeur" ici? Le rendant moins lisible par l'homme?

18
nalzok

Afin de formater quelque chose dans une chaîne, une représentation sous forme de chaîne de ce quelque chose doit d'abord être créée. "convertir la valeur" signifie essentiellement comment construire la représentation sous forme de chaîne. En python, il existe deux choix assez naturels pour obtenir une représentation sous forme de chaîne de quelque chose ... str et repr. str est généralement un peu plus convivial, repr est généralement plus précis. Peut-être que le documentation officielle est le meilleur endroit où aller chercher la différence:

object.__repr__(self)

  • Appelé par la fonction intégrée repr() pour calculer la représentation de chaîne "officielle" d'un objet. Dans la mesure du possible, cela devrait ressembler à une expression Python valide qui pourrait être utilisée pour recréer un objet avec la même valeur (dans un environnement approprié). Si ce n'est pas possible, une chaîne de le formulaire <...some useful description...> doit être renvoyé. La valeur renvoyée doit être un objet chaîne. Si une classe définit __repr__() mais pas __str__(), alors __repr__() est également utilisé lorsqu'une représentation sous forme de chaîne "informelle" des instances de cette classe est requise.

  • Ceci est généralement utilisé pour le débogage, il est donc important que la représentation soit riche en informations et sans ambiguïté.

object.__str__(self)

  • Appelé par str (objet) et les fonctions intégrées format () et print () pour calculer la représentation sous forme de chaîne "informelle" ou bien imprimable d'un objet. La valeur de retour doit être un objet chaîne.

  • Cette méthode diffère de object.__repr__() dans la mesure où il n'est pas prévu que __str__() renvoie une expression Python valide: une représentation plus pratique ou concise peut être utilisée.

  • L'implémentation par défaut définie par l'objet de type intégré appelle object.__repr__().

Dans str.format, !s Choisit d'utiliser str pour formater l'objet tandis que !r Choisit repr pour formater la valeur.

La différence peut être facilement vue avec des chaînes (comme repr pour une chaîne inclura des guillemets externes).

>>> 'foo {}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"

La différence entre ces deux méthodes dépend vraiment des objets à formater. Pour de nombreux objets (par exemple ceux qui ne remplacent pas la méthode __str__), Il n'y aura aucune différence dans la sortie formatée.

26
mgilson