Convertendo de uma string para booleano em Python?

745

Alguém sabe como converter de uma string para um booleano em Python? Encontrei este link . Mas não parece uma maneira adequada de fazer isso. Ou seja, usando a funcionalidade incorporada, etc.

A razão pela qual estou perguntando isso é porque aprendi sobre int("string")aqui. Mas ao tentar, bool("string")ele sempre retorna True:

>>> bool("False")
True
Joan Venge
fonte
2
Eu criei uma micro-biblioteca apenas para isso, que também incluiu algumas palavras estrangeiras, como "tak" para polonês, "'是 的" em mandarim-chinês será avaliado como True . Caso contrário, o true-ish será avaliado como False . Sugestões são bem vindas. Link do Github: github.com/kmonsoor/str2bool
kmonsoor
18
Em vez de reinventar a roda e escrever um monte de código com o qual você precisa carregar o culto, a resposta do @ jzwiener usa uma função da biblioteca padrão do pythondistutils.util.strtobool(some_string) . Tecnicamente, a saída é do tipo intcom valor 0ou 1-> se você realmente deseja / precisa bool, pode envolver essa função com bool(distutils.util.strtobool(some_string)).
Trevor Boyd Smith
1
pip install str2bool
Symon
Apenas um aviso. distutils.util.strtoboolnão pode lidar com sim / não estrangeiro, diferentemente da solução de @kmonsoor, que no entanto não pode lidar com arquivos CSV criados pelo Excel com True / False em um idioma estrangeiro (por exemplo VERO, FALSO). Portanto, às vezes é necessária a reinvenção da roda.
Matteo Ferla

Respostas:

838

Realmente, você apenas compara a string com o que espera aceitar como representando true, para fazer isso:

s == 'True'

Ou para verificar um monte de valores:

s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

Seja cauteloso ao usar o seguinte:

>>> bool("foo")
True
>>> bool("")
False

Seqüências vazias são avaliadas como False, mas todo o resto é avaliado True. Portanto, isso não deve ser usado para nenhum tipo de finalidade de análise.

Keith Gaughan
fonte
48
+1: não muito poderia ser mais simples que s == "True". Mas já vi pessoas fazendo uma bagunça real disso. def convert (s): se s == "True": retorna True; retorna falso.
S.Lott
24
Eu prefiro retorno s == "True" sobre o if / else
Dana
26
if s == "True": return True elif s == "False": return False else: return raise
Unknown
9
Analisando strings para booleans já está implementado em distutils.util.strtobool: stackoverflow.com/a/18472142/923599
jzwiener
9
Sei que esse é um tópico REALMENTE antigo, mas queria atestar que passei 4 horas tentando depurar meu código. Meu erro foi tentar lançar bool("False"). Ele sempre será lançado para True.
Ev.
304

Usar:

bool(distutils.util.strtobool(some_string))

Os valores verdadeiros são y, sim, t, verdadeiro, ativado e 1; valores falsos são n, não, f, falso, desligado e 0. Gera ValueError se val for outra coisa.

Esteja ciente de que distutils.util.strtobool()retorna representações inteiras e, portanto, ele precisa ser agrupado bool()para obter valores booleanos.

jzwiener
fonte
38
Infelizmente, este retorna 1/ 0não True/ False, então você precisa para embrulhar o resultado em bool () para obter boolean real:bool(distutils.util.strtobool(some_string))
Mariusz Jamro
2
Essa função é tentadora. Seria perfeito se tratado inteiros e Nonee str(None)como entrada.
MarkHu
20
Eu prefiro isso às respostas mais votadas ... é do stdlib e faz exatamente o que é necessário. Geralmente, não há razão para precisar de um real em boolvez de 1/ 0desde que você não esteja fazendo coisas ruins como if x == False... e se você está lidando com ints e Nones, não precisa de uma função especial, basta vê-los diretamente if myint:ouif not maybe_none_var:
Anentropic
4
O @Secator boolé uma subclasse deint
Anentropic
2
Para poupar a alguém alguns erros no Google: importe distutils e importe distutils.util para que isso funcione.
Edward B.
267
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

Então chame assim:

>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False

Manipulando true e false explicitamente:

Você também pode fazer com que sua função verifique explicitamente uma lista de palavras Verdadeira e uma lista de palavras Falsas. Então, se não estiver em nenhuma das listas, você poderá lançar uma exceção.

