Кто-нибудь знает, как сделать преобразование из строки в логическое значение в Python? Я нашел эту ссылку . Но это не похоже на правильный способ сделать это. Т.е. с использованием встроенного функционала и т. Д.
Я спрашиваю об этом потому, что узнал об этом int("string")
отсюда. Но при попытке bool("string")
всегда возвращается True
:
>>> bool("False")
True
distutils.util.strtobool(some_string)
. Технически, выводом является типint
со значением0
или1
-> если вы действительно хотите / нуждаетесь,bool
вы можете обернуть эту функцию с помощьюbool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
не может обрабатывать иностранные да / нет, в отличие от решения @kmonsoor, которое, однако, не может обрабатывать файлы CSV, созданные в Excel с True / False на иностранном языке (напримерVERO
,FALSO
). Таким образом, переосмысление колеса иногда требуется.Ответы:
На самом деле, вы просто сравниваете строку с тем, что вы ожидаете принять как представляющее истину, так что вы можете сделать это:
Или для проверки целой связки значений:
Будьте осторожны при использовании следующего:
Пустые строки оценивают
False
, но все остальное оцениваетTrue
. Так что это не должно использоваться для каких-либо целей анализа.источник
s == "True"
. Но я видел, как люди из-за этого путаются. def convert (s): if s == "True": return True; вернуть Ложь.bool("False")
. Это всегда приведёт кTrue
.Использование:
Имейте в виду, что
distutils.util.strtobool()
возвращает целочисленные представления и, следовательно, его необходимо обернуть,bool()
чтобы получить логические значения.источник
1
/0
неTrue
/False
, поэтому вам нужно обернуть результат в bool (), чтобы получить реальное логическое значение:bool(distutils.util.strtobool(some_string))
None
и вstr(None)
качестве ввода.bool
вместо1
/0
до тех пор, пока вы не делаете плохие вещи вродеif x == False
... и если вы имеете дело сint
s иNone
s, то вам не нужна специальная функция, вы можете просто проверить их прямоif myint:
илиif not maybe_none_var:
bool
является подклассомint
Тогда назовите это так:
Обработка true и false явно:
Вы также можете сделать так, чтобы ваша функция явно проверяла список слов True и список слов False. Тогда, если его нет ни в одном списке, вы можете выдать исключение.
источник
Парсер JSON также полезен для общего преобразования строк в приемлемые типы Python.
источник
.lower()
Начиная с Python 2.6, теперь есть
ast.literal_eval
:Который , кажется, работает, до тех пор , пока вы уверены , что ваши строки будут либо
"True"
или"False"
:Обычно я бы не рекомендовал это, но он полностью встроен и может быть правильным в зависимости от ваших требований.
источник
Если вы знаете, что строка будет либо,
"True"
либо"False"
, вы можете просто использоватьeval(s)
.Используйте это только в том случае, если вы уверены в содержимом строки, так как это вызовет исключение, если строка не содержит допустимого Python, а также выполнит код, содержащийся в строке.
источник
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Эта версия сохраняет семантику конструкторов, таких как int (value), и предоставляет простой способ определения допустимых строковых значений.
источник
Вот моя версия. Он проверяет списки как положительных, так и отрицательных значений, вызывая исключение для неизвестных значений. И он не получает строку, но любой тип должен делать.
Образцы прогонов:
источник
to_bool(["hello"])
это должен быть совершенно корректный вызов, если[]
он поддерживаетсяto_bool([])
. Вместо этого он будет делать что-то вроде этого:myList=someFunctionThatReturnAList
`if (is_bool (myList)): ... ´, поэтому у каждого есть список, и он хочет знать, является ли этот список пустым или пустым.вы всегда можете сделать что-то вроде
бит в паренсе оценивается как ложный. Это просто еще один способ сделать это без необходимости фактического вызова функции.
источник
val = "false"
делает строка в этом примере? Почему это там? Что это значит?Крутой, простой трюк (основанный на том, что написал @Alan Marchiori), но использующий yaml:
Если оно слишком широкое, его можно уточнить, протестировав результат типа. Если возвращаемый yaml тип является str, то он не может быть приведен к какому-либо другому типу (о чем я могу думать в любом случае), так что вы можете обработать это отдельно или просто позволить ему быть верным.
Я не буду догадываться о скорости, но так как я все равно работаю с данными yaml в Qt gui, это имеет хорошую симметрию.
источник
yaml
Модуль является библиотекой , третья сторона: PyYAMLЯ не согласен с каким-либо решением здесь, поскольку они слишком разрешительны. Обычно это не то, что вы хотите при разборе строки.
Итак, вот решение, которое я использую:
И результаты:
Просто чтобы быть ясно, потому что, похоже, мой ответ кого-то как-то обидел
Дело в том, что вы не хотите проверять только одно значение, а другое принимаете. Я не думаю, что вы всегда хотите отобразить Абсолютно все на непарсированное значение. Это приводит к ошибочному коду.
Итак, если вы знаете, что вы хотите, закодируйте это в.
источник
elif
избыточно из-за возвращаемого слова, но дает вам больше информации без необходимости поискаreturn
. Но это только я, если есть нарушение стиля PEP, я бы изменил его. Без каких-либо других ограничений, мы всегда должны идти на удобочитаемость (и стандарты делают это). Спасибо за заголовки и интересный комментарий!DICT (на самом деле, defaultdict) дает вам довольно простой способ сделать этот трюк:
Очень легко адаптировать этот метод к нужному поведению преобразования - вы можете заполнить его допустимыми значениями Truthy и Falsy и позволить ему вызвать исключение (или вернуть None), когда значение не найдено, или по умолчанию True, или по умолчанию False, или все, что вы хотите.
источник
Возможно, у вас уже есть решение, но для тех, кто ищет метод для преобразования значения в логическое значение, используя «стандартные» ложные значения, включая None, [], {} и «» в дополнение к false, no и 0 ,
источник
not in
и ваш выбор ложных предметов несколько своеобразен.Вы можете просто использовать встроенную функцию eval () :
и вывод:
источник
Еще один вариант
Но в производстве, если вам не нужен ansible и все его зависимости, хорошей идеей будет посмотреть на его исходный код и скопировать часть логики, которая вам нужна.
источник
Обычное правило для отливки к BOOL, что несколько специальных литералов (
False
,0
,0.0
,()
,[]
,{}
) , являются ложными , а затем все остальное верно, поэтому я рекомендую следующее:источник
Это версия, которую я написал. Объединяет несколько других решений в одно.
Если он получает строку, он ожидает определенных значений, в противном случае возникает исключение. Если он не получает строку, просто дайте понять конструктору bool. Проверены эти случаи:
источник
str
вместоtype('')
Если вы знаете, что ваш ввод будет «True» или «False», то почему бы не использовать:
источник
if s else False
немного. Подумай, как"False" == "True"
уже вернетсяFalse
.if type(s) is bool: return s
.я использую
источник
Мне нравится использовать троичный оператор для этого, поскольку он более лаконичен для того, что кажется, что оно не должно быть больше 1 строки.
источник
Я понимаю, что это старый пост, но некоторые решения требуют немного кода, вот что я в итоге использовал:
источник
Используйте пакет str2bool
pip install str2bool
источник
Если я вам нравлюсь, просто нужно логическое значение из переменной, которая является строкой. Вы можете использовать дистилляции, как упоминалось ранее @jzwiener. Однако я не мог импортировать и использовать модуль, как он предложил.
Вместо этого я использую его таким образом на python3.7
distutils является частью библиотеки python std, поэтому не требует установки. Что здорово! 👍
источник
Я хотел бы поделиться своим простым решением: использовать
eval()
. Он преобразует строкуTrue
иFalse
в правильный логический тип , если строка точно в формате заголовокTrue
илиFalse
всегда первая буква капитале или еще функции вызовет ошибку.например
Конечно, для динамической переменной вы можете просто использовать
.title()
для форматирования логической строки.Это выдаст ошибку.
источник
Вот волосатый, построенный таким образом, чтобы получить много одинаковых ответов. Обратите внимание, что хотя python считает
""
false и все остальные строки верными, TCL имеет совершенно другое представление о вещах.Хорошая вещь об этом - то, что это довольно прощает о ценностях, которые вы можете использовать. Он ленив в преобразовании строк в значения, и он гигиеничен в отношении того, что он принимает и отвергает (обратите внимание, что, если вышеприведенное выражение было дано в приглашении tcl, оно стерло бы жесткий диск пользователя).
Плохо то, что он требует, чтобы Tkinter был доступен, что обычно, но не всегда верно, и, что более важно, требует создания экземпляра Tk, который является сравнительно тяжелым.
То , что считается истинным или ложным в зависимости от поведения
Tcl_GetBoolean
, которое считает0
,false
,no
иoff
быть ложными и1
,true
,yes
и ,on
чтобы быть правдой, чувствительны к регистру. Любая другая строка, включая пустую строку, вызывает исключение.источник
идея: проверьте, хотите ли вы, чтобы строка была оценена как False; в противном случае bool () возвращает True для любой непустой строки.
источник
Вот что-то, что я бросил вместе, чтобы оценить истинность строки:
более-менее те же результаты, что и при использовании,
eval
но безопаснее.источник
Я просто должен был сделать это ... так что, возможно, опоздал на вечеринку - но кто-то может найти это полезным
источник
Если у вас есть контроль над объектом, который возвращает
true
/false
, один из вариантов - вернуть его1
/0
вместоtrue
/false
, а затем:boolean_response = bool(int(response))
Дополнительное приведение для
int
обработки ответов из сети, которые всегда являются строковыми.источник
Используя встроенную
eval()
функцию Python и.capitalize()
метод , вы можете преобразовать любую строку «истина» / «ложь» (независимо от начальной заглавной буквы) в истинное логическое значение Python.Например:
источник
#\nshutil.rmtree('/someImportantDirectory')
? (Не пытайтесь!)eval
чего-то такого простого - просто запрос об уязвимости.eval
этими строками кто-то мог бы взять на себя всю систему.