¿Alguien sabe cómo convertir de una cadena a un booleano en Python? Encontré este enlace . Pero no parece una forma adecuada de hacerlo. Es decir, utilizando la funcionalidad incorporada, etc.
La razón por la que pregunto esto es porque aprendí int("string")
de aquí. Pero cuando lo intentas bool("string")
siempre vuelve True
:
>>> bool("False")
True
distutils.util.strtobool(some_string)
. Técnicamente, la salida es tipoint
con valor0
o1
-> si realmente quiere / necesita,bool
entonces puede ajustar esa funciónbool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
no puede manejar el sí / no extranjero, a diferencia de la solución de @kmonsoor, que sin embargo no puede manejar los archivos CSV creados por Excel con Verdadero / Falso en un idioma extranjero (por ejemploVERO
,FALSO
). Por lo tanto, a veces se requiere la reinvención de la rueda.Respuestas:
Realmente, solo compara la cadena con lo que espera aceptar como representación verdadera, para que pueda hacer esto:
O para verificar contra un montón de valores:
Tenga cuidado al usar lo siguiente:
Las cadenas vacías se evalúan como
False
, pero todo lo demás se evalúa comoTrue
. Por lo tanto, esto no debe usarse para ningún tipo de análisis.fuente
s == "True"
. Pero he visto a personas hacer un verdadero desastre con esto. def convert (s): if s == "True": devuelve True; falso retorno.bool("False")
. Siempre se lanzará aTrue
.Utilizar:
Tenga en cuenta que
distutils.util.strtobool()
devuelve representaciones enteras y, por lo tanto, debe envolversebool()
para obtener valores booleanos.fuente
1
/0
noTrue
/False
, por lo que debe ajustar el resultado en bool () para obtener un booleano real:bool(distutils.util.strtobool(some_string))
None
ystr(None)
como entrada.bool
en lugar de1
/0
, siempre y cuando usted no está haciendo cosas malas comoif x == False
... y si usted está tratando conint
s yNone
S que no es necesario una función especial, sólo puede comprobar a directamenteif myint:
oif not maybe_none_var:
bool
es una subclase deint
Entonces llámalo así:
Manejo de verdadero y falso explícitamente:
También puede hacer que su función verifique explícitamente una lista Verdadera de palabras y una Lista falsa de palabras. Entonces, si no está en ninguna de las dos listas, puede lanzar una excepción.
fuente
El analizador JSON también es útil para, en general, convertir cadenas a tipos de python razonables.
fuente
.lower()
Comenzando con Python 2.6, ahora hay
ast.literal_eval
:Lo que parece funcionar, siempre y cuando esté seguro de que sus cadenas serán
"True"
o"False"
:Normalmente no recomendaría esto, pero está completamente integrado y podría ser lo correcto dependiendo de sus requisitos.
fuente
Si sabe que la cadena será
"True"
o bien"False"
, puede usarlaeval(s)
.Sin embargo, solo use esto si está seguro del contenido de la cadena, ya que arrojará una excepción si la cadena no contiene Python válido y también ejecutará el código contenido en la cadena.
fuente
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Esta versión mantiene la semántica de constructores como int (value) y proporciona una manera fácil de definir valores de cadena aceptables.
fuente
Aquí está mi versión. Comprueba las listas de valores positivos y negativos, generando una excepción para valores desconocidos. Y no recibe una cadena, pero cualquier tipo debería hacerlo.
Ejecuciones de muestra:
fuente
to_bool(["hello"])
que debería ser una llamada perfectamente válida, si[]
es compatibleto_bool([])
. En cambio, haría algo en este sentido:myList=someFunctionThatReturnAList
`if (is_bool (myList)): ... ´ entonces uno tiene una lista y quiere saber si esta lista es None o está vacía.siempre puedes hacer algo como
el bit en parens evaluaría a False. Esta es solo otra forma de hacerlo sin tener que hacer una llamada a la función real.
fuente
val = "false"
haciendo la línea en este ejemplo? ¿Por qué está ahí? Qué significa eso?Un truco simple y genial (basado en lo que publicó @Alan Marchiori), pero usando yaml:
Si esto es demasiado ancho, se puede refinar probando el resultado del tipo. Si el tipo devuelto por yaml es un str, entonces no se puede convertir a ningún otro tipo (que se me ocurra de todos modos), por lo que podría manejarlo por separado, o simplemente dejar que sea cierto.
No haré ninguna conjetura sobre la velocidad, pero como estoy trabajando con datos yaml bajo Qt gui de todos modos, esto tiene una buena simetría.
fuente
yaml
módulo es una biblioteca de terceros: PyYAMLNo estoy de acuerdo con ninguna solución aquí, ya que son demasiado permisivos. Esto normalmente no es lo que desea cuando analiza una cadena.
Entonces, aquí la solución que estoy usando:
Y los resultados:
Solo para ser claro porque parece que mi respuesta ofendió a alguien de alguna manera:
El punto es que no desea probar solo un valor y asumir el otro. No creo que siempre quieras asignar absolutamente todo al valor no analizado. Eso produce un código propenso a errores.
Entonces, si sabes en qué quieres codificarlo.
fuente
elif
es redundante debido a la palabra de retorno, pero le brinda más información sin tener que buscarreturn
. Pero solo soy yo, si hay una violación del estilo PEP, la cambiaría. Sin ninguna otra restricción, siempre debemos buscar legibilidad (y los estándares lo hacen). Gracias por el aviso y comentario interesante!Un dict (realmente, un defaultdict) te da una manera bastante fácil de hacer este truco:
Es realmente fácil adaptar este método al comportamiento de conversión exacto que desee: puede completarlo con los valores de Verdad y Falsificación permitidos y dejar que genere una excepción (o que devuelva Ninguno) cuando no se encuentra un valor, o el valor predeterminado es Verdadero, o predeterminado a False, o lo que quieras.
fuente
Probablemente ya tenga una solución, pero para otros que buscan un método para convertir un valor en un valor booleano utilizando valores falsos "estándar" que incluyen Ninguno, [], {} y "" además de falso, no y 0 .
fuente
not in
y su selección de elementos falsos es algo idiosincrásico.Simplemente puede usar la función incorporada eval () :
y la salida:
fuente
Otra opción
Pero en producción si no necesita ansible y todas sus dependencias, una buena idea es mirar su código fuente y copiar parte de la lógica que necesita.
fuente
La regla habitual para la fundición a un bool es que unos literales especiales (
False
,0
,0.0
,()
,[]
,{}
) son falsas y luego todo lo demás es cierto, por lo que recomiendo lo siguiente:fuente
Esta es la versión que escribí. Combina varias de las otras soluciones en una.
Si obtiene una cadena, espera valores específicos, de lo contrario genera una excepción. Si no obtiene una cadena, simplemente deja que el constructor bool lo descubra. Probado estos casos:
fuente
str
lugar detype('')
Si sabe que su entrada será "Verdadero" o "Falso", entonces, ¿por qué no usar:
fuente
if s else False
bit. Piensa en cómo"False" == "True"
ya volveráFalse
.if type(s) is bool: return s
.yo suelo
fuente
Me gusta usar el operador ternario para esto, ya que es un poco más sucinto para algo que parece que no debería ser más de 1 línea.
fuente
Me doy cuenta de que esta es una publicación antigua, pero algunas de las soluciones requieren bastante código, esto es lo que terminé usando:
fuente
Utilice el paquete str2bool
pip install str2bool
fuente
Si te gusto solo necesitas boolean de variable que es string. Puede usar destilaciones como se mencionó anteriormente por @jzwiener. Sin embargo, no pude importar y usar el módulo como él sugirió.
En cambio, termino usándolo de esta manera en python3.7
distutils es parte de python std lib, por lo que no es necesario instalarlo. ¡Lo cual es genial! 👍
fuente
Me gustaría compartir mi solución simple: use el
eval()
. Convertirá la cadenaTrue
yFalse
al tipo booleano adecuado SI la cadena está exactamente en formato de títuloTrue
oFalse
siempre en primera letra mayúscula o la función generará un error.p.ej
Por supuesto, para la variable dinámica, puede usar simplemente
.title()
para formatear la cadena booleana.Esto arrojará un error.
fuente
Aquí hay una forma peluda, construida para obtener muchas de las mismas respuestas. Tenga en cuenta que, aunque Python considera
""
que es falso y todas las demás cadenas son verdaderas, TCL tiene una idea muy diferente sobre las cosas.Lo bueno de esto es que es bastante indulgente con los valores que puede usar. Es perezoso sobre convertir cadenas en valores, y es higiénico sobre lo que acepta y rechaza (tenga en cuenta que si la declaración anterior se diera en un indicador tcl, borraría el disco duro de los usuarios).
Lo malo es que requiere que Tkinter esté disponible, lo que generalmente es, pero no universalmente cierto, y más significativamente, requiere que se cree una instancia de Tk, que es relativamente pesada.
Lo que se considera verdadero o falso depende del comportamiento de la
Tcl_GetBoolean
, que considera0
,false
,no
yoff
que es falso y1
,true
,yes
yon
es cierto, mayúsculas y minúsculas. Cualquier otra cadena, incluida la cadena vacía, causa una excepción.fuente
idea: verifique si desea que la cadena se evalúe como False; de lo contrario, bool () devuelve True para cualquier cadena no vacía.
fuente
Aquí hay algo que reuní para evaluar la veracidad de una cadena:
más o menos los mismos resultados que usar
eval
pero más seguro.fuente
Solo tenía que hacer esto ... así que tal vez tarde para la fiesta, pero alguien puede encontrarlo útil
fuente
Si tiene control sobre la entidad que devuelve
true
/false
, una opción es hacer que devuelva1
/ en0
lugar detrue
/false
, entonces:boolean_response = bool(int(response))
La conversión adicional a
int
maneja las respuestas de una red, que siempre son cadenas.fuente
Mediante el uso de la función incorporada de Python
eval()
y el.capitalize()
método, puede convertir cualquier cadena "verdadera" / "falsa" (independientemente de las mayúsculas iniciales) en un verdadero booleano de Python.Por ejemplo:
fuente
#\nshutil.rmtree('/someImportantDirectory')
? (¡No lo intentes!)eval
algo así de simple es solo pedir una vulnerabilidad.eval
esas cadenas podría ayudar a alguien a hacerse cargo de todo el sistema.