Konvertieren von einem String in einen Booleschen Wert in Python?


745

Weiß jemand, wie man in Python von einem String in einen Booleschen Wert konvertiert? Ich habe diesen Link gefunden . Aber es sieht nicht nach einem richtigen Weg aus. Dh mit eingebauter Funktionalität usw.

Der Grund, warum ich das frage, ist, dass ich int("string")von hier erfahren habe. Aber wenn man bool("string")es versucht , kehrt es immer zurück True:

>>> bool("False")
True

2
Ich habe nur dafür eine Mikrobibliothek erstellt, die auch einige Fremdwörter enthält, z. B. "tak" für Polnisch, "'是 的" in Mandarin-Chinesisch wird als wahr bewertet . Wenn nicht explizit, wird true-ish als False ausgewertet . Vorschläge sind willkommen. Github Link: github.com/kmonsoor/str2bool
kmonsoor

18
Anstatt das Rad neu zu erfinden und eine Menge Code zu schreiben, um den man sich herumschlagen muss, verwendet @ jzwieners Antwort eine Funktion aus der Python-Standardbibliothekdistutils.util.strtobool(some_string) . Technisch gesehen ist die Ausgabe vom Typ intmit Wert 0oder 1-> wenn Sie wirklich wollen / brauchen bool, können Sie diese Funktion mit umschließen bool(distutils.util.strtobool(some_string)).
Trevor Boyd Smith

1
pip install str2bool
Symon

Nur ein Kopf hoch. distutils.util.strtoboolnicht mit ausländischen ja kann / nein, anders als bei der Lösung von @kmonsoor, die aber nicht Excel aus CSV - Dateien mit True / False in einer fremden Sprache verarbeiten können (zB VERO, FALSO). Daher ist manchmal eine Neuerfindung der Räder erforderlich.
Matteo Ferla

Antworten:


837

Wirklich, Sie vergleichen die Zeichenfolge einfach mit dem, was Sie als wahr ansehen möchten, damit Sie Folgendes tun können:

s == 'True'

Oder um eine ganze Reihe von Werten zu überprüfen:

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

Seien Sie vorsichtig, wenn Sie Folgendes verwenden:

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

Leere Zeichenfolgen werden ausgewertet False, aber alles andere wird ausgewertet True. Dies sollte also nicht für Parsingzwecke verwendet werden.


48
+1: Nicht viel könnte einfacher sein als s == "True". Aber ich habe gesehen, wie Leute das wirklich durcheinander gebracht haben. def convert (s): if s == "True": return True; falsch zurückgeben.
S.Lott

24
Ich ziehe es vor, s == "True" dem if / else zurückzugeben
Dana

26
if s == "True": Rückgabe True elif s == "False": Rückgabe False else: Rückgabe erhöhen
Unbekannt

9
Das Parsen von Strings zu Booleschen Werten ist bereits in distutils.util.strtobool implementiert: stackoverflow.com/a/18472142/923599
jzwiener

9
Ich weiß, dass dies ein WIRKLICH altes Thema ist, aber ich wollte bestätigen, dass ich gerade 4 Stunden damit verbracht habe, meinen Code zu debuggen. Mein Fehler war der Versuch zu wirken bool("False"). Es wird immer gegossen True.
Ev.

304

Verwenden:

bool(distutils.util.strtobool(some_string))

Wahre Werte sind y, yes, t, true, on und 1; falsche Werte sind n, no, f, false, off und 0. Löst ValueError aus, wenn val etwas anderes ist.

Beachten Sie, dass distutils.util.strtobool()ganzzahlige Darstellungen zurückgegeben werden und daher umbrochen werden müssen bool(), um boolesche Werte zu erhalten.


38
Leider gibt dies 1/ 0nicht True/ zurück False, so dass Sie das Ergebnis in bool () bool(distutils.util.strtobool(some_string))
einschließen müssen

2
Diese Funktion ist verlockend. Es wäre perfekt, wenn es ganze Zahlen und Noneund str(None)als Eingabe behandeln würde.
MarkHu

