Czy ktoś wie, jak wykonać konwersję z ciągu znaków na wartość logiczną w Pythonie? Znalazłem ten link . Ale to nie wygląda na właściwy sposób. Tj. Przy użyciu wbudowanej funkcjonalności itp.
Pytam o to, ponieważ dowiedziałem się o tym int("string")
stąd. Ale podczas próby bool("string")
zawsze zwraca True
:
>>> bool("False")
True
distutils.util.strtobool(some_string)
. Technicznie dane wyjściowe są typuint
z wartością0
lub1
-> jeśli naprawdę chcesz / potrzebujeszbool
, możesz owinąć tę funkcjębool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
nie może obsłużyć zagranicznych tak / nie, w odróżnieniu od roztworu przez @kmonsoor, który jednak nie może obsłużyć pliki CSV Excel wykonane z prawda / fałsz w języku obcym (npVERO
,FALSO
). Dlatego czasami wymagane jest wynalezienie koła.Odpowiedzi:
Naprawdę po prostu porównujesz ciąg znaków z tym, co spodziewasz się zaakceptować jako reprezentujące prawdę, więc możesz to zrobić:
Lub w celu sprawdzenia całej gamy wartości:
Zachowaj ostrożność podczas korzystania z następujących opcji:
Puste ciągi wartości do
False
, ale wszystko inne do wartościTrue
. Dlatego nie należy tego używać do jakichkolwiek celów analizy.źródło
s == "True"
. Ale widziałem, jak ludzie robią z tego prawdziwy bałagan. def convert (s): if s == "True": return True; zwrócić False.bool("False")
. Zawsze będzie przesyłane doTrue
.Posługiwać się:
Należy pamiętać, że
distutils.util.strtobool()
zwraca reprezentacje liczb całkowitych, dlatego należy je zapakować,bool()
aby uzyskać wartości logiczne.źródło
1
/0
nieTrue
/False
, więc musisz zawinąć wynik w bool (), aby uzyskać rzeczywistą wartość logiczną:bool(distutils.util.strtobool(some_string))
None
istr(None)
jako dane wejściowe.bool
zamiast1
/0
o ile nie robisz złych rzeczy, takich jakif x == False
... a jeśli masz do czynienia zint
si iNone
nie potrzebujesz specjalnej funkcji, możesz po prostu je sprawdzić bezpośrednioif myint:
lubif not maybe_none_var:
bool
jest podklasąint
Nazwij to tak:
Obsługa prawdy i fałszu w sposób jawny:
Możesz także sprawić, aby funkcja jawnie sprawdzała z prawdziwą listą słów i fałszywą listą słów. Następnie, jeśli nie ma jej na żadnej liście, możesz zgłosić wyjątek.
źródło
Parser JSON jest również przydatny do ogólnej konwersji ciągów znaków na rozsądne typy python.
źródło
.lower()
Począwszy od Python 2.6, teraz jest
ast.literal_eval
:Który wydaje się działać tak długo, jak jesteś pewien struny zamiar być
"True"
albo"False"
:Zwykle nie polecałbym tego, ale jest on całkowicie wbudowany i może być właściwy w zależności od twoich wymagań.
źródło
Jeśli wiesz, że ciąg będzie albo
"True"
albo"False"
, możesz po prostu użyćeval(s)
.Używaj tego tylko wtedy, gdy masz pewność co do zawartości łańcucha, ponieważ spowoduje to wyjątek, jeśli łańcuch nie zawiera prawidłowego języka Python, a także wykona kod zawarty w łańcuchu.
źródło
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Ta wersja zachowuje semantykę konstruktorów, takich jak int (wartość) i zapewnia łatwy sposób definiowania akceptowalnych wartości ciągu.
źródło
Oto moja wersja. Sprawdza zarówno listy wartości dodatnich, jak i ujemnych, zgłaszając wyjątek dla nieznanych wartości. I nie otrzymuje ciągu, ale każdy typ powinien.
Przykładowe przebiegi:
źródło
to_bool(["hello"])
powinno być całkowicie poprawne połączenie, jeśli[]
jest obsługiwaneto_bool([])
. Zamiast tego zrobiłby coś w tym stylu:myList=someFunctionThatReturnAList
`if (is_bool (myList)): ... so więc ktoś ma listę i chce wiedzieć, czy ta lista jest Brak, czy pusta.zawsze możesz zrobić coś takiego
bit w parens miałby wartość False. To tylko kolejny sposób na zrobienie tego bez konieczności wykonywania rzeczywistego wywołania funkcji.
źródło
val = "false"
robi linia na tym przykładzie? Dlaczego tam jest Co to znaczy?Fajna, prosta sztuczka (na podstawie tego, co napisał @Alan Marchiori), ale przy użyciu yaml:
Jeśli jest zbyt szeroki, można go ulepszyć, testując wynik typu. Jeśli typ zwracany przez yaml jest str, to nie można go rzutować na żaden inny typ (który i tak mogę wymyślić), więc możesz sobie z tym poradzić osobno lub po prostu pozwolić, by to była prawda.
Nie będę zgadywał z dużą szybkością, ale ponieważ i tak pracuję z danymi yaml pod Qt gui, ma to niezłą symetrię.
źródło
yaml
Moduł jest biblioteką osoba trzecia: PyYAMLNie zgadzam się z żadnym rozwiązaniem tutaj, ponieważ są zbyt liberalne. Zwykle nie jest to pożądane podczas analizowania łańcucha.
Więc tutaj używam rozwiązania:
A wyniki:
Żeby było jasne, bo wygląda na to, że moja odpowiedź jakoś uraziła kogoś:
Chodzi o to, że nie chcesz testować tylko jednej wartości i zakładać drugą. Nie sądzę, żebyś zawsze chciał mapować Absolutnie wszystko na nieparsowaną wartość. To powoduje powstanie kodu podatnego na błędy.
Więc jeśli wiesz, w co chcesz to zakodować.
źródło
elif
jest zbędny ze względu na słowo zwrotne, ale daje więcej informacji bez konieczności wyszukiwaniareturn
. Ale to tylko ja, jeśli nastąpi naruszenie stylu PEP, chciałbym to zmienić. Bez żadnych innych ograniczeń zawsze powinniśmy dążyć do czytelności (i robią to standardy). Dzięki za heads-up i interesujący komentarz!Dict (tak naprawdę defaultdict) daje całkiem prosty sposób na wykonanie tej sztuczki:
Naprawdę łatwo jest dostosować tę metodę do konkretnego pożądanego zachowania konwersji - możesz wypełnić ją dozwolonymi wartościami Prawdy i Falsy i pozwolić na zgłoszenie wyjątku (lub zwrócenie Brak), gdy wartość nie zostanie znaleziona, lub domyślna wartość Prawda, lub domyślnie False lub cokolwiek chcesz.
źródło
Prawdopodobnie masz już rozwiązanie, ale dla innych, którzy szukają metody konwersji wartości na wartość logiczną przy użyciu „standardowych” wartości fałszywych, w tym None, [], {} i „” oprócz false, no i 0 .
źródło
not in
a wybór fałszywych przedmiotów jest nieco dziwaczny.Możesz po prostu użyć wbudowanej funkcji eval () :
i wynik:
źródło
Jeszcze jedna opcja
Ale w produkcji, jeśli nie potrzebujesz ansibla i wszystkich jego zależności, dobrym pomysłem jest przyjrzenie się jego kodowi źródłowemu i skopiowanie potrzebnej logiki.
źródło
Zazwyczaj zasada oddawania do bool jest to, że kilka specjalnych literały (
False
,0
,0.0
,()
,[]
,{}
) są fałszywe i wtedy wszystko jest prawdą, więc polecam, co następuje:źródło
To jest wersja, którą napisałem. Łączy kilka innych rozwiązań w jedno.
Jeśli otrzyma ciąg, oczekuje określonych wartości, w przeciwnym razie powstaje wyjątek. Jeśli nie otrzyma łańcucha, pozwól konstruktorowi bool go rozgryźć. Testowałem te przypadki:
źródło
str
zamiasttype('')
Jeśli wiesz, że dane wejściowe będą „Prawda” lub „Fałsz”, dlaczego nie użyć:
źródło
if s else False
trochę. Zastanów się, jak"False" == "True"
już powróciFalse
.if type(s) is bool: return s
.używam
źródło
W tym celu lubię używać trójskładnikowego operatora, ponieważ jest on bardziej zwięzły w przypadku czegoś, co wydaje się nie powinno być dłuższe niż 1 linia.
źródło
Zdaję sobie sprawę, że jest to stary post, ale niektóre rozwiązania wymagają sporo kodu, oto co wykorzystałem:
źródło
Użyj pakietu str2bool
pip install str2bool
źródło
Jeśli mnie lubisz, po prostu potrzebujesz wartości logicznej ze zmiennej, która jest łańcuchem. Możesz używać destylów, jak wspomniano wcześniej przez @jzwiener. Nie mogłem jednak zaimportować i użyć modułu, jak zasugerował.
Zamiast tego używam go w ten sposób na python3.7
distutils jest częścią biblioteki Python std lib, więc nie ma potrzeby instalacji. Który jest świetny! 👍
źródło
Chciałbym podzielić się moim prostym rozwiązaniem: użyj
eval()
. Przekształci ciągTrue
iFalse
na odpowiedni typ boolowski, JEŻELI łańcuch będzie dokładnie w formacie tytułuTrue
lubFalse
zawsze pierwsza litera, w przeciwnym razie funkcja zgłosi błąd.na przykład
Oczywiście dla zmiennej dynamicznej możesz po prostu użyć
.title()
do sformatowania łańcucha boolowskiego.Spowoduje to błąd.
źródło
tutaj jest włochaty, zbudowany w taki sposób, aby uzyskać wiele takich samych odpowiedzi. Zauważ, że chociaż python uważa
""
się za fałszywy, a wszystkie inne ciągi za prawdziwe, TCL ma zupełnie inne zdanie na ten temat.Dobrą rzeczą jest to, że dość wybacza wartości, których możesz użyć. Leniwy jest przekształcanie ciągów znaków w wartościowe i higieniczny w kwestii tego, co akceptuje i odrzuca (zauważ, że jeśli powyższe oświadczenie zostanie podane w monicie tcl, spowoduje to usunięcie dysku twardego użytkownika).
złą rzeczą jest to, że wymaga, aby Tkinter był dostępny, co jest zwykle, ale nie ogólnie prawdziwe, a co ważniejsze, wymaga utworzenia instancji Tk, która jest stosunkowo ciężka.
Co jest uważane za prawdziwe lub fałszywe zależy od zachowania
Tcl_GetBoolean
, która uważa0
,false
,no
ioff
być fałszywe i1
,true
,yes
ion
aby mogło być prawdziwe, z uwzględnieniem wielkości liter. Każdy inny ciąg, w tym pusty ciąg, powoduje wyjątek.źródło
pomysł: sprawdź, czy chcesz, aby ciąg był oceniany na False; w przeciwnym razie bool () zwraca True dla każdego niepustego ciągu.
źródło
Oto coś, co zebrałem, aby ocenić prawdziwość struny:
mniej więcej takie same wyniki jak używanie,
eval
ale bezpieczniejsze.źródło
Musiałem to zrobić ... więc może późno na imprezę - ale ktoś może uznać to za przydatne
źródło
Jeśli masz kontrolę nad podmiotem, który zwraca
true
/false
, jedną z opcji jest zwrócenie go1
/ /0
zamiasttrue
/false
, a następnie:boolean_response = bool(int(response))
Dodatkowa obsada
int
obsługuje odpowiedzi z sieci, które zawsze są ciągami.źródło
Za pomocą wbudowanej
eval()
funkcji Pythona i.capitalize()
metody , możesz przekonwertować dowolny ciąg „prawda” / „fałsz” (niezależnie od początkowej wielkiej litery) na prawdziwą wartość logiczną języka Python.Na przykład:
źródło
#\nshutil.rmtree('/someImportantDirectory')
? (Nie próbuj!)eval
czegoś ta prosta jest po prostu pytając o luki w zabezpieczeniach.eval
tymi ciągami może pomóc komuś przejąć cały system.