Convertir de una cadena a booleano en Python
¿Cómo convierto una cadena en booleana en Python? Este intento devuelve True
:
>>> bool("False")
True
En realidad, simplemente comparas la cadena con lo que esperas aceptar como verdadero, así que puedes hacer esto:
s == 'True'
O para comparar con un montón de valores:
s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
Tenga cuidado al utilizar lo siguiente:
>>> bool("foo")
True
>>> bool("")
False
Las cadenas vacías se evalúan como False
, pero todo lo demás se evalúa como True
. Por lo tanto, esto no debe usarse para ningún tipo de propósito de análisis.
Advertencia: esta respuesta ya no funcionará a partir de Python 3.12 (está obsoleta a partir de 3.10)
Usar:
bool(distutils.util.strtobool(some_string))
- Pitón 2 :
distutils.util.strtobool
- Pitón >=3, <3.12 :
distutils.util.strtobool
- Python >=3.12 : ya no forma parte de la biblioteca estándar debido a PEP 632: módulo distutils obsoleto
Los valores verdaderos son y, sí, t, verdadero, encendido y 1; Los valores falsos son n, no, f, falso, desactivado y 0. Genera ValueError si val es cualquier otra cosa.
Tenga en cuenta que distutils.util.strtobool()
devuelve representaciones enteras y, por lo tanto, es necesario ajustarlo bool()
para obtener valores booleanos.
Dado que distutils ya no formará parte de la biblioteca estándar, aquí está el código distutils.util.strtobool()
(consulte el código fuente de 3.11.2).
def strtobool (val):
"""Convert a string representation of truth to true (1) or false (0).
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
'val' is anything else.
"""
val = val.lower()
if val in ('y', 'yes', 't', 'true', 'on', '1'):
return 1
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
return 0
else:
raise ValueError("invalid truth value %r" % (val,))
def str2bool(v):
return v.lower() in ("yes", "true", "t", "1")
Entonces llámalo así:
>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False
Manejando verdadero y falso explícitamente:
También puede hacer que su función verifique explícitamente una lista de palabras verdaderas y una lista de palabras falsas. Entonces, si no está en ninguna de las listas, podría generar una excepción.
El analizador JSON también es útil para, en general, convertir cadenas a tipos razonables de Python.
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
Desde Python 2.6 puedes usar ast.literal_eval
y todavía está disponible en Python 3 .
Evalúe un nodo de expresión o una cadena que contenga solo una visualización de contenedor o literal de Python. La cadena o nodo proporcionado solo puede consistir en las siguientes estructuras literales de Python: cadenas, bytes, números, tuplas, listas, dictados, conjuntos, booleanos
None
yEllipsis
.Esto se puede utilizar para evaluar cadenas que contienen valores de Python sin la necesidad de analizar los valores usted mismo. No es capaz de evaluar expresiones arbitrariamente complejas, por ejemplo que involucran operadores o indexación.
Esta función había sido documentada como “segura” en el pasado sin definir qué significaba. Eso fue engañoso. Está diseñado específicamente para no ejecutar código Python, a diferencia del más general
eval()
. No hay espacio de nombres, búsquedas de nombres ni capacidad de llamar. Pero no está libre de ataques : una entrada relativamente pequeña puede provocar el agotamiento de la memoria o el agotamiento de la pila C, provocando que el proceso se bloquee. También existe la posibilidad de que un consumo excesivo de CPU niegue el servicio en algunas entradas. Por lo tanto, no se recomienda utilizarlo en datos que no sean de confianza .
Lo cual parece funcionar, siempre y cuando esté seguro de que sus cadenas serán "True"
o "False"
:
>>> ast.literal_eval("True")
True
>>> ast.literal_eval("False")
False
>>> ast.literal_eval("F")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("'False'")
'False'
Normalmente no recomendaría esto, pero está completamente integrado y podría ser lo correcto según sus requisitos.