20
Ich ziehe dies den höher bewerteten Antworten vor ... es ist von stdlib und macht genau das, was benötigt wird. Es gibt im Allgemeinen keinen Grund, eine tatsächliche boolanstelle von 1/ zu benötigen, 0solange Sie keine schlechten Dinge tun wie if x == False... und wenn Sie mit ints und Nones zu tun haben und keine spezielle Funktion benötigen, können Sie diese einfach überprüfen direkt if myint:oderif not maybe_none_var:
Anentropic

4
@Secator boolist eine Unterklasse vonint
Anentropic

2
Um jemandem das Googeln von Fehlern zu ersparen: Importieren Sie distutils und import distutils.util, damit dies funktioniert.
Edward B.

267
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

Dann nenne es so:

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

Explizite Behandlung von wahr und falsch:

Sie können Ihre Funktion auch explizit mit einer wahren Wortliste und einer falschen Wortliste vergleichen lassen. Wenn es dann in keiner Liste enthalten ist, können Sie eine Ausnahme auslösen.


29
Mit str (v) .lower () anstelle von v.lower () kann nur eine geringe Verbesserung vorgenommen werden . Dann kann es funktionieren, auch wenn es kein String ist, z. B. 1, 0
kmonsoor

RE: Wenn Sie true / false explizit behandeln, können Sie auch einen Standardwert angeben, wenn die Zeichenfolge nicht übereinstimmt, ähnlich wie die Eingabeaufforderungen true / false funktionieren: Weiter? (
J

113

Der JSON-Parser ist auch nützlich, um Zeichenfolgen im Allgemeinen in sinnvolle Python-Typen zu konvertieren.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True

31
Beachten Sie, dass diese Methode nur in Kleinbuchstaben funktioniert. Wenn es in Großbuchstaben geschrieben ist, können Sie nicht. Sie müssen anrufen.lower()
CppLearner

107

Ab Python 2.6 gibt es jetzt ast.literal_eval:

>>> import ast
>>> Hilfe (ast.literal_eval)
Hilfe zur Funktion literal_eval im Modul ast:

literal_eval (node_or_string)
    Bewerten Sie sicher einen Ausdrucksknoten oder eine Zeichenfolge, die einen Python enthält
    Ausdruck. Die angegebene Zeichenfolge oder der angegebene Knoten darf nur aus den folgenden Elementen bestehen
    Python-Literalstrukturen: Zeichenfolgen, Zahlen, Tupel, Listen, Diktate, Boolesche Werte,
    und keine.

Was zu funktionieren scheint, solange Sie sicher sind, dass Ihre Saiten entweder "True"oder sein werden "False":

>>> ast.literal_eval ("True")
Wahr
>>> ast.literal_eval ("False")
Falsch
>>> ast.literal_eval ("F")
Traceback (letzter Anruf zuletzt):
  Datei "", Zeile 1, in 
  Datei "/opt/Python-2.6.1/lib/python2.6/ast.py", Zeile 68, in literal_eval
    return _convert (node_or_string)
  Datei "/opt/Python-2.6.1/lib/python2.6/ast.py", Zeile 67, in _convert
    Erhöhen Sie ValueError ('fehlerhafter String')
ValueError: fehlerhafte Zeichenfolge
>>> ast.literal_eval ("'False'")
'Falsch'

Normalerweise würde ich das nicht empfehlen, aber es ist komplett eingebaut und könnte je nach Ihren Anforderungen das Richtige sein.


1
Ich bin mir der allgemeinen Anwendbarkeit dieser Lösung nicht sicher, aber sie ist im Allgemeinen sehr schön. +1!
SingleNegationElimination

3
Gaah, das ist schrecklich! Dann wieder, Sie haben sagen Sie es nicht empfehlen, und es tut ordentlich die Frage beantworten. Guter Fund!
Vanessa Phipps

4
Leider wird dieser Fall nicht behandelt >>> ast.literal_eval ('true') oder ast.literal_eval ('TRUE') Erhöht >>> erhöhen ValueError ('fehlerhafter String') Die Korrektur ist einfach, obwohl ast.literal_eval (to_test .title ())
Bhushan

Keine gute Lösung für diese spezielle Frage, aber ... Wow, literal_eval ist verdammt nützlich! String zum Auflisten, Diktieren, ect.
Reise

Funktioniert es auf Unicodes zu? In meiner Django-Ansicht habe ich einen eingehenden Wert, den ich in einen Booleschen Wert ändern möchte. Es gibt eine fehlerhafte Zeichenfolgenausnahme.
Prakhar Mohan Srivastava

48

Wenn Sie wissen, dass die Zeichenfolge entweder "True"oder ist "False", können Sie sie einfach verwenden eval(s).

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

Verwenden Sie diese Option nur, wenn Sie sich über den Inhalt der Zeichenfolge sicher sind, da sie eine Ausnahme auslöst, wenn die Zeichenfolge kein gültiges Python enthält, und auch den in der Zeichenfolge enthaltenen Code ausführt.


5
Diese Zeichenfolge wird von irgendwoher kommen. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Nurettin

4
@nurettin, daher mein Kommentar, es nur zu verwenden, wenn Sie sich über den Inhalt der Zeichenfolge sicher sind.
Joel Croteau

17

Diese Version behält die Semantik von Konstruktoren wie int (Wert) bei und bietet eine einfache Möglichkeit, akzeptable Zeichenfolgenwerte zu definieren.

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

3
Nit: Ihr letzter "Testfall" tritt beim ersten Aufruf auf und die anderen werden nicht getestet. Auch wird es nicht scheitern , wenn ein Fehler nicht erhöht.
Augurar

12

Hier ist meine Version. Es prüft sowohl positive als auch negative Wertelisten und löst eine Ausnahme für unbekannte Werte aus. Und es erhält keine Zeichenfolge, aber jeder Typ sollte dies tun.

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))

