Quelqu'un sait-il comment convertir une chaîne en un booléen en Python? J'ai trouvé ce lien . Mais cela ne semble pas être une bonne façon de procéder. C'est-à-dire en utilisant des fonctionnalités intégrées, etc.
La raison pour laquelle je pose cette question, c'est parce que j'ai appris int("string")
d'ici. Mais en essayant, bool("string")
il revient toujours True
:
>>> bool("False")
True
distutils.util.strtobool(some_string)
. Techniquement, la sortie est de typeint
avec valeur0
ou1
-> si vous voulez vraiment / besoin,bool
vous pouvez envelopper cette fonction avecbool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
ne peut pas gérer les oui / non étrangers, contrairement à la solution de @kmonsoor, qui ne peut cependant pas gérer les fichiers CSV créés par Excel avec True / False dans une langue étrangère (par exempleVERO
,FALSO
). La réinvention des roues est donc parfois nécessaire.Réponses:
Vraiment, vous comparez simplement la chaîne à tout ce que vous pensez accepter comme représentant vrai, vous pouvez donc faire ceci:
Ou pour vérifier par rapport à tout un tas de valeurs:
Soyez prudent lorsque vous utilisez les éléments suivants:
Les chaînes vides sont évaluées à
False
, mais tout le reste est évalué àTrue
. Donc, cela ne doit pas être utilisé à des fins d'analyse.la source
s == "True"
. Mais j'ai vu des gens en faire un vrai bordel. conversion (s) par défaut: if s == "True": return True; retourne faux.bool("False")
. Il sera toujours jeté surTrue
.Utilisation:
Sachez que
distutils.util.strtobool()
renvoie des représentations entières et qu'il doit donc être encapsulébool()
pour obtenir des valeurs booléennes.la source
1
/0
nonTrue
/False
, vous devez donc envelopper le résultat dans bool () pour obtenir un booléen réel:bool(distutils.util.strtobool(some_string))
None
etstr(None)
en entrée.bool
au lieu de1
/0
tant que vous ne faites pas de mauvaises choses commeif x == False
... et si vous traitez avecint
s etNone
s vous n'avez pas besoin d'une fonction spéciale, vous pouvez simplement les vérifier directementif myint:
ouif not maybe_none_var:
bool
est une sous-classe deint
Appelez-le ainsi:
Gérer explicitement le vrai et le faux:
Vous pouvez également faire en sorte que votre fonction vérifie explicitement une vraie liste de mots et une fausse liste de mots. Si elle ne figure dans aucune des deux listes, vous pouvez lever une exception.
la source
L'analyseur JSON est également utile pour en général convertir des chaînes en types python raisonnables.
la source
.lower()
Depuis Python 2.6, il y a maintenant
ast.literal_eval
:Ce qui semble fonctionner, tant que vous êtes sûr que vos cordes seront soit
"True"
ou"False"
:Je ne recommanderais normalement pas cela, mais il est entièrement intégré et pourrait être la bonne chose en fonction de vos besoins.
la source
Si vous savez que la chaîne sera soit
"True"
ou"False"
, vous pouvez simplement utilisereval(s)
.N'utilisez cela que si vous êtes sûr du contenu de la chaîne, car il lèvera une exception si la chaîne ne contient pas de Python valide et exécutera également le code contenu dans la chaîne.
la source
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Cette version conserve la sémantique des constructeurs comme int (valeur) et fournit un moyen simple de définir des valeurs de chaîne acceptables.
la source
Voici ma version. Il vérifie les listes de valeurs positives et négatives, levant une exception pour les valeurs inconnues. Et il ne reçoit pas de chaîne, mais tout type devrait le faire.
Exemples de cycles:
la source
to_bool(["hello"])
qui devrait être un appel parfaitement valide, s'il[]
est pris en chargeto_bool([])
. Au lieu de cela, il ferait quelque chose dans ce sens:myList=someFunctionThatReturnAList
`if (is_bool (myList)): ... ´ donc on a une liste et on veut savoir si cette liste est None ou vide.vous pourriez toujours faire quelque chose comme
le bit en parens serait évalué à faux. C'est juste une autre façon de le faire sans avoir à faire un véritable appel de fonction.
la source
val = "false"
ligne sur cet exemple? Pourquoi est-il là? Qu'est-ce que ça veut dire?Un truc cool et simple (basé sur ce que @Alan Marchiori a publié), mais en utilisant yaml:
S'il est trop large, il peut être affiné en testant le résultat du type. Si le type renvoyé par yaml est une chaîne, il ne peut pas être converti en un autre type (auquel je peux penser de toute façon), vous pouvez donc le gérer séparément, ou simplement le laisser être vrai.
Je ne ferai aucune supposition à la vitesse, mais puisque je travaille avec des données yaml sous Qt gui de toute façon, cela a une symétrie sympa.
la source
yaml
module est une bibliothèque tierce: PyYAMLJe ne suis d'accord avec aucune solution ici, car elles sont trop permissives. Ce n'est normalement pas ce que vous voulez lors de l'analyse d'une chaîne.
Voici donc la solution que j'utilise:
Et les résultats:
Juste pour être clair, car il semble que ma réponse ait offensé quelqu'un:
Le fait est que vous ne voulez pas tester une seule valeur et supposer l'autre. Je ne pense pas que vous souhaitiez toujours mapper absolument tout à la valeur non analysée. Cela produit un code sujet aux erreurs.
Donc, si vous savez dans quoi vous voulez le coder.
la source
elif
est redondant à cause du mot de retour, mais il vous donne plus d'informations sans avoir à rechercherreturn
. Mais ce n'est que moi, s'il y a une violation de style PEP, je le changerais cependant. Sans aucune autre contrainte, nous devrions toujours opter pour la lisibilité (et les normes le font). Merci pour la tête et commentaire intéressant!Un dict (vraiment, un defaultdict) vous donne un moyen assez simple de faire cette astuce:
Il est très facile d'adapter cette méthode au comportement de conversion exact que vous souhaitez - vous pouvez la remplir avec les valeurs Truthy et Falsy autorisées et la laisser lever une exception (ou renvoyer None) lorsqu'une valeur n'est pas trouvée, ou par défaut True, ou par défaut False, ou tout ce que vous voulez.
la source
Vous avez probablement déjà une solution, mais pour ceux qui recherchent une méthode pour convertir une valeur en valeur booléenne à l'aide de fausses valeurs "standard", notamment None, [], {} et "" en plus de false, no et 0 .
la source
not in
et votre sélection de faux éléments est quelque peu idiosyncrasique.Vous pouvez simplement utiliser la fonction intégrée eval () :
et la sortie:
la source
Encore une autre option
Mais en production, si vous n'avez pas besoin de ansible et de toutes ses dépendances, une bonne idée est de regarder son code source et de copier une partie de la logique dont vous avez besoin.
la source
La règle habituelle pour la coulée à un bool est que quelques littéraux spéciaux (
False
,0
,0.0
,()
,[]
,{}
) sont faux et tout le reste est vrai, donc je recommande ce qui suit:la source
Ceci est la version que j'ai écrite. Combine plusieurs des autres solutions en une seule.
S'il obtient une chaîne, il attend des valeurs spécifiques, sinon déclenche une exception. S'il n'obtient pas de chaîne, laisse simplement le constructeur bool le comprendre. Testé ces cas:
la source
str
au lieu detype('')
Si vous savez que votre entrée sera "vraie" ou "fausse", alors pourquoi ne pas utiliser:
la source
if s else False
. Réfléchissez à la façon dont"False" == "True"
reviendra déjàFalse
.if type(s) is bool: return s
.j'utilise
la source
J'aime utiliser l'opérateur ternaire pour cela, car c'est un peu plus succinct pour quelque chose qui semble ne pas dépasser 1 ligne.
la source
Je me rends compte que c'est un vieux post, mais certaines des solutions nécessitent pas mal de code, voici ce que j'ai fini par utiliser:
la source
Utiliser le package str2bool
pip install str2bool
la source
Si vous m'aimez juste besoin d'un booléen à partir d'une variable qui est une chaîne. Vous pouvez utiliser des distils comme mentionné précédemment par @jzwiener. Cependant, je n'ai pas pu importer et utiliser le module comme il l'a suggéré.
Au lieu de cela, je finis par l'utiliser de cette façon sur python3.7
distutils fait partie de la bibliothèque python std donc pas besoin d'installation. Qui est super! 👍
la source
Je voudrais partager ma solution simple: utilisez le
eval()
. Il convertira la chaîneTrue
etFalse
le type booléen approprié SI la chaîne est exactement au format du titreTrue
ouFalse
toujours en majuscule, sinon la fonction déclenchera une erreur.par exemple
Bien sûr, pour la variable dynamique, vous pouvez simplement utiliser le
.title()
pour formater la chaîne booléenne.Cela générera une erreur.
la source
voici un moyen poilu, construit pour obtenir plusieurs des mêmes réponses. Notez que bien que python considère
""
comme faux et que toutes les autres chaînes soient vraies, TCL a une idée très différente des choses.Une bonne chose à ce sujet est qu'il pardonne assez les valeurs que vous pouvez utiliser. Il est paresseux de transformer des chaînes en valeurs, et il est hygiénique de ce qu'il accepte et rejette (notez que si l'instruction ci-dessus était donnée à l'invite tcl, cela effacerait le disque dur de l'utilisateur).
la mauvaise chose est qu'elle nécessite que Tkinter soit disponible, ce qui est généralement, mais pas universellement vrai, et plus important encore, nécessite la création d'une instance Tk, ce qui est relativement lourd.
Ce qui est considéré comme vrai ou faux dépend du comportement du
Tcl_GetBoolean
, qui considère0
,false
,no
etoff
d'être faux et1
,true
,yes
eton
pour être vrai, insensible à la casse. Toute autre chaîne, y compris la chaîne vide, provoque une exception.la source
idée: vérifiez si vous voulez que la chaîne soit évaluée à False; sinon bool () renvoie True pour toute chaîne non vide.
la source
Voici quelque chose que j'ai jeté ensemble pour évaluer la véracité d'une chaîne:
plus ou moins les mêmes résultats que l'utilisation,
eval
mais plus sûr.la source
Je devais juste faire ça ... alors peut-être en retard à la fête - mais quelqu'un peut le trouver utile
la source
Si vous avez le contrôle sur l'entité qui retourne
true
/false
, une option est de la faire retourner1
/0
au lieu detrue
/false
, alors:boolean_response = bool(int(response))
Le cast supplémentaire
int
gère les réponses d'un réseau, qui sont toujours des chaînes.la source
En utilisant la fonction intégrée de Python
eval()
et le.capitalize()
méthode de , vous pouvez convertir n'importe quelle chaîne "vraie" / "fausse" (quelle que soit la capitalisation initiale) en un vrai booléen Python.Par exemple:
la source
#\nshutil.rmtree('/someImportantDirectory')
? (N'essayez pas!)eval
quelque chose d'aussi simple demande simplement une vulnérabilité.eval
ces chaînes pourrait aider quelqu'un à prendre en charge l'ensemble du système.