Преобразование из строки в логическое значение в Python? - PullRequest
594 голосов
/ 03 апреля 2009

Кто-нибудь знает, как сделать преобразование из строки в логическое значение в Python? Я нашел эту ссылку . Но это не похоже на правильный способ сделать это. То есть использование встроенного функционала и т. д.

EDIT:

Причина, по которой я спросил это, заключается в том, что я выучил int("string") отсюда. Я пытался bool("string"), но всегда получал True.

>>> bool("False")
True

Ответы [ 28 ]

7 голосов
/ 26 ноября 2012

Я не согласен с каким-либо решением здесь, поскольку они слишком разрешительны. Обычно это не то, что вам нужно при разборе строки.

Итак, вот решение, которое я использую:

def to_bool(bool_str):
    """Parse the string and return the boolean value encoded or raise an exception"""
    if isinstance(bool_str, basestring) and bool_str: 
        if bool_str.lower() in ['true', 't', '1']: return True
        elif bool_str.lower() in ['false', 'f', '0']: return False

    #if here we couldn't parse it
    raise ValueError("%s is no recognized as a boolean value" % bool_str)

И результаты:

>>> [to_bool(v) for v in ['true','t','1','F','FALSE','0']]
[True, True, True, False, False, False]
>>> to_bool("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in to_bool
ValueError: '' is no recognized as a boolean value

Просто чтобы прояснить, потому что, похоже, мой ответ кого-то как-то обидел:

Дело в том, что вы не хотите проверять только одно значение и предполагать другое. Я не думаю, что вы всегда хотите отобразить Абсолютно все на непарсированное значение. Это приводит к ошибочному коду.

Итак, если вы знаете, что вы хотите, введите его.

7 голосов
/ 11 августа 2014

Вы можете просто использовать встроенную функцию eval () :

a='True'
if a is True:
    print 'a is True, a type is', type(a)
else:
    print "a isn't True, a type is", type(a)
b = eval(a)
if b is True:
    print 'b is True, b type is', type(b)
else:
    print "b isn't True, b type is", type(b)

и вывод:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>
5 голосов
/ 15 января 2010

Возможно, у вас уже есть решение, но для тех, кто ищет метод для преобразования значения в логическое значение, используя "стандартные" ложные значения, включая None, [], {} и "" в дополнение к false, нет и 0.

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems
5 голосов
/ 16 марта 2012

Диктовка (действительно, по умолчанию) дает вам довольно простой способ сделать этот трюк:

from collections import defaultdict
bool_mapping = defaultdict(bool) # Will give you False for non-found values
for val in ['True', 'yes', ...]:
    bool_mapping[val] = True

print(bool_mapping['True']) # True
print(bool_mapping['kitten']) # False

Действительно легко адаптировать этот метод к нужному поведению преобразования - вы можете заполнить его допустимыми значениями Truthy и Falsy и позволить ему вызывать исключение (или возвращать None), когда значение не найдено или по умолчанию в True или по умолчанию в False, или как вам угодно.

4 голосов
/ 15 октября 2018

Еще один вариант

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

Но в производственном процессе, если вам не нужен ansible и все его зависимости, хорошая идея - взглянуть на его исходный код и скопировать часть необходимой вам логики.

3 голосов
/ 14 мая 2012

Это версия, которую я написал. Объединяет несколько других решений в одно.

def to_bool(value):
    """
    Converts 'something' to boolean. Raises exception if it gets a string it doesn't handle.
    Case is ignored for strings. These string values are handled:
      True: 'True', "1", "TRue", "yes", "y", "t"
      False: "", "0", "faLse", "no", "n", "f"
    Non-string values are passed to bool.
    """
    if type(value) == type(''):
        if value.lower() in ("yes", "y", "true",  "t", "1"):
            return True
        if value.lower() in ("no",  "n", "false", "f", "0", ""):
            return False
        raise Exception('Invalid value for boolean conversion: ' + value)
    return bool(value)

Если он получает строку, он ожидает определенных значений, в противном случае возникает исключение. Если он не получает строку, просто дайте понять конструктору bool. Проверены эти случаи:

test_cases = [
    ('true', True),
    ('t', True),
    ('yes', True),
    ('y', True),
    ('1', True),
    ('false', False),
    ('f', False),
    ('no', False),
    ('n', False),
    ('0', False),
    ('', False),
    (1, True),
    (0, False),
    (1.0, True),
    (0.0, False),
    ([], False),
    ({}, False),
    ((), False),
    ([1], True),
    ({1:2}, True),
    ((1,), True),
    (None, False),
    (object(), True),
    ]
3 голосов
/ 10 августа 2013

Я понимаю, что это старый пост, но некоторые решения требуют немного кода, вот что я в итоге использовал:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)
3 голосов
/ 12 июля 2009

Обычное правило приведения к типу bool состоит в том, что несколько специальных литералов (False, 0, 0.0, (), [], {}) ложны, а затем все остальное верно , поэтому я рекомендую следующее:

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)
2 голосов
/ 23 марта 2016

Если вы знаете, что ваш ввод будет "True" или "False", то почему бы не использовать:

def bool_convert(s):
    return s == "True"
2 голосов
/ 01 августа 2012

Мне нравится использовать для этого троичный оператор, поскольку он более лаконичен для того, что кажется, что оно не должно быть больше 1 строки.

True if myString=="True" else False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...