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
distutils.util.strtobool(some_string)
. Tecnicamente, a saída é do tipoint
com valor0
ou1
-> se você realmente deseja / precisabool
, pode envolver essa função combool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
nã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 exemploVERO
,FALSO
). Portanto, às vezes é necessária a reinvenção da roda.Respostas:
Realmente, você apenas compara a string com o que espera aceitar como representando true, para fazer isso:
Ou para verificar um monte de valores:
Seja cauteloso ao usar o seguinte:
Seqüências vazias são avaliadas como
False
, mas todo o resto é avaliadoTrue
. Portanto, isso não deve ser usado para nenhum tipo de finalidade de análise.fonte
s == "True"
. Mas já vi pessoas fazendo uma bagunça real disso. def convert (s): se s == "True": retorna True; retorna falso.bool("False")
. Ele sempre será lançado paraTrue
.Usar:
Esteja ciente de que
distutils.util.strtobool()
retorna representações inteiras e, portanto, ele precisa ser agrupadobool()
para obter valores booleanos.fonte
1
/0
nãoTrue
/False
, então você precisa para embrulhar o resultado em bool () para obter boolean real:bool(distutils.util.strtobool(some_string))
None
estr(None)
como entrada.bool
vez de1
/0
desde que você não esteja fazendo coisas ruins comoif x == False
... e se você está lidando comint
s eNone
s, não precisa de uma função especial, basta vê-los diretamenteif myint:
ouif not maybe_none_var:
bool
é uma subclasse deint
Então chame assim:
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.
fonte
O analisador JSON também é útil para a conversão geral de cadeias de caracteres em tipos de python razoáveis.
fonte
.lower()
Começando com o Python 2.6, agora existe
ast.literal_eval
:O que parece funcionar, desde que você tenha certeza de que suas strings serão
"True"
ou"False"
:Normalmente, eu não recomendaria isso, mas é completamente integrado e pode ser a coisa certa, dependendo de seus requisitos.
fonte
Se você souber que a string será um
"True"
ou"False"
, você pode simplesmente usareval(s)
.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.
fonte
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
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.
fonte
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.
Amostras de execuções:
fonte
to_bool(["hello"])
o que deve ser uma chamada perfeitamente válida, se[]
é suportadoto_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.você sempre pode fazer algo como
o bit em parens seria avaliado como False. Esta é apenas outra maneira de fazer isso sem precisar fazer uma chamada de função real.
fonte
val = "false"
linha está fazendo neste exemplo? Por que está aí? O que isso significa?Um truque legal e simples (baseado no que Alan Marchiori postou), mas usando o yaml:
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.
fonte
yaml
módulo é uma biblioteca de terceiros: PyYAMLNã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:
E os resultados:
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.
fonte
elif
é redundante devido à palavra de retorno, mas fornece mais informações sem a necessidade de procurarreturn
. 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!Um ditado (realmente, um padrão) fornece uma maneira bastante fácil de fazer esse truque:
É 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.
fonte
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 .
fonte
not in
e sua seleção de itens falsos é um tanto idiossincrática.Você pode simplesmente usar a função interna eval () :
e a saída:
fonte
Mais uma opção
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.
fonte
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:fonte
Esta é a versão que escrevi. Combina várias das outras soluções em uma.
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:
fonte
str
vez detype('')
Se você sabe que sua entrada será "True" ou "False", por que não usar:
fonte
if s else False
. Pense em como"False" == "True"
já retornaráFalse
.if type(s) is bool: return s
.eu uso
fonte
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.
fonte
Sei que este é um post antigo, mas algumas das soluções exigem bastante código, eis o que acabei usando:
fonte
Use o pacote str2bool
pip install str2bool
fonte
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
O distutils faz parte da python std lib, portanto não há necessidade de instalação. O que é ótimo! 👍
fonte
Gostaria de compartilhar minha solução simples: use o
eval()
. Ele converterá a stringTrue
eFalse
para o tipo booleano apropriado, se a string estiver exatamente no formato de títuloTrue
ouFalse
sempre em maiúscula na primeira letra, ou a função gerará um erro.por exemplo
Obviamente, para variável dinâmica, você pode simplesmente usar o
.title()
para formatar a string booleana.Isso gerará um erro.
fonte
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.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_GetBoolean
que considera0
,false
,no
eoff
para ser falso e1
,true
,yes
eon
para ser verdade, insensível caso. Qualquer outra sequência, incluindo a sequência vazia, causa uma exceção.fonte
idéia: verifique se deseja que a string seja avaliada como False; caso contrário, bool () retorna True para qualquer string não vazia.
fonte
Aqui está uma coisa que juntei para avaliar a veracidade de uma string:
mais ou menos os mesmos resultados que o uso,
eval
mas mais seguros.fonte
Eu só tinha que fazer isso ... então talvez esteja atrasado para a festa - mas alguém pode achar útil
fonte
Se você tiver controle sobre a entidade que está retornando
true
/false
, uma opção é fazer com que ela retorne1
/ em0
vez detrue
/false
, então:boolean_response = bool(int(response))
A conversão extra para
int
lidar com respostas de uma rede, que são sempre string.fonte
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:
fonte
#\nshutil.rmtree('/someImportantDirectory')
? (Não tente isso!)eval
algo simples assim é apenas pedir uma vulnerabilidade.eval
essas seqüências de caracteres pode ajudar alguém a dominar todo o sistema.