Brian R. Bondy
fonte
29
pouco aprimoramento pode ser feito usando, str (v) .lower () em vez de v.lower () . Então, ele pode funcionar mesmo que não seja string, por exemplo, 1, 0
kmonsoor 5/15
RE: manipulando true / false explicitamente, você também pode fornecer um valor padrão se a string não corresponder, da mesma forma que os prompts de linha de comando true / false funcionam: Continuar? (s / N)
Johnus 03/03
113

O analisador JSON também é útil para a conversão geral de cadeias de caracteres em tipos de python razoáveis.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
Alan Marchiori
fonte
31
Observe que esse método só funciona se estiver em minúsculas. Se for maiúsculo, você não pode. Você deve ligar.lower()
CppLearner
107

Começando com o Python 2.6, agora existe ast.literal_eval:

>>> import ast
>>> ajuda (ast.literal_eval)
Ajuda na função literal_eval no módulo ast:

literal_eval (node_or_string)
    Avalie com segurança um nó de expressão ou uma sequência que contém um Python
    expressão. A cadeia ou nó fornecido pode consistir apenas nos seguintes
    Estruturas literais em Python: strings, números, tuplas, listas, dictes, booleanos,
    e nenhum.

O que parece funcionar, desde que você tenha certeza de que suas strings serão "True"ou "False":

>>> ast.literal_eval ("True")
Verdade
>>> ast.literal_eval ("False")
Falso
>>> ast.literal_eval ("F")
Traceback (última chamada mais recente):
  Arquivo "", linha 1, em 
  Arquivo "/opt/Python-2.6.1/lib/python2.6/ast.py", linha 68, em literal_eval
    retornar _convert (node_or_string)
  Arquivo "/opt/Python-2.6.1/lib/python2.6/ast.py", linha 67, em _convert
    raise ValueError ('string malformada')
ValueError: string malformada
>>> ast.literal_eval ("'False'")
'Falso'

Normalmente, eu não recomendaria isso, mas é completamente integrado e pode ser a coisa certa, dependendo de seus requisitos.

Jacob Gabrielson
fonte
1
Não tenho certeza da aplicabilidade geral desta solução, mas é muito bom, de uma maneira geral. +1!
SingleNegationElimination
3
Gaah, isso é horrível! Então, novamente, você me dizer que você não recomendo, e não responder à pergunta ordenadamente. Boa descoberta!
Vanessa Phipps
4
Infelizmente, ele não lida com esse caso >>> ast.literal_eval ('true') ou ast.literal_eval ('TRUE') Gera >>> raise ValueError ('malformaed string') A correção é simples no ast.literal_eval (to_test .title ())
Bhushan
Não é uma ótima solução para essa questão em particular, mas ... Uau, literal_eval é muito útil! String para listar, ditar, ect.
travc
Funciona em unicodes para? Na minha visão do Django, eu tenho um valor recebido que eu quero mudar para booleano, está dando uma exceção de string malformada.
Prakhar Mohan Srivastava
48

Se você souber que a string será um "True"ou "False", você pode simplesmente usar eval(s).

>>> eval("True")
True
>>> eval("False")
False

Apenas use isso se tiver certeza do conteúdo da string, pois isso gerará uma exceção se a string não contiver Python válido e também executará o código contido na string.

Joel Croteau
fonte
5
essa corda virá de algum lugar. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Nurettin
4
@ Nurettin, daí o meu comentário sobre apenas usá-lo se você tiver certeza do conteúdo da string.
Joel Croteau 24/02/19
17

Esta versão mantém a semântica de construtores como int (value) e fornece uma maneira fácil de definir valores aceitáveis ​​de string.

def to_bool(value):
    valid = {'true': True, 't': True, '1': True,
             'false': False, 'f': False, '0': False,
             }   

    if isinstance(value, bool):
        return value

    if not isinstance(value, basestring):
        raise ValueError('invalid literal for boolean. Not a string.')

    lower_value = value.lower()
    if lower_value in valid:
        return valid[lower_value]
    else:
        raise ValueError('invalid literal for boolean: "%s"' % value)


