Comment les booléens sont-ils formatés dans les chaînes en Python?

170

Je vois que je ne peux pas faire:

"%b %b" % (True, False)

en Python. J'ai deviné %bpour b (oolean). Y a-t-il quelque chose comme ça?

Juanjo Conti
la source
1
Que voulez-vous que le résultat soit? Vrai et faux? Vous voulez alors '% s'. % b, quand il existe, est pour binaire (comme en base-2).
Thomas Wouters
1
Ho oui! "% s" semble fonctionner parfaitement. Répondez à cette question et obtenez une réponse choisie. J'avais l'habitude de faire "% s"% str (False). Shame on me :)
Juanjo Conti
3
lien vers la documentation pertinente: docs.python.org/library/...
mechanical_meat

Réponses:

247
>>> print "%r, %r" % (True, False)
True, False

Ce n'est pas spécifique aux valeurs booléennes - %rappelle la __repr__méthode sur l'argument. %s(pour str) devrait également fonctionner.

Danben
la source
2
Quelle est la principale différence entre %ret %s?
Alston le
22
J'ai toujours eu cette distiction en tête, mais corrigez-moi si je me trompe. % s (et donc str ()) visent à représenter l'objet de la manière la plus transparente possible pour les humains. % r (et donc repr ()) visent à représenter l'objet de la manière la plus transparente possible pour python. Par exemple, print(str("foo"))imprime simplement foosur une nouvelle ligne. print(repr("foo"))cependant imprime 'foo'sur une nouvelle ligne, y compris les guillemets, puisque c'est ce que vous devez taper dans l'interpréteur python pour obtenir l'objet correspondant à l'argument en python.
bobismijnnaam
66

Si vous souhaitez True Falseutiliser:

"%s %s" % (True, False)

parce que str(True)c'est 'True'et str(False)est 'False'.

ou si vous souhaitez 1 0utiliser:

"%i %i" % (True, False)

parce que int(True)c'est 1et int(False)est 0.

Désintégration
la source
18

Vous pouvez également utiliser la classe Formatter de string

print "{0} {1}".format(True, False);
print "{0:} {1:}".format(True, False);
print "{0:d} {1:d}".format(True, False);
print "{0:f} {1:f}".format(True, False);
print "{0:e} {1:e}".format(True, False);

Voici les résultats

True False
True False
1 0
1.000000 0.000000
1.000000e+00 0.000000e+00

Certains des %spécificateurs de type -format ( %r, %i) ne sont pas disponibles. Pour plus de détails, voir le mini-langage de spécification de format

Loup
la source
4
Notez que l'ajout d'options de formatage peut gâcher cela. Par exemple {:_^5}, vous obtiendrez à '__1__'moins que vous ne soyez str(...)les booléens.
Michael - Où est Clay Shirky
2
Vous pouvez contourner les problèmes avec les conversions de type comme !s: '{!s:_^5}'.format(True)is'True_'
Michael - Where's Clay Shirky
5

Pour mettre à jour cela pour Python-3, vous pouvez le faire

"{} {}".format(True, False)

Cependant, si vous voulez réellement formater la chaîne (par exemple, ajouter un espace blanc), vous rencontrez Python convertissant le booléen dans la valeur C sous-jacente (c'est-à-dire un int), par exemple

>>> "{:<8} {}".format(True, False)
'1        False'

Pour contourner cela, vous pouvez lancer Trueune chaîne, par exemple

>>> "{:<8} {}".format(str(True), False)
'True     False'
irritable_phd_syndrom
la source