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

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

EDIT:

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

>>> bool("False")
True

Ответы [ 28 ]

684 голосов
/ 03 апреля 2009

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

s == 'True'

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

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

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

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

Пустые строки имеют значение False, а все остальное - True. Так что это не должно использоваться для каких-либо целей анализа.

234 голосов
/ 03 апреля 2009
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

Тогда назовите это так:

str2bool("yes")

> True

str2bool("no")

> False

str2bool("stuff")

> False

str2bool("1")

> True

str2bool("0")

> False


Явная обработка значений true и false:

Вы также можете явно проверить свою функцию на соответствие списку слов True и слову False. Тогда, если его нет ни в одном списке, вы можете выдать исключение.

213 голосов
/ 27 августа 2013

Просто используйте:

distutils.util.strtobool(some_string)

http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool

Истинными значениями являются y, да, t, true, on и 1; ложными значениями являются n, no, f, false, off и 0. Повышает ValueError, если val - что-то еще.

103 голосов
/ 28 мая 2009

Начиная с Python 2.6, теперь есть ast.literal_eval:

>>> import ast
>>> help(ast.literal_eval)
Help on function literal_eval in module ast:

literal_eval(node_or_string)
    Safely evaluate an expression node or a string containing a Python
    expression.  The string or node provided may only consist of the following
    Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
    and None.

Что, похоже, работает, если вы уверены , что ваши строки будут либо "True", либо "False":

>>> ast.literal_eval("True")
True
>>> ast.literal_eval("False")
False
>>> ast.literal_eval("F")
Traceback (most recent call last):
  File "", line 1, in 
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("'False'")
'False'

Обычно я бы этого не рекомендовал, но он полностью встроен и может быть правильным в зависимости от ваших требований.

90 голосов
/ 04 декабря 2012

Анализатор JSON также полезен для общего преобразования строк в приемлемые типы Python.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
17 голосов
/ 23 августа 2018

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

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

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

14 голосов
/ 26 сентября 2013

Эта версия сохраняет семантику конструкторов, таких как int (value), и предоставляет простой способ определения допустимых строковых значений.

def to_bool(value):
    valid = {'true': True, 't': True, '1': True,
             'false': False, 'f': False, '0': False,
             }   

    if isinstance(value, bool):
        return value

    if not isinstance(value, basestring):
        raise ValueError('invalid literal for boolean. Not a string.')

    lower_value = value.lower()
    if lower_value in valid:
        return valid[lower_value]
    else:
        raise ValueError('invalid literal for boolean: "%s"' % value)


# Test cases
assert to_bool('true'), '"true" is True' 
assert to_bool('True'), '"True" is True' 
assert to_bool('TRue'), '"TRue" is True' 
assert to_bool('TRUE'), '"TRUE" is True' 
assert to_bool('T'), '"T" is True' 
assert to_bool('t'), '"t" is True' 
assert to_bool('1'), '"1" is True' 
assert to_bool(True), 'True is True' 
assert to_bool(u'true'), 'unicode "true" is True'

assert to_bool('false') is False, '"false" is False' 
assert to_bool('False') is False, '"False" is False' 
assert to_bool('FAlse') is False, '"FAlse" is False' 
assert to_bool('FALSE') is False, '"FALSE" is False' 
assert to_bool('F') is False, '"F" is False' 
assert to_bool('f') is False, '"f" is False' 
assert to_bool('0') is False, '"0" is False' 
assert to_bool(False) is False, 'False is False'
assert to_bool(u'false') is False, 'unicode "false" is False'

# Expect ValueError to be raised for invalid parameter...
try:
    to_bool('')
    to_bool(12)
    to_bool([])
    to_bool('yes')
    to_bool('FOObar')
except ValueError, e:
    pass
12 голосов
/ 17 февраля 2012

Вот моя версия. Он проверяет списки как положительных, так и отрицательных значений, вызывая исключение для неизвестных значений. И он не получает строку, но любой тип должен делать.

def to_bool(value):
    """
       Converts 'something' to boolean. Raises exception for invalid formats
           Possible True  values: 1, True, "1", "TRue", "yes", "y", "t"
           Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
    """
    if str(value).lower() in ("yes", "y", "true",  "t", "1"): return True
    if str(value).lower() in ("no",  "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
    raise Exception('Invalid value for boolean conversion: ' + str(value))

Примеры прогонов:

>>> to_bool(True)
True
>>> to_bool("tRUe")
True
>>> to_bool("1")
True
>>> to_bool(1)
True
>>> to_bool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: 2
>>> to_bool([])
False
>>> to_bool({})
False
>>> to_bool(None)
False
>>> to_bool("Wasssaaaaa")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: Wasssaaaaa
>>>
10 голосов
/ 03 апреля 2009

вы всегда можете сделать что-то вроде

myString = "false"
val = (myString == "true")

бит в паренсе оценивается как ложный. Это просто еще один способ сделать это без необходимости фактического вызова функции.

9 голосов
/ 19 февраля 2013

Крутой, простой трюк (основанный на том, что написал @Alan Marchiori), но использующий yaml:

import yaml

parsed = yaml.load("true")
print bool(parsed)

Если оно слишком широкое, его можно уточнить, протестировав результат типа. Если возвращаемый тип yaml является str, то он не может быть приведен к какому-либо другому типу (о чем я могу думать в любом случае), так что вы можете обработать это отдельно или просто позволить ему быть истинным.

Я не буду догадываться о скорости, но так как я все равно работаю с данными yaml в Qt gui, это имеет хорошую симметрию.

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