Перетворення з рядка в булеве в Python?


745

Хтось знає, як зробити перетворення з рядка в булеве в Python? Я знайшов це посилання . Але це не виглядає як належний спосіб зробити це. Тобто використання вбудованої функціональності тощо.

Причина, про яку я прошу, це тому, що я дізнався про це int("string")звідси. Але при спробі bool("string")завжди повертається True:

>>> bool("False")
True

2
я створив мікробібліотеку саме для цього, яка також включала деякі іноземні слова, наприклад "так" для польської, "" 是 的 "в мандаринсько-китайській мові буде оцінюватися на True . Якщо явно не відповідає дійсності, то результат оцінюється як хибний . Пропозиції вітаються. Посилання на Github: github.com/kmonsoor/str2bool
kmonsoor

18
Замість того, щоб винаходити колесо і писати купу коду, який вам доведеться перевозити культом, у відповіді @ jzwiener використовується функція зі стандартної бібліотеки pythondistutils.util.strtobool(some_string) . Технічно висновок вводиться intзі значенням 0або 1-> якщо ви дійсно хочете / потребуєте, boolтоді ви можете завершити цю функцію bool(distutils.util.strtobool(some_string)).
Тревор Бойд Сміт

1
pip install str2bool
Symon

Просто голови вгору. distutils.util.strtoboolне може обробляти іноземний так / ні, на відміну від рішення @kmonsoor, який, однак, не може обробляти файли CSV, створені Excel, з іноземною мовою True / False (наприклад VERO, FALSO). Тому іноді потрібне переосмислення колеса.
Маттео Ферла

Відповіді:


837

Дійсно, ви просто порівнюєте рядок з тим, що ви очікуєте на те, щоб сприйняти як істинне, так що ви можете це зробити:

s == 'True'

Або перевірити цілу купу цінностей:

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

Будьте обережні, використовуючи наступне:

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

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


48
+1: Не набагато може бути простіше, ніж s == "True". Але я бачив, як люди роблять справжній безлад. def convert (s): if s == "True": повернути True; повернути Неправдиво.
S.Lott

24
Я віддаю перевагу return s == "True" над if / else
Dana

26
if s == "True": повернути True elif s == "False": повернути False else: повернути підвищення
Невідомо

9
Синтаксичний рядки в булеві вже реалізована в distutils.util.strtobool: stackoverflow.com/a/18472142/923599
jzwiener

9
Я знаю, що це дійсно стара тема, але я хотів засвідчити, що я лише витратив 4 години, намагаючись налагодити свій код. Мою помилку намагалися подати bool("False"). Це завжди буде кинутий на True.
Єв.

304

Використання:

bool(distutils.util.strtobool(some_string))

Справжні значення - y, так, t, true, on і 1; значення false - n, no, f, false, off та 0. Підвищує ValueError, якщо val - щось інше.

Майте на увазі, що distutils.util.strtobool()повертає цілі представлення, і тому його потрібно обернути, bool()щоб отримати булеві значення.


38
На жаль, це повертається 1/ 0немає True/ False, тому вам потрібно загорнути результат у bool (), щоб отримати фактичний bool(distutils.util.strtobool(some_string))
бул

2
Ця функція мучить. Було б ідеально, якби вона обробляла цілі числа Noneі str(None)як вхід.
MarkHu

20
Я дуже віддаю перевагу цим вищим голосованим відповідям ... це від stdlib і робить саме те, що потрібно. Як правило, немає причин потрібен фактичний boolзамість 1/ до 0тих пір, поки ви не робите поганих речей, як-от if x == False... а якщо ви маєте справу з ints і Nones, вам не потрібна спеціальна функція, ви можете просто перевірити їх безпосередньо if myint:абоif not maybe_none_var:
Anentropic

4
@Secator boolє підкласомint
Анентроп

2
Щоб врятувати когось від помилок Google: імпортуйте distutils та імпортуйте distutils.util, щоб це працювало.
Едвард Б.

267
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

Поводження з правдою та помилкою явно:

Ви також можете змусити свою функцію явно перевірити наявність вірного списку слів та помилкового списку слів. Тоді, якщо його немає в жодному списку, ви можете кинути виняток.


29
невелике покращення можна зробити, використовуючи, str (v) .lower () замість v.lower () . Тоді це може працювати навіть не струнно, наприклад 1, 0
kmonsoor

RE: явно обробляючи true / false, ви також можете надати значення за замовчуванням, якщо рядок не збігається, як, наприклад, як працює запит командного рядка true / false: Продовжити? (в / п)
Іонус

113

Аналізатор JSON також корисний для перетворення рядків у розумні типи пітона.

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