# Test cases
assert to_bool('true'), '"true" is True' 
assert to_bool('True'), '"True" is True' 
assert to_bool('TRue'), '"TRue" is True' 
assert to_bool('TRUE'), '"TRUE" is True' 
assert to_bool('T'), '"T" is True' 
assert to_bool('t'), '"t" is True' 
assert to_bool('1'), '"1" is True' 
assert to_bool(True), 'True is True' 
assert to_bool(u'true'), 'unicode "true" is True'

assert to_bool('false') is False, '"false" is False' 
assert to_bool('False') is False, '"False" is False' 
assert to_bool('FAlse') is False, '"FAlse" is False' 
assert to_bool('FALSE') is False, '"FALSE" is False' 
assert to_bool('F') is False, '"F" is False' 
assert to_bool('f') is False, '"f" is False' 
assert to_bool('0') is False, '"0" is False' 
assert to_bool(False) is False, 'False is False'
assert to_bool(u'false') is False, 'unicode "false" is False'

# Expect ValueError to be raised for invalid parameter...
try:
    to_bool('')
    to_bool(12)
    to_bool([])
    to_bool('yes')
    to_bool('FOObar')
except ValueError, e:
    pass
Michael Richmond
fonte
3
Lembrar: O seu último "caso de teste" irá errar na primeira chamada e não testar as outras. Além disso, ele não falhará se um erro não for gerado.
Aug
12

Aqui está a minha versão. Ele verifica as listas de valores positivos e negativos, gerando uma exceção para valores desconhecidos. E ele não recebe uma string, mas qualquer tipo deve receber.

