Selon la documentation Python 2.7.12 :
!s
(Appliquerstr()
) et!r
(Appliquerrepr()
) 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?
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.