31
Зверніть увагу, що цей метод працює лише у малому регістрі. Якщо це великі регістри, ви не можете. Вам потрібно зателефонувати.lower()
CppLearner

107

Починаючи з Python 2.6, зараз є ast.literal_eval:

>>> імпорт ast
>>> допомога (ast.literal_eval)
Довідка щодо функції literal_eval в модулі ast:

literal_eval (node_or_string)
    Безпечно оцініть вузол виразів або рядок, що містить Python
    вираз. Надана рядок або вузол може складатися лише з наступного
    Літеральні структури Python: рядки, числа, кортежі, списки, дикти, булеві,
    і Ні.

Який , здається, працює, до тих пір , поки ви впевнені , що ваші рядки будуть або "True"або "False":

>>> ast.literal_eval ("Правда")
Правда
>>> ast.literal_eval ("Неправдиво")
помилковий
>>> ast.literal_eval ("F")
Відстеження (останній останній дзвінок):
  Файл "", рядок 1, в 
  Файл "/opt/Python-2.6.1/lib/python2.6/ast.py", рядок 68, у літеральному_евалі
    return _convert (node_or_string)
  Файл "/opt/Python-2.6.1/lib/python2.6/ast.py", рядок 67, в _convert
    підвищити ValueError ('неправильно сформована рядок')
ValueError: неправильно сформований рядок
>>> ast.literal_eval ("'Неправдивий'")
'Помилковий'

Я б зазвичай не рекомендував це, але він повністю вбудований і може бути правильною річчю залежно від ваших вимог.


1
Не впевнений у загальній застосуванні цього рішення, але це дуже приємно, загалом. +1!
SingleNegationElimination

3
Гаа, це жахливо! Знову ж , ви ж говорите , що не рекомендую його, і він робить відповідь на питання акуратно. Гарна знахідка!
Ванеса Фіппс

4
На жаль, він не обробляє цей випадок >>> ast.literal_eval ('true') або ast.literal_eval ('TRUE') підвищує >>> підвищує ValueError ('неправильно сформована рядок') Виправлення є простим, хоча ast.literal_eval (to_test .title ())
Бхушан

Не чудове рішення цього конкретного питання, але ... Нічого, літеральний_евал чортз корисний! Рядок до списку, диктату, ект.
travc

Чи працює це на унікодах? На мій погляд на Django, я маю вхідне значення, яке я хочу змінити на булеве, воно дає виняток з неправильним формуванням рядка.
Прахар Мохан Срівастава

48

Якщо ви знаєте, що рядок буде або "True"або "False", ви можете просто використовувати eval(s).

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

Використовуйте це лише у тому випадку, якщо ви впевнені у вмісті рядка, оскільки це викине виключення, якщо рядок не містить дійсного Python, а також виконає код, що міститься в рядку.


5
ця струна звідкись прийде. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Нуреттін

4
@nurettin, звідси мій коментар про його використання, лише якщо ви впевнені у вмісті рядка.
Джоель Крото

17

Ця версія зберігає семантику таких конструкторів, як 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

3
Ніт: Ваш останній "тестовий випадок" помилиться під час першого дзвінка, а не перевірятиме інші. Також не вийде з ладу, якщо помилка не буде підвищена.
аугурар

12

Ось моя версія. Він перевіряє як позитивні, так і негативні списки значень, створюючи виняток для невідомих значень. І він не отримує рядок, але будь-який тип повинен робити.

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
>>>

Можна було би покусати цим: to_bool(["hello"])що має бути ідеально правильним дзвінком, якщо []він підтримується
Рафаель T

1
Повертає "Виняток: Недійсне значення для булевого перетворення: ['hello']", яке очікується та задокументується. На мій погляд, порожній список явно був помилковим, але ['false'] не було явно нічого, тому я навмисно його випустив - це особливість, а не помилка. Слід легко додати підтримку повернення істини для не порожніх списків, якщо саме цього ви хочете.
Петрусіо

1
shure ви це задокументували. Але в реальному житті ніколи б не зателефонував to_bool([]). Натомість він би щось робив за цими рядками: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... ', тому у кожного є список і хоче знати, чи цей список є None або порожній.
Рафаель Т

Чому б не спробувати це: >>> def a2b (arg): ... default = bool (arg) ... if isin substance (arg, str): ... return arg.lower () in ['true', ' t ',' так ',' y ',' 1 '] ... else: ... повернути дефолт
ThePracticalOne

5
Незначна точка: вам, мабуть, слід віддати перевагу ValueError над простим винятком.
дшеферд

10

ви завжди могли зробити щось подібне

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

біт у паренах оцінюватиметься як False. Це просто ще один спосіб зробити це без необхідності виконувати фактичний виклик функції.


