Convertir de una cadena a booleano en Python

Resuelto Joan Venge asked hace 15 años • 40 respuestas

¿Cómo convierto una cadena en booleana en Python? Este intento devuelve True:

>>> bool("False")
True
Joan Venge avatar Apr 04 '09 02:04 Joan Venge
Aceptado

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.

Keith Gaughan avatar Apr 03 '2009 19:04 Keith Gaughan

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,))
jzwiener avatar Aug 27 '2013 17:08 jzwiener
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.

Brian R. Bondy avatar Apr 03 '2009 19:04 Brian R. Bondy

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
Alan Marchiori avatar Dec 04 '2012 15:12 Alan Marchiori

Desde Python 2.6 puedes usar ast.literal_evaly 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 Noney Ellipsis.

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.

Jacob Gabrielson avatar May 28 '2009 18:05 Jacob Gabrielson