def to_bool(value):
    """
       Converts 'something' to boolean. Raises exception for invalid formats
           Possible True  values: 1, True, "1", "TRue", "yes", "y", "t"
           Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
    """
    if str(value).lower() in ("yes", "y", "true",  "t", "1"): return True
    if str(value).lower() in ("no",  "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
    raise Exception('Invalid value for boolean conversion: ' + str(value))

Amostras de execuções:

>>> to_bool(True)
True
>>> to_bool("tRUe")
True
>>> to_bool("1")
True
>>> to_bool(1)
True
>>> to_bool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: 2
>>> to_bool([])
False
>>> to_bool({})
False
>>> to_bool(None)
False
>>> to_bool("Wasssaaaaa")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: Wasssaaaaa
>>>
Petrucio
fonte
Pode-se ser mordido por esta: to_bool(["hello"])o que deve ser uma chamada perfeitamente válida, se []é suportado
Rafael T
1
Retorna "Exceção: valor inválido para conversão booleana: ['hello']", que é esperado e documentado. Na minha opinião, uma lista vazia era claramente falsa, mas ['false'] não era claramente nada, então deixei de fora intencionalmente - esse é um recurso, não um bug. Deve ser fácil adicionar suporte para retornar true para listas não vazias, se é isso que você deseja.
Petrucio 5/03/13
1
Shure você documentou. Mas, na vida real, nunca se ligaria to_bool([]). Em vez disso, ele faria algo assim: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... ´ para que alguém tenha uma lista e queira saber se essa lista é None ou vazia.
Rafael T
Por que não tentar isso: >>> def a2b (arg): ... default = bool (arg) ... if isinstance (arg, str): ... retorne arg.lower () em ['true', ' t ',' yes ',' y ',' 1 '] ... else: ... retornar padrão
ThePracticalOne
5
Ponto secundário : você provavelmente deve preferir ValueError em vez de uma exceção simples.
precisa saber é o seguinte
10

você sempre pode fazer algo como

myString = "false"
val = (myString == "true")

o bit em parens seria avaliado como False. Esta é apenas outra maneira de fazer isso sem precisar fazer uma chamada de função real.

helloandre
fonte
1
O que a val = "false"linha está fazendo neste exemplo? Por que está aí? O que isso significa?
S.Lott
9
Acho que significa 42.
Geo
@ Geo: eu concordo; mas qual foi a pergunta respondida por essa afirmação?
S.Lott
isso exatamente o que eu estava procurando, avaliando um campo de entrada de um arquivo e com base no resultado armazenando um booleano. obrigado.
jimh
9

Um truque legal e simples (baseado no que Alan Marchiori postou), mas usando o yaml:

import yaml

parsed = yaml.load("true")
print bool(parsed)

Se for muito amplo, poderá ser refinado testando o resultado do tipo. Se o tipo retornado pelo yaml for um str, ele não poderá ser convertido para outro tipo (que eu possa pensar de qualquer maneira), para que você possa lidar com isso separadamente ou apenas permitir que seja verdade.

Eu não vou fazer nenhuma suposição em alta velocidade, mas como eu estou trabalhando com dados yaml no Qt gui de qualquer maneira, isso tem uma simetria agradável.

Rafe
fonte
1
O yamlmódulo é uma biblioteca de terceiros: PyYAML
Peter Wood
8

Não concordo com nenhuma solução aqui, pois elas são permissivas demais. Normalmente, isso não é o que você deseja ao analisar uma string.

Então, aqui a solução que estou usando:

def to_bool(bool_str):
    """Parse the string and return the boolean value encoded or raise an exception"""
    if isinstance(bool_str, basestring) and bool_str: 
        if bool_str.lower() in ['true', 't', '1']: return True
        elif bool_str.lower() in ['false', 'f', '0']: return False

    #if here we couldn't parse it
    raise ValueError("%s is no recognized as a boolean value" % bool_str)

E os resultados:

>>> [to_bool(v) for v in ['true','t','1','F','FALSE','0']]
[True, True, True, False, False, False]
>>> to_bool("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in to_bool
ValueError: '' is no recognized as a boolean value

Só para ficar claro, porque parece que minha resposta ofendeu alguém de alguma forma:

O ponto é que você não deseja testar apenas um valor e assumir o outro. Eu não acho que você sempre queira mapear Absolutamente tudo para o valor não analisado. Isso produz código propenso a erros.

Portanto, se você souber o que deseja codificar.

estani
fonte
2
Acho que você está perdendo o ponto: o objetivo das respostas era demonstrar o princípio geral, não dizer à pessoa que fez a pergunta exatamente como deveria fazê-lo. A pessoa que fez a pergunta originalmente estava pensando demais sobre o que é realmente um problema simples.
Keith Gaughan
8
@ Keith Eu discordo. O ponto é responder à pergunta como ela é solicitada.
estani
1
A pergunta feita foi como converter uma string em um booleano. Essa foi a pergunta que eu respondi. Não faço ideia do que é considerado uma string booleana válida para o pôster original e você também não. É por isso que é mais importante demonstrar o princípio geral do que dar ao cartaz a resposta completa. O pôster original não precisava de tudo explicitado: tudo que eles precisavam era que o princípio geral fosse demonstrado. A partir disso, qualquer pessoa competente chegará à sua resposta.
Keith Gaughan
2
@dshepherd, a instituição está aí para ter certeza de que estou analisando o que espero. Estou analisando strings para um método car_race.lower () que, por acaso, retorna '1' não deve retornar true, ele deve gerar um ValueError. Mas isso pode ser suficiente em outros casos.
Estani
2
@CivFan ponto interessante. Embora eu tenha tentado, e não tenha sido tão bom (para mim). elifé redundante devido à palavra de retorno, mas fornece mais informações sem a necessidade de procurar return. Mas isso é só comigo, se houver uma violação do estilo PEP, eu mudaria. Sem qualquer outra restrição, devemos sempre buscar a legibilidade (e os padrões fazem isso). Obrigado pelo alerta e comentário interessante!
Estani
7

Um ditado (realmente, um padrão) fornece uma maneira bastante fácil de fazer esse truque:

from collections import defaultdict
bool_mapping = defaultdict(bool) # Will give you False for non-found values
for val in ['True', 'yes', ...]:
    bool_mapping[val] = True

print(bool_mapping['True']) # True
print(bool_mapping['kitten']) # False

É realmente fácil adaptar esse método ao comportamento exato de conversão desejado - você pode preenchê-lo com os valores permitidos de Truthy e Falsy e gerar uma exceção (ou retornar None) quando um valor não for encontrado ou o padrão é True, ou o padrão é False, ou o que você quiser.

Nate
fonte
5

Você provavelmente já possui uma solução, mas para outras pessoas que procuram um método para converter um valor em um valor booleano usando valores falsos "padrão", incluindo Nenhum, [], {} e "", além de falso, não e 0 .

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems
Chris McMillan
fonte
1
é melhor usar conjuntos not ine sua seleção de itens falsos é um tanto idiossincrática.
SilentGhost 15/01
5

Você pode simplesmente usar a função interna eval () :

a='True'
if a is True:
    print 'a is True, a type is', type(a)
else:
    print "a isn't True, a type is", type(a)
b = eval(a)
if b is True:
    print 'b is True, b type is', type(b)
else:
    print "b isn't True, b type is", type(b)

e a saída:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>
lumartor
fonte
1
Isso funciona apenas quando os valores testados são python válidos. "true" e "false" gerarão uma exceção.
Gordon Bean
13
Além disso, é um péssimo hábito usar 'eval' para análise, porque eval executará código arbitrário na string. Em algumas situações, isso pode apresentar um enorme conjunto de segurança.
Christopher Barber
7
Esta é uma resposta muito ruim. Avaliar uma expressão arbitrária para analisar um booleano NÃO é uma boa abordagem.
Aug
5

Mais uma opção

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

Mas, na produção, se você não precisar do ansible e de todas as suas dependências, uma boa idéia é examinar o código-fonte e copiar parte da lógica necessária.

Maciej Kucia
fonte
4

A regra habitual para lançar a um bool é que algumas literais especiais ( False, 0, 0.0, (), [], {}) são falsas e, em seguida, tudo o resto é verdadeiro, então eu recomendo o seguinte:

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)
Carl G
fonte
3

Esta é a versão que escrevi. Combina várias das outras soluções em uma.

def to_bool(value):
    """
    Converts 'something' to boolean. Raises exception if it gets a string it doesn't handle.
    Case is ignored for strings. These string values are handled:
      True: 'True', "1", "TRue", "yes", "y", "t"
      False: "", "0", "faLse", "no", "n", "f"
    Non-string values are passed to bool.
    """
    if type(value) == type(''):
        if value.lower() in ("yes", "y", "true",  "t", "1"):
            return True
        if value.lower() in ("no",  "n", "false", "f", "0", ""):
            return False
        raise Exception('Invalid value for boolean conversion: ' + value)
    return bool(value)

Se obtiver uma string, espera valores específicos, caso contrário, gera uma exceção. Se ele não receber uma string, deixe o construtor bool descobrir isso. Testou estes casos:

test_cases = [
    ('true', True),
    ('t', True),
    ('yes', True),
    ('y', True),
    ('1', True),
    ('false', False),
    ('f', False),
    ('no', False),
    ('n', False),
    ('0', False),
    ('', False),
    (1, True),
    (0, False),
    (1.0, True),
    (0.0, False),
    ([], False),
    ({}, False),
    ((), False),
    ([1], True),
    ({1:2}, True),
    ((1,), True),
    (None, False),
    (object(), True),
    ]
Tom Ekberg
fonte
Use em strvez detype('')
pppery 10/05
3

Se você sabe que sua entrada será "True" ou "False", por que não usar:

def bool_convert(s):
    return s == "True"
Daniel van Flymen
fonte
Você realmente não precisa da parte if s else False. Pense em como "False" == "True"já retornará False.
Taylor Edmiston
Se você não tiver certeza se a entrada s é uma sequência ou já é booleano, você pode adicionar if type(s) is bool: return s.
kontur
3

eu uso

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""
MrHIDEn
fonte
2

Eu gosto de usar o operador ternário para isso, pois é um pouco mais sucinto para algo que parece que não deve ter mais do que 1 linha.

True if myString=="True" else False
Clayton Rabenda
fonte
1
Como é mais sucinto do que my_string == 'True'?
S. de Melo
2

Sei que este é um post antigo, mas algumas das soluções exigem bastante código, eis o que acabei usando:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)
Ron E
fonte
7
Isso é funcionalmente equivalente a, e mais complexo que: valor de retorno em ('True', 'true')
Keith Gaughan 28/08/13
1