1
Що val = "false"робить рядок на цьому прикладі? Чому саме там? Що це означає?
S.Lott

9
Я думаю, це означає 42.
Гео

@Geo: Я згоден; але яке питання було на це відповідь?
S.Lott

саме це я шукав, оцінюючи поле введення з файлу та грунтуючись на результаті зберігання булева. Дякую тобі.
jimh

9

Класний, простий трюк (заснований на публікації @Alan Marchiori), але з використанням yaml:

import yaml

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

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

Я не буду робити здогадів із швидкістю, але оскільки я все одно працюю з даними yaml під Qt gui, це має приємну симетрію.


1
yamlМодуль є бібліотекою , третя сторона: PyYAML
Пітер Вуд

8

Я не згоден з жодним рішенням тут, оскільки вони занадто дозвільні. Зазвичай це не те, що потрібно під час розбору рядка.

Отже, тут я використовую рішення:

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

Просто, щоб було зрозуміло, бо виглядає так, ніби моя відповідь когось образила когось:

Справа в тому, що ви не хочете перевіряти лише одне значення, а припускати інше. Я не думаю, що ти завжди хочеш позначати абсолютно все на неадекватне значення. Це створює код, схильний до помилок.

Отже, якщо ви знаєте, що ви хочете, введіть його.


2
Я думаю, що ви пропускаєте думку: суть відповідей полягала в тому, щоб продемонструвати загальний принцип, а не сказати людині, яка задала питання, як саме вони повинні це робити. Людина, яка задала питання спочатку, переосмислила, що насправді є простою проблемою.
Кіт Гоген

8
@Keith Я не згоден. Суть у тому, щоб відповісти на запитання, як воно задається.
Естані

1
Питання було, як перетворити рядок в булева. На це я відповів. Я поняття не маю, що вважається дійсним булевим рядком для оригінального плаката, і ні ви. Ось чому важливіше продемонструвати загальний принцип, ніж дати афіші повну відповідь. Оригінальний плакат не потребував всього, що їм прописано: все, що їм було потрібно, було продемонстровано загальним принципом. Звідси будь-хто компетентний отримає вашу відповідь.
Кіт Гоген

2
@dshepherd істота є, щоб бути впевненим, я розбираю те, що очікую. Я розбираю рядки, таким чином, метод car_race.lower (), який випадково повертає значення "1" не повинен повертати true, він повинен кидати ValueError. Але це може бути достатньо і в інших випадках.
estani

2
@CivFan цікавий момент. Хоча я спробував це, і він не читав так приємно (мені). elifє надлишковим через зворотне слово, але воно дає більше інформації, не потребуючи сканування return. Але це тільки я, якщо є порушення стилю PEP, я б змінив це. Без будь-якого іншого обмеження, ми завжди повинні прагнути до читабельності (і стандарти це роблять). Дякую за голову вгору та цікавий коментар!
estani

7

Дікт (насправді, вирок за замовчуванням) дає вам досить простий спосіб виконати цю хитрість:

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, або що завгодно.


5

Напевно, у вас вже є рішення, але для інших, хто шукає метод перетворення значення в булеве значення, використовуючи "стандартні" помилкові значення, включаючи None, [], {} і "" на додаток до false, no і 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

1
краще використовувати набори, not inа ваш вибір помилкових предметів дещо ідіосинкратичний.
SilentGhost

5

Ви можете просто використовувати вбудовану функцію 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'>

1
Це працює лише тоді, коли випробувані значення є дійсними python. "true" і "false" призведе до виключення.
Гордон Бін

13
Крім того, це дуже погана звичка використовувати 'eval' для розбору, оскільки eval запустить довільний код у рядку. У деяких ситуаціях це може становити величезне ціле забезпечення.
Крістофер Барбер

7
Це дійсно погана відповідь. Оцінка довільного виразу для розбору булевого НЕ є вдалим підходом.
аугурар

5

Ще один варіант

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

Але у виробництві, якщо вам не потрібен ansible та всі його залежності, гарною ідеєю є переглянути його вихідний код та скопіювати частину логіки, яка вам потрібна.


4

Звичайне правило для відливання до 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)

3

Це версія, яку я написав. Поєднує кілька інших рішень в одне.

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),
    ]

Використовуйте strзамістьtype('')
pppery

3

Якщо ви знаєте, що ваш вклад буде "True" або "False", то чому б не використовувати:

def bool_convert(s):
    return s == "True"

Ви насправді не потребуєте if s else Falseшматочка. Подумайте, як "False" == "True"уже повернуться False.
Тейлор Едмістон

Якщо ви не впевнені, чи є вхідним рядком рядок або булевим, ви можете додати if type(s) is bool: return s.
kontur

3

я використовую

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""

2

