Преобразование строки в булево значение в Python
Проблема:
Как мне преобразовать строку в логическое значение (булевый тип) в Python? Я попытался использовать следующий код, но он возвращает True
, даже когда строка равна "False"
:
>>> bool("False")
True
Я ожидаю, что если строка содержит "False", то результат должен быть False
. Как правильно преобразовать строку в логическое значение?
5 ответ(ов)
На самом деле, вы просто сравниваете строку с тем, что ожидаете принять за истинное значение. Например, вы можете сделать так:
s == 'True'
Или проверить соответствие сразу нескольким значениям:
s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
Будьте осторожны при использовании следующего:
>>> bool("foo")
True
>>> bool("")
False
Пустые строки оцениваются как False
, но всё остальное — как True
. Поэтому этот метод не следует использовать для парсинга.
Функция str2bool(v)
преобразует строку в логическое значение (True или False) на основе содержимого строки. Вот как она работает:
def str2bool(v):
return v.lower() in ("yes", "true", "t", "1")
Эта функция принимает строку v
, переводит ее в нижний регистр и проверяет, содержится ли она в кортеже, содержащем значения, которые должны интерпретироваться как True
: "yes", "true", "t" и "1". Если строка соответствует одному из этих значений, функция вернет True
, в противном случае — False
.
Вы можете вызвать эту функцию следующим образом:
>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False
Обработка True и False явно:
Вы также можете улучшить свою функцию, явно проверяя значения в списках для True
и False
. В этом случае, если строка не входит ни в один из списков, можно выбросить исключение. Например:
def str2bool(v):
true_values = {"yes", "true", "t", "1"}
false_values = {"no", "false", "f", "0"}
if v.lower() in true_values:
return True
elif v.lower() in false_values:
return False
else:
raise ValueError(f"Invalid truth value: {v}")
Теперь, если вы передадите неопределенное значение, будет выброшено исключение, и вы получите четкое сообщение об ошибке.
JSON-парсер также полезен для общего преобразования строк в разумные типы Python. Вот пример, как это работает:
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
Как видно из примеров, метод json.loads()
может интерпретировать строки "false" и "True" как булевы значения False
и True
соответственно, если их привести к нижнему регистру. Это может быть полезно в ситуациях, когда вам нужно преобразовать строковые представления логических значений в настоящие булевы типы Python.
ВНИМАНИЕ: Не используйте приведенный код, если вы не знаете, что делаете. Пожалуйста, ознакомьтесь с прилагаемыми отказами от ответственности и убедитесь, что вы доверяете своим входным данным, так как использование этого метода для недоверенных данных может привести к потере ваших данных и/или угрозе вашей работе.
Если вы уверены, что строка будет либо "True"
, либо "False"
, вы можете просто использовать eval(s)
.
>>> eval("True")
True
>>> eval("False")
False
Однако используйте это только в том случае, если вы уверены в содержимом строки, так как это вызовет исключение, если строка не содержит корректный код Python, и также выполнит код, содержащийся в строке.
Примечание: НИКОГДА НЕ ИСПОЛЬЗУЙТЕ eval()
, если на вход поступают данные от пользователя, так как это может привести к злоупотреблениям:
eval('os.system(‘rm -rf /’)')
Но не все так плохо! Исследования показывают, что eval()
не так уж и плох, и его использование абсолютно нормально в контексте ДОВЕРЕННОГО КОДА. Например, вы можете использовать его для конвертации строковых значений True
и False
в логический тип.
Хочу поделиться своим простым решением: используйте eval()
. Он преобразует строку True
и False
в соответствующий логический тип, если строка точно в формате заглавных букв — True
или False
, где первая буква всегда заглавная, иначе функция выдаст ошибку.
Например:
>>> eval('False')
False
>>> eval('True')
True
Конечно, для динамических переменных можно просто использовать .title()
, чтобы привести строку к нужному формату.
>>> x = 'true'
>>> eval(x.title())
True
Однако, если вы попробуете так:
>>> eval('true')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'true' is not defined
>>> eval('false')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined
Как видно, будет вызвана ошибка. Поэтому будьте осторожны при использовании eval()
!
Как проверить, пуста ли строка в Python?
Есть ли в Python метод подстроки 'contains' для строк?
Объединение двух столбцов текста в DataFrame pandas
Как получить имя функции в виде строки?
Вывод строки в текстовый файл