Use o pacote str2bool pip install str2bool

Diretor
fonte
1

Se você gosta de mim só precisa booleano da variável que é string. Você pode usar destiladores conforme mencionado anteriormente por @jzwiener. No entanto, não consegui importar e usar o módulo como ele sugeriu.

Em vez disso, acabo usando dessa maneira no python3.7

distutils string para bool em python

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

O distutils faz parte da python std lib, portanto não há necessidade de instalação. O que é ótimo! 👍

Gunay Anach
fonte
1

Gostaria de compartilhar minha solução simples: use o eval(). Ele converterá a string Truee Falsepara o tipo booleano apropriado, se a string estiver exatamente no formato de título TrueouFalse sempre em maiúscula na primeira letra, ou a função gerará um erro.

por exemplo

>>> eval('False')
False

>>> eval('True')
True

Obviamente, para variável dinâmica, você pode simplesmente usar o .title()para formatar a string booleana.

>>> x = 'true'
>>> eval(x.title())
True

Isso gerará um erro.

>>> eval('true')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined
Roel
fonte
0

aqui está um cabeludo, construído de maneira a obter muitas das mesmas respostas. Observe que, embora o python considere ""falso e todas as outras strings verdadeiras, o TCL tem uma idéia muito diferente sobre as coisas.

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> var = Tkinter.BooleanVar(tk)
>>> var.set("false")
>>> var.get()
False
>>> var.set("1")
>>> var.get()
True
>>> var.set("[exec 'rm -r /']")
>>> var.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 324, in get
    return self._tk.getboolean(self._tk.globalgetvar(self._name))