Мені подобається використовувати для цього потрійний оператор, оскільки це трохи більш лаконічно для чогось, що здається, що воно не повинно бути більше 1 рядка.

True if myString=="True" else False

1
Чим це більш лаконічно, ніж my_string == 'True'?
S. de Melo

2

Я усвідомлюю, що це стара публікація, але для деяких рішень потрібен трохи код, ось що я в кінцевому підсумку використав:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

7
Це функціонально еквівалентно і складніше, ніж: повернення значення в ('True', 'true')
Кіт Гоген


1

Якщо ви мені подобаєтесь, просто потрібна булева змінна, яка є рядком. Ви можете використовувати дистиляти, як згадував раніше @jzwiener. Однак я не міг імпортувати та використовувати модуль, як він запропонував.

Натомість я в кінцевому підсумку використовую його таким чином на python3.7

distutils рядок bool у python

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distutils є частиною вкладки python std, тому не потрібно встановлювати. Що чудово! 👍


1

Я хотів би поділитися своїм простим рішенням: використовувати 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>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined

0

ось волохатий, побудований так, щоб отримати багато однакових відповідей. Зауважте, що хоча python вважає ""помилковим і всі інші рядки є правдивими, TCL має зовсім інше уявлення про речі.

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> var = Tkinter.BooleanVar(tk)
>>> var.set("false")
>>> var.get()
False
>>> var.set("1")
>>> var.get()
True
>>> var.set("[exec 'rm -r /']")
>>> var.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 324, in get
    return self._tk.getboolean(self._tk.globalgetvar(self._name))
_tkinter.TclError: 0expected boolean value but got "[exec 'rm -r /']"
>>> 

Гарна річ у цьому полягає в тому, що він досить прощає цінності, які ви можете використовувати. Лінується перетворювати рядки у значення, і це гігієнічно щодо того, що він приймає та відхиляє (зауважте, що якби вищезазначене твердження було надано під час запрошення tcl, воно стерло б жорсткий диск користувачів).

Погано в тому, що він вимагає, щоб Tkinter був доступний, що зазвичай, але не є загальновиробничим, а ще важливіше, вимагає створення екземпляра Tk, який порівняно важкий.

Те , що вважається істинним або хибним в залежності від поведінки Tcl_GetBoolean, яке вважає 0, false, noі offбути помилковими і 1, true, yesі , onщоб бути правдою, чутливі до регістру. Будь-який інший рядок, включаючи порожній рядок, викликає виняток.


0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

ідея: перевірте, чи хочете ви, щоб рядок оцінювався як False; інакше bool () повертає True для будь-якої не порожньої рядки.


0

Ось що я зібрав разом, щоб оцінити правдивість струни:

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

більш-менш такі ж результати, як використання, evalале безпечніші.


0

Мені просто довелося це зробити ... тому, можливо, пізно на вечірку - але хтось може вважати це корисним

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default

0

Якщо у вас є контроль над сутністю, яка повертається true/ false, одним із варіантів є його повернення 1/ 0замість true/ false, тоді:

boolean_response = bool(int(response))

Додатковий склад для intобробки відповідей з мережі, які завжди є рядковими.


-5

За допомогою вбудованої eval()функції Python та.capitalize() метод , ви можете перетворити будь-яку "істинну" / "помилкову" рядок (незалежно від початкової великої літери) в справжню булеву Python.

Наприклад:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>

4
Що станеться, якщо рядок містить #\nshutil.rmtree('/someImportantDirectory')? (Не намагайся!)
мастов

@mastov - смішний downvote. Очевидно, якщо ви не маєте контролю над вхідним рядком, вам потрібно встановити запобіжні заходи, як і для будь-якого коду. Але якщо ви контролюєте робочий процес, це просте рішення, яке працює. Не плутайте рішення, яке не є ідеальним у всіх відношеннях, з поганою відповіддю.
elPastor

1
Крім того, щоб не згадувати про небезпеку (що вже робить це поганою відповіддю): Ви пропонуєте заздалегідь провести санітарний вклад? Це знищить простоту цього методу, що було його головним плюсом.
мастов

4
Використовувати evalдля чогось такого простого - це просто просити вразливість.
мастов

1
Не весь код. Але особливо код, який перетворює рядки в інші типи, як правило, знаходиться поза вашим контролем. Часто ви можете навіть не усвідомлювати цього. Ви можете сказати: "Це моя база даних (або конфігураційний файл), це частина моєї системи, під моїм контролем". Потім ви надаєте якомусь іншому модулю доступ до бази даних, оскільки: "Яка шкода? Це лише деякі таблиці з рядками." Але за допомогою evalцих рядків хтось може допомогти захопити всю систему.
мастов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.