web-dev-qa-db-fra.com

Formatage de chaîne dans Python 3

Je le fais dans Python 2:

"(%d goals, $%d)" % (self.goals, self.penalties)

Qu'est-ce que la version Python 3?

J'ai essayé de chercher des exemples en ligne, mais je continuais à obtenir Python 2 versions.

112
JoseBazBaz

Voici la documentation à propos de la "nouvelle" syntaxe de format. Un exemple serait:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

Si goals et penalties sont tous deux des entiers (c'est-à-dire que leur format par défaut est correct), vous pouvez le réduire à:

"({} goals, ${})".format(self.goals, self.penalties)

Et puisque les paramètres sont des champs de self, il y a aussi une façon de le faire en utilisant un seul argument deux fois (comme @Burhan Khalid l'a noté dans les commentaires):

"({0.goals} goals, ${0.penalties})".format(self)

Expliquant:

  • {} signifie uniquement le prochain argument de position, avec le format par défaut;
  • {0} signifie l'argument avec index 0, avec le format par défaut;
  • {:d} est le prochain argument de position, au format entier décimal;
  • {0:d} est l'argument avec index 0, au format entier décimal.

Il y a beaucoup d'autres choses que vous pouvez faire lors de la sélection d'un argument (utiliser des arguments nommés au lieu de positionnels, accéder à des champs, etc.) ainsi que de nombreuses options de formatage (remplissage du nombre, utilisation de séparateurs de milliers, affichage ou non du signe, etc.). Quelques autres exemples:

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

Remarque: Comme d'autres l'ont souligné, le nouveau format ne remplace pas l'ancien, les deux sont disponibles à la fois dans Python 3 et dans le plus récent. versions de Python 2 également. Certains diront que c'est une question de préférence, mais IMHO le plus récent est beaucoup plus expressif que l'ancien, et devrait être utilisé lors de l'écriture de nouveau code (à moins qu'il ne cible des environnements plus anciens, bien sûr).

170
mgibsonbr

Python 3.6 prend désormais en charge l’interpolation de chaîne littérale abrégée avec PEP 498 . Pour votre cas d'utilisation, la nouvelle syntaxe est simplement:

f"({self.goals} goals, ${self.penalties})"

Ceci est similaire au précédent .format standard, mais permet de faire facilement des choses comme :

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'
63
JDong

Cette ligne fonctionne telle quelle dans Python 3.

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'
12
Mark Reed

Ce n'était pas obsolète; votre code fonctionne bien. Lire la suite ici .

10
jackcogdill

J'aime cette approche

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

Notez les d et s annexés aux crochets, respectivement.

la sortie sera:

I scored 3 goals and took 5 penalties
2
fullstacklife