Probeläufe:

>>> 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
>>>

Man könnte davon gebissen werden: Das to_bool(["hello"])sollte ein absolut gültiger Anruf sein, wenn er []unterstützt wird
Rafael T

1
Gibt "Ausnahme: Ungültiger Wert für die boolesche Konvertierung: ['Hallo']" zurück, der erwartet und dokumentiert wird. Meiner Meinung nach war eine leere Liste eindeutig falsch, aber ['falsch'] war eindeutig nichts, also habe ich sie absichtlich weggelassen - das ist eine Funktion, kein Fehler. Es sollte einfach sein, Unterstützung für die Rückgabe von true für nicht leere Listen hinzuzufügen, wenn Sie dies wünschen.
Petrucio

1
Sie haben es dokumentiert. Aber im wirklichen Leben würde man niemals anrufen to_bool([]). Stattdessen würde er etwas in diese Richtung tun: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... ´ also hat man eine Liste und möchte wissen, ob diese Liste None oder leer ist.
Rafael T

Warum versuchen Sie das nicht: >>> def a2b (arg): ... default = bool (arg) ... wenn isinstance (arg, str): ... arg.lower () in ['true', 'zurückgeben t ',' yes ',' y ',' 1 '] ... else: ... return default
ThePracticalOne

5
Kleiner Punkt: Sie sollten ValueError wahrscheinlich einer einfachen Ausnahme vorziehen .
Dshepherd

10

man könnte immer so etwas machen

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

Das Bit in Parens würde als falsch ausgewertet. Dies ist nur eine andere Möglichkeit, ohne einen tatsächlichen Funktionsaufruf ausführen zu müssen.


1
Was macht die val = "false"Zeile in diesem Beispiel? Warum ist es dort? Was bedeutet das?
S.Lott

9
Ich denke, es bedeutet 42.
Geo

@Geo: Ich stimme zu; aber was war die Frage, die durch diese Aussage beantwortet wird?
S.Lott

Dies ist genau das, wonach ich gesucht habe, indem ich ein Eingabefeld aus einer Datei ausgewertet habe und basierend auf dem Ergebnis, das einen Booleschen Wert speichert. Vielen Dank.
Jimh

9

Ein cooler, einfacher Trick (basierend auf dem, was @Alan Marchiori gepostet hat), aber mit yaml:

import yaml

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

Wenn dies zu breit ist, kann es durch Testen des Typergebnisses verfeinert werden. Wenn der von yaml zurückgegebene Typ ein str ist, kann er nicht in einen anderen Typ umgewandelt werden (an den ich sowieso denken kann), sodass Sie dies separat behandeln oder einfach wahr werden lassen können.