_tkinter.TclError: 0expected boolean value but got "[exec 'rm -r /']"
>>> 

Uma coisa boa disso é que ele perdoa razoavelmente os valores que você pode usar. É preguiçoso em transformar strings em valores e é higiênico em relação ao que aceita e rejeita (observe que, se a declaração acima fosse dada em um prompt de tcl, isso apagaria o disco rígido do usuário).

o ruim é que exige que o Tkinter esteja disponível, o que geralmente é, mas não universalmente verdadeiro, e mais significativamente, exige a criação de uma instância do Tk, que é comparativamente pesada.

O que é considerado verdadeiro ou falso depende do comportamento do Tcl_GetBooleanque considera 0, false, noe offpara ser falso e 1, true, yese onpara ser verdade, insensível caso. Qualquer outra sequência, incluindo a sequência vazia, causa uma exceção.

SingleNegationElimination
fonte
0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

idéia: verifique se deseja que a string seja avaliada como False; caso contrário, bool () retorna True para qualquer string não vazia.

xvga
fonte
0

Aqui está uma coisa que juntei para avaliar a veracidade de uma string:

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

mais ou menos os mesmos resultados que o uso, evalmas mais seguros.

tylerl
fonte
0

Eu só tinha que fazer isso ... então talvez esteja atrasado para a festa - mas alguém pode achar útil

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default
Rcynic
fonte
0

Se você tiver controle sobre a entidade que está retornando true/ false, uma opção é fazer com que ela retorne 1/ em 0vez de true/ false, então:

boolean_response = bool(int(response))

A conversão extra para intlidar com respostas de uma rede, que são sempre string.

Sam Malayek
fonte
-5

Usando a função interna do Python eval()e o .capitalize()método, você pode converter qualquer string "true" / "false" (independentemente da capitalização inicial) em um verdadeiro booleano do Python.

Por exemplo:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>
elPastor
fonte
4
O que acontece, se a string contiver #\nshutil.rmtree('/someImportantDirectory')? (Não tente isso!)
Mašťov
@mastov - voto negativo ridículo. Obviamente, se você não tem controle da cadeia de caracteres recebida, é necessário tomar precauções, como faria com qualquer código. Mas se você controla o fluxo de trabalho, esta é uma solução simples que funciona. Não confunda uma solução que não é perfeita em todos os sentidos com uma resposta ruim.
ElPastor
1
Além de não mencionar os perigos (o que já faz com que essa seja uma resposta ruim): você está propondo higienizar a entrada de antemão? Isso matará a simplicidade desse método, que era sua principal vantagem.
Mašťov
4
Usar evalalgo simples assim é apenas pedir uma vulnerabilidade.
Mašťov
1
Nem todo o código. Mas especialmente o código que converte seqüências de caracteres para outros tipos geralmente está fora de seu controle. Muitas vezes você pode nem perceber. Você pode dizer: "É meu banco de dados (ou arquivo de configuração), faz parte do meu sistema, sob meu controle". Em seguida, você concede a algum outro módulo acesso a um banco de dados porque: "Qual é o problema? São apenas algumas tabelas com seqüências de caracteres". Mas com evalessas seqüências de caracteres pode ajudar alguém a dominar todo o sistema.
Mašťov