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
distutils.util.strtobool(some_string)
. Technisch gesehen ist die Ausgabe vom Typint
mit Wert0
oder1
-> wenn Sie wirklich wollen / brauchenbool
, können Sie diese Funktion mit umschließenbool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
nicht 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 (zBVERO
,FALSO
). Daher ist manchmal eine Neuerfindung der Räder erforderlich.Antworten:
Wirklich, Sie vergleichen die Zeichenfolge einfach mit dem, was Sie als wahr ansehen möchten, damit Sie Folgendes tun können:
Oder um eine ganze Reihe von Werten zu überprüfen:
Seien Sie vorsichtig, wenn Sie Folgendes verwenden:
Leere Zeichenfolgen werden ausgewertet
False
, aber alles andere wird ausgewertetTrue
. Dies sollte also nicht für Parsingzwecke verwendet werden.quelle
s == "True"
. Aber ich habe gesehen, wie Leute das wirklich durcheinander gebracht haben. def convert (s): if s == "True": return True; falsch zurückgeben.bool("False")
. Es wird immer gegossenTrue
.Verwenden:
Beachten Sie, dass
distutils.util.strtobool()
ganzzahlige Darstellungen zurückgegeben werden und daher umbrochen werden müssenbool()
, um boolesche Werte zu erhalten.quelle
1
/0
nichtTrue
/ zurückFalse
, so dass Sie das Ergebnis in bool ()bool(distutils.util.strtobool(some_string))
None
undstr(None)
als Eingabe behandeln würde.bool
anstelle von1
/ zu benötigen,0
solange Sie keine schlechten Dinge tun wieif x == False
... und wenn Sie mitint
s undNone
s zu tun haben und keine spezielle Funktion benötigen, können Sie diese einfach überprüfen direktif myint:
oderif not maybe_none_var:
bool
ist eine Unterklasse vonint
Dann nenne es so:
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.
quelle
Der JSON-Parser ist auch nützlich, um Zeichenfolgen im Allgemeinen in sinnvolle Python-Typen zu konvertieren.
quelle
.lower()
Ab Python 2.6 gibt es jetzt
ast.literal_eval
:Was zu funktionieren scheint, solange Sie sicher sind, dass Ihre Saiten entweder
"True"
oder sein werden"False"
:Normalerweise würde ich das nicht empfehlen, aber es ist komplett eingebaut und könnte je nach Ihren Anforderungen das Richtige sein.
quelle
Wenn Sie wissen, dass die Zeichenfolge entweder
"True"
oder ist"False"
, können Sie sie einfach verwendeneval(s)
.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.
quelle
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Diese Version behält die Semantik von Konstruktoren wie int (Wert) bei und bietet eine einfache Möglichkeit, akzeptable Zeichenfolgenwerte zu definieren.
quelle
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.
Probeläufe:
quelle
to_bool(["hello"])
sollte ein absolut gültiger Anruf sein, wenn er[]
unterstützt wirdto_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.man könnte immer so etwas machen
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.
quelle
val = "false"
Zeile in diesem Beispiel? Warum ist es dort? Was bedeutet das?Ein cooler, einfacher Trick (basierend auf dem, was @Alan Marchiori gepostet hat), aber mit yaml:
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.
quelle
yaml
Modul ist eine Bibliothek eines Drittanbieters: PyYAMLIch 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:
Und die Ergebnisse:
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.
quelle
elif
ist aufgrund des Rückgabeworts redundant, bietet Ihnen jedoch mehr Informationen, ohne suchen zu müssenreturn
. 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!Ein Diktat (wirklich ein Standarddiktat) bietet Ihnen eine ziemlich einfache Möglichkeit, diesen Trick auszuführen:
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.
quelle
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 .
quelle
not in
und Ihre Auswahl falscher Elemente ist etwas eigenwillig.Sie können einfach die integrierte Funktion eval () verwenden :
und die Ausgabe:
quelle
Noch eine Option
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.
quelle
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:quelle
Dies ist die Version, die ich geschrieben habe. Kombiniert mehrere der anderen Lösungen zu einer.
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:
quelle
str
anstelle vontype('')
Wenn Sie wissen, dass Ihre Eingabe entweder "Wahr" oder "Falsch" ist, warum nicht:
quelle
if s else False
bisschen eigentlich nicht . Überlegen Sie, wie"False" == "True"
bereits zurückkehren wirdFalse
.if type(s) is bool: return s
.ich benutze
quelle
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.
quelle
Mir ist klar, dass dies ein alter Beitrag ist, aber einige der Lösungen erfordern ziemlich viel Code. Folgendes habe ich letztendlich verwendet:
quelle
Verwenden Sie das Paket str2bool
pip install str2bool
quelle
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 ist Teil der Python-Standardbibliothek, sodass keine Installation erforderlich ist. Was toll ist! 👍
quelle
Ich möchte meine einfache Lösung teilen: Verwenden Sie die
eval()
. Es konvertiert die ZeichenfolgeTrue
undFalse
in den richtigen booleschen Typ, wenn die Zeichenfolge genau im TitelformatTrue
oderFalse
immer in Großbuchstaben geschrieben ist oder die Funktion einen Fehler auslöst.z.B
Natürlich können Sie für dynamische Variablen einfach die verwenden,
.title()
um die boolesche Zeichenfolge zu formatieren.Dies wird einen Fehler auslösen.
quelle
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.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 ist0
,false
,no
undoff
falsch zu sein und1
,true
,yes
undon
wahr, Groß- und Kleinschreibung zu sein. Jede andere Zeichenfolge, einschließlich der leeren Zeichenfolge, verursacht eine Ausnahme.quelle
Idee: Überprüfen Sie, ob die Zeichenfolge auf False ausgewertet werden soll. Andernfalls gibt bool () True für jede nicht leere Zeichenfolge zurück.
quelle
Hier ist etwas, das ich zusammengeschmissen habe, um die Wahrhaftigkeit einer Zeichenfolge zu bewerten:
mehr oder weniger die gleichen Ergebnisse wie bei der Verwendung,
eval
aber sicherer.quelle
Ich musste das nur tun ... also vielleicht zu spät zur Party - aber jemand findet es vielleicht nützlich
quelle
Wenn Sie die Kontrolle über die Entität haben, die
true
/ zurückgibtfalse
, besteht eine Option darin, sie1
/0
anstelle vontrue
/ zurückzugebenfalse
, dann:boolean_response = bool(int(response))
Die zusätzliche Besetzung für die
int
Verarbeitung von Antworten aus einem Netzwerk, die immer Zeichenfolgen sind.quelle
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:
quelle
#\nshutil.rmtree('/someImportantDirectory')
? (Versuchen Sie es nicht!)eval
etwas so Einfaches verwenden, fragen Sie nur nach einer Sicherheitsanfälligkeit.eval
diesen Zeichenfolgen könnte jemand helfen, das gesamte System zu übernehmen.