Ich werde keine Vermutungen über die Geschwindigkeit anstellen, aber da ich ohnehin mit Yaml-Daten unter Qt-GUI arbeite, hat dies eine schöne Symmetrie.


1
Das yamlModul ist eine Bibliothek eines Drittanbieters: PyYAML
Peter Wood

8

Ich bin mit keiner Lösung hier einverstanden, da sie zu freizügig sind. Dies ist normalerweise nicht das, was Sie beim Parsen einer Zeichenfolge möchten.

Also hier die Lösung, die ich benutze:

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)

Und die Ergebnisse:

>>> [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

Nur um klar zu sein, denn es sieht so aus, als ob meine Antwort jemanden irgendwie beleidigt hätte:

Der Punkt ist, dass Sie nicht nur auf einen Wert testen und den anderen annehmen möchten. Ich glaube nicht, dass Sie immer absolut alles dem nicht analysierten Wert zuordnen möchten. Das erzeugt fehleranfälligen Code.

Also, wenn Sie wissen, was Sie wollen, codieren Sie es.


2
Ich denke, Sie verpassen den Punkt: Der Sinn der Antworten bestand darin, das allgemeine Prinzip zu demonstrieren und nicht der Person, die die Frage gestellt hat, genau zu sagen, wie sie es tun soll. Die Person, die die Frage ursprünglich gestellt hat, hat überlegt, was eigentlich ein einfaches Problem ist.
Keith Gaughan

8
@ Keith Ich bin anderer Meinung. Der Punkt ist die Beantwortung der Frage, wie sie gestellt wird.
Estani

1
Die Frage war, wie man einen String in einen Booleschen Wert konvertiert. Das war die Frage, die ich beantwortet habe. Ich habe keine Ahnung, was als gültige boolesche Zeichenfolge für das Originalplakat angesehen wird, und Sie auch nicht. Deshalb ist es wichtiger, das allgemeine Prinzip zu demonstrieren, als dem Poster die vollständige Antwort zu geben. Das Originalplakat brauchte nicht alles, was ihnen dargelegt wurde. Alles, was sie brauchten, war, dass das allgemeine Prinzip demonstriert wurde. Daraus erhält jeder, der kompetent ist, Ihre Antwort.
Keith Gaughan

2
@dshepherd the isinstance ist da, um sicherzugehen, dass ich analysiere, was ich erwarte. Ich analysiere Strings, also sollte eine Methode car_race.lower (), die zufällig '1' zurückgibt, nicht true zurückgeben, sondern einen ValueError auslösen. In anderen Fällen könnte dies jedoch ausreichen.
Estani

2
@CivFan interessanter Punkt. Obwohl ich es versucht habe und es nicht so schön gelesen hat (für mich). elifist aufgrund des Rückgabeworts redundant, bietet Ihnen jedoch mehr Informationen, ohne suchen zu müssen return. Aber das bin nur ich, wenn es eine Verletzung des PEP-Stils gibt, würde ich es trotzdem ändern. Ohne weitere Einschränkungen sollten wir uns immer um Lesbarkeit bemühen (und Standards tun dies). Vielen Dank für das Heads-up und den interessanten Kommentar!
Estani

7

Ein Diktat (wirklich ein Standarddiktat) bietet Ihnen eine ziemlich einfache Möglichkeit, diesen Trick auszuführen:

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

Es ist wirklich einfach, diese Methode an das gewünschte Konvertierungsverhalten anzupassen. Sie können sie mit zulässigen Werten für "Wahr" und "Falsch" füllen und eine Ausnahme auslösen (oder "Keine" zurückgeben), wenn ein Wert nicht gefunden wird, oder standardmäßig "Wahr". oder standardmäßig False oder was auch immer Sie wollen.


5

Sie haben wahrscheinlich bereits eine Lösung, aber für andere, die nach einer Methode suchen, um einen Wert in einen booleschen Wert zu konvertieren, wobei "falsche" Standardwerte verwendet werden, einschließlich None, [], {} und "" zusätzlich zu false, no und 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

1
Es ist besser, Sets zu verwenden, not inund Ihre Auswahl falscher Elemente ist etwas eigenwillig.
SilentGhost

5

Sie können einfach die integrierte Funktion eval () verwenden :

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)

