13

Преобразование строки в булево значение в Python

11

Проблема:

Как мне преобразовать строку в логическое значение (булевый тип) в Python? Я попытался использовать следующий код, но он возвращает True, даже когда строка равна "False":

>>> bool("False")
True

Я ожидаю, что если строка содержит "False", то результат должен быть False. Как правильно преобразовать строку в логическое значение?

5 ответ(ов)

13

На самом деле, вы просто сравниваете строку с тем, что ожидаете принять за истинное значение. Например, вы можете сделать так:

s == 'True'

Или проверить соответствие сразу нескольким значениям:

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

Будьте осторожны при использовании следующего:

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

Пустые строки оцениваются как False, но всё остальное — как True. Поэтому этот метод не следует использовать для парсинга.

3

Функция 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}")

Теперь, если вы передадите неопределенное значение, будет выброшено исключение, и вы получите четкое сообщение об ошибке.

1

JSON-парсер также полезен для общего преобразования строк в разумные типы Python. Вот пример, как это работает:

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

Как видно из примеров, метод json.loads() может интерпретировать строки "false" и "True" как булевы значения False и True соответственно, если их привести к нижнему регистру. Это может быть полезно в ситуациях, когда вам нужно преобразовать строковые представления логических значений в настоящие булевы типы Python.

0

ВНИМАНИЕ: Не используйте приведенный код, если вы не знаете, что делаете. Пожалуйста, ознакомьтесь с прилагаемыми отказами от ответственности и убедитесь, что вы доверяете своим входным данным, так как использование этого метода для недоверенных данных может привести к потере ваших данных и/или угрозе вашей работе.

Если вы уверены, что строка будет либо "True", либо "False", вы можете просто использовать eval(s).

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

Однако используйте это только в том случае, если вы уверены в содержимом строки, так как это вызовет исключение, если строка не содержит корректный код Python, и также выполнит код, содержащийся в строке.

0

Примечание: НИКОГДА НЕ ИСПОЛЬЗУЙТЕ 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()!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь