¿Cómo se formatean los booleanos en cadenas en Python?

170

Ya veo que no puedo hacer:

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

en Python Supuse %bque b (oolean). ¿Hay algo como esto?

Juanjo Conti
fuente
1
¿Cuál quieres que sea el resultado? ¿Verdadero y falso? Quieres '% s' entonces. % b, cuando existe, es para binario (como en base-2).
Thomas Wouters
1
Ho si! "% s" parece funcionar bien. Responda esta pregunta y obtenga una respuesta leída. Solía ​​hacer "% s"% str (Falso). Vergüenza :)
Juanjo Conti
3
enlace a la documentación relevante: docs.python.org/library/…
mechanical_meat

Respuestas:

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

Esto no es específico de los valores booleanos: %rllama al __repr__método en el argumento. %s(para str) también debería funcionar.

danben
fuente
2
¿Cuál es la principal diferencia entre %ry %s?
Alston
22
Siempre tuve en mente esta discreción, pero corrígeme si me equivoco. % s (y, por lo tanto, str ()) apuntan a representar el objeto de la manera más transparente posible para los humanos. % r (y, por lo tanto, repr ()) apuntan a representar el objeto de la manera más transparente posible para python. Por ejemplo, print(str("foo"))simplemente imprime fooen una nueva línea. print(repr("foo"))sin embargo, imprime 'foo'en una nueva línea, incluidas las comillas, ya que eso es lo que necesita escribir en el intérprete de Python para obtener el objeto correspondiente al argumento en Python.
bobismijnnaam
66

Si quieres True Falseusar:

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

porque str(True)es 'True'y str(False)es 'False'.

o si quieres 1 0usar:

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

porque int(True)es 1y int(False)es 0.

Desintegr
fuente
18

También puede usar la clase de cadena Formatter

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);

Estos son los resultados.

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

Algunos de los %especificadores de tipo de formato ( %r, %i) no están disponibles. Para más detalles, consulte el Mini-idioma de especificaciones de formato

Lobo
fuente
44
Tenga en cuenta que agregar opciones de formato puede arruinar esto. Por ejemplo {:_^5}, '__1__'te str(...)atrapará a menos que seas booleano.
Michael - ¿Dónde está Clay Shirky?
2
Puede moverse por los problemas con las conversiones de tipos como !s: '{!s:_^5}'.format(True)es'True_'
Michael - ¿Dónde está Clay Shirky
4

Para actualizar esto para Python-3, puede hacer esto

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

Sin embargo, si desea formatear la cadena (por ejemplo, agregar espacios en blanco), se encuentra con Python que convierte el valor booleano en el valor C subyacente (es decir, un int), por ejemplo

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

Para evitar esto, puede lanzar Truecomo una cadena, por ejemplo

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