web-dev-qa-db-fra.com

Quelle est la différence entre! R et% r en Python?

Comme l'indique le titre, quelle est la différence entre ces deux drapeaux? Il semble qu'ils convertissent tous les deux la valeur en une chaîne en utilisant repr ()? Aussi, dans cette ligne de code:

"{0!r:20}".format("Hello")  

Que fait le 0 devant le! R?

30
b_pcakes

%r N'est pas un espace réservé valide dans les opérations de formatage str.format(); cela ne fonctionne qu'en formatage de chaîne à l'ancienne % . Il convertit en effet l'objet en représentation via la fonction repr().

Dans str.format(), !r Est l'équivalent, mais cela signifie également que vous pouvez désormais utiliser tous les codes de format pour une chaîne. Normalement, str.format() appellera la méthode object.__format__() sur l'objet lui-même, mais en utilisant !r, repr(object).__format__() est utilisé à la place.

Il y a aussi les convertisseurs !s Et (dans Python 3) !a; Ceux-ci appliquent les str() et ascii() fonctionne en premier.

Le 0 En face indique quel argument de la méthode str.format() sera utilisé pour remplir cet emplacement; L'argument positionnel 0 est "Hello" dans votre cas. Vous pouvez également utiliser des arguments nommés et passer des objets comme arguments de mot-clé:

"{greeting!r:20}".format(greeting="Hello")  

Sauf si vous utilisez Python 2.6, vous pouvez omettre cela car les emplacements sans index ni noms sont automatiquement numérotés; le premier {} Est 0, Le second {} Prend le deuxième argument à l'index 1, Etc.

52
Martijn Pieters