und die Ausgabe:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>

1
Dies funktioniert nur, wenn die getesteten Werte gültige Python sind. "true" und "false" lösen eine Ausnahme aus.
Gordon Bean

13
Darüber hinaus ist es eine sehr schlechte Angewohnheit, 'eval' zum Parsen zu verwenden, da eval beliebigen Code in der Zeichenfolge ausführt. In einigen Situationen kann dies eine enorme Sicherheit darstellen.
Christopher Barber

7
Das ist eine wirklich schlechte Antwort. Das Auswerten eines beliebigen Ausdrucks zum Parsen eines Booleschen Werts ist KEIN guter Ansatz.
Augurar

5

Noch eine Option

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

Aber in der Produktion , wenn Sie brauchen nicht ansible und alle seine Abhängigkeiten, eine gute Idee ist , an seinem suchen Quellcode und kopieren Sie Teil der Logik , die Sie benötigen.


4

Die übliche Regel auf einen Bool zum Gießen ist , dass einige spezielle Literale ( False, 0, 0.0, (), [], {}) sind falsch und dann alles andere stimmt, so dass ich die folgende Empfehlung:

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

3

Dies ist die Version, die ich geschrieben habe. Kombiniert mehrere der anderen Lösungen zu einer.

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)

Wenn eine Zeichenfolge abgerufen wird, werden bestimmte Werte erwartet, andernfalls wird eine Ausnahme ausgelöst. Wenn es keine Zeichenfolge erhält, lässt es der Bool-Konstruktor einfach herausfinden. Getestet diese Fälle:

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),
    ]

Verwenden Sie stranstelle vontype('')
pppery

3

Wenn Sie wissen, dass Ihre Eingabe entweder "Wahr" oder "Falsch" ist, warum nicht:

def bool_convert(s):
    return s == "True"

Du brauchst das if s else Falsebisschen eigentlich nicht . Überlegen Sie, wie "False" == "True"bereits zurückkehren wird False.
Taylor Edmiston

Wenn Sie nicht sicher sind, ob die Eingabe s eine Zeichenfolge oder bereits ein Boolescher Wert ist, können Sie hinzufügen if type(s) is bool: return s.
Kontur

3

ich benutze

