布尔("字符串"),但总是得到真

实际上,你只需将字符串与期望接受的内容进行比较,这样你就可以这样做:

 
s == 'True'

 
或者检查一组值:

复制代码

s in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
使用以下命令时要小心:

复制代码

>>> bool("foo")
True
>>> bool("")
False
空字符串计算为 False,但其他所有内容都计算为 True 。 所以这不应该用于任何解析目的。

原作者: Mike
复制代码

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:

你也可以让你的函数显式检查单词列表和单词列表。 如果它在两个列表中,你可以抛出一个异常。

原作者: Brian R. Bondy
从 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'
我通常不会推荐这个,但是它完全是内置的,根据你的需求,它是正确的。

原作者: Jacob Gabrielson
只是使用:

复制代码

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

真和 1 ;上的值为y,是的,t,真的,假的值为n,没有,f,false,关闭,0. 如果val是其它的,则抛出 ValueError 。

原作者: schnurstrax
JSON解析器对于将字符串转换为合理的python 类型也很有用。

复制代码

>>> import json
>>> json.loads("false")
False
>>> json.loads("true")
True
这是我的版本。它对正数和负数都进行检查,引发未知值的异常。 它不接收字符串,但任何类型都应该。

复制代码

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
>>>
一个 dict ( 真的,一个 defaultdict ) 提供了一个非常简单的方法来完成这个技巧:

复制代码

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值并让它引发异常( 或者返回无) 当一个值没有找到,或者默认为真,或者默认为 False,或者任何你想要的。

原作者: Nate
我不赞同任何解决方案,因为它们太宽容了。 在分析字符串时,这通常不是你想要的。

下面是我使用的解决方案:

复制代码

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
因为我的回答似乎冒犯了某人:

要点是你不想只测试一个值并假设另一个值。 我不认为你总是想把所有的东西映射到非解析的值。 产生容易出错的代码。

所以,如果你知道你想要什么代码。

原作者: estani
你可以简单地使用内置函数 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'>
这个版本保持了像 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