# 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]]
"""

2

Ich verwende dafür gerne den ternären Operator, da er für etwas, das sich so anfühlt, als ob es nicht mehr als eine Zeile sein sollte, etwas prägnanter ist.

True if myString=="True" else False

1
Wie ist es prägnanter als my_string == 'True'?
S. de Melo

2

Mir ist klar, dass dies ein alter Beitrag ist, aber einige der Lösungen erfordern ziemlich viel Code. Folgendes habe ich letztendlich verwendet:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

7
Das ist funktional äquivalent und komplexer als: Rückgabewert in ('True', 'true')
Keith Gaughan


1

Wenn du mich magst, brauchst du nur einen Booleschen Wert aus einer Variablen, die ein String ist. Sie können Destillate verwenden, wie bereits von @jzwiener erwähnt. Ich konnte das Modul jedoch nicht wie vorgeschlagen importieren und verwenden.

Stattdessen verwende ich es auf Python3.7 auf diese Weise

distutils string to bool in python

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

distutils ist Teil der Python-Standardbibliothek, sodass keine Installation erforderlich ist. Was toll ist! 👍


1

Ich möchte meine einfache Lösung teilen: Verwenden Sie die eval(). Es konvertiert die Zeichenfolge Trueund Falsein den richtigen booleschen Typ, wenn die Zeichenfolge genau im Titelformat Trueoder Falseimmer in Großbuchstaben geschrieben ist oder die Funktion einen Fehler auslöst.

z.B

>>> eval('False')
False

>>> eval('True')
True

Natürlich können Sie für dynamische Variablen einfach die verwenden, .title()um die boolesche Zeichenfolge zu formatieren.

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

Dies wird einen Fehler auslösen.

>>> 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

0

Hier ist eine haarige, eingebaute Methode, um viele der gleichen Antworten zu erhalten. Beachten Sie, dass ""TCL , obwohl Python als falsch und alle anderen Zeichenfolgen als wahr betrachtet, eine ganz andere Vorstellung von Dingen hat.

>>> 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 /']"
>>> 

Eine gute Sache dabei ist, dass es ziemlich verzeihend ist, welche Werte Sie verwenden können. Es ist faul, Strings in Werte umzuwandeln, und es ist hygienisch, was es akzeptiert und ablehnt (beachten Sie, dass die obige Anweisung bei einer tcl-Eingabeaufforderung die Festplatte des Benutzers löschen würde).

Das Schlimme ist, dass Tkinter verfügbar sein muss, was normalerweise, aber nicht allgemein gültig ist, und vor allem, dass eine Tk-Instanz erstellt werden muss, die vergleichsweise schwer ist.

Was ist wahr oder falsch betrachtet , hängt von dem Verhalten der Tcl_GetBoolean, die der Auffassung ist 0, false, nound offfalsch zu sein und 1, true, yesund onwahr, Groß- und Kleinschreibung zu sein. Jede andere Zeichenfolge, einschließlich der leeren Zeichenfolge, verursacht eine Ausnahme.


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

Idee: Überprüfen Sie, ob die Zeichenfolge auf False ausgewertet werden soll. Andernfalls gibt bool () True für jede nicht leere Zeichenfolge zurück.


0

Hier ist etwas, das ich zusammengeschmissen habe, um die Wahrhaftigkeit einer Zeichenfolge zu bewerten:

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)

mehr oder weniger die gleichen Ergebnisse wie bei der Verwendung, evalaber sicherer.


0

Ich musste das nur tun ... also vielleicht zu spät zur Party - aber jemand findet es vielleicht nützlich

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

0

Wenn Sie die Kontrolle über die Entität haben, die true/ zurückgibt false, besteht eine Option darin, sie 1/ 0anstelle von true/ zurückzugeben false, dann:

boolean_response = bool(int(response))

Die zusätzliche Besetzung für die intVerarbeitung von Antworten aus einem Netzwerk, die immer Zeichenfolgen sind.


-5

Durch die Verwendung der in Python integrierten eval()Funktion und der.capitalize() Methode können Sie eine beliebige Zeichenfolge "true" / "false" (unabhängig von der Anfangsbuchstaben) in einen echten Python-Booleschen Wert konvertieren.

Zum Beispiel:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

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

# OUTPUT: <type 'bool'>

4
Was passiert, wenn der String enthält #\nshutil.rmtree('/someImportantDirectory')? (Versuchen Sie es nicht!)
Mastov

@mastov - lächerliche Abstimmung. Wenn Sie nicht die Kontrolle über die eingehende Zeichenfolge haben, müssen Sie natürlich Vorsichtsmaßnahmen treffen, wie Sie es bei jedem Code tun würden. Wenn Sie jedoch den Workflow steuern, ist dies eine einfache Lösung, die funktioniert. Verwechseln Sie eine nicht in jeder Hinsicht perfekte Lösung nicht mit einer schlechten Antwort.
elPastor

1
Abgesehen davon, dass die Gefahren nicht erwähnt werden (was dies bereits zu einer schlechten Antwort macht): Sie schlagen vor, die Eingabe vorher zu bereinigen? Das wird die Einfachheit dieser Methode zunichte machen, die ihr Hauptvorteil war.
Mastov

4
Wenn Sie evaletwas so Einfaches verwenden, fragen Sie nur nach einer Sicherheitsanfälligkeit.
Mastov

1
Nicht der gesamte Code. Aber vor allem Code, wandelt Strings auf andere Arten in der Regel ist Ihrer Kontrolle aus. Oft merkt man es gar nicht. Sie könnten sagen: "Es ist meine Datenbank (oder Konfigurationsdatei), es ist Teil meines Systems, unter meiner Kontrolle." Dann geben Sie einem anderen Modul Zugriff auf eine Datenbank, weil: "Was ist der Schaden? Es sind nur einige Tabellen mit Zeichenfolgen." Aber mit evaldiesen Zeichenfolgen könnte jemand helfen, das gesamte System zu übernehmen.
Mastov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.