有谁知道如何在Python中从字符串转换为布尔值? 我找到了此连接 。 但这彷佛不是正确的方法。 即便用内置功能等 python
我之因此这样问,是由于我从这里了解了int("string")
。 可是当尝试bool("string")
它老是返回True
: 函数
>>> bool("False") True
这是我写的版本。 将其余几种解决方案合并为一个。 测试
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)
若是它获得一个字符串,则它指望特定的值,不然引起Exception。 若是没有获得字符串,只需让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), ]
进行浇铸,一个布尔值,一般的规则是,一些特殊的文字( False
, 0
, 0.0
, ()
[]
{}
都是假的,而后一切是真实的,因此我提出如下建议: spa
def boolify(val): if (isinstance(val, basestring) and bool(val)): return not val in ('False', '0', '0.0') else: return bool(val)
这是一个毛茸茸的方法,旨在得到许多相同的答案。 请注意,尽管python认为""
为假,而全部其余字符串为true,但TCL对事物的见解却大相径庭。 code
>>> 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实例,它相对较重。 get
判断是假仍是假取决于Tcl_GetBoolean
的行为,该行为将0
, false
, no
和off
视为false,将1
, true
, yes
和on
视为true,不区分大小写。 任何其余字符串(包括空字符串)都会致使异常。 string
我喜欢使用三元运算符,由于对于某些东西来讲,它不该该超过1行,所以更加简洁。 it
True if myString=="True" else False
我不一样意这里的任何解决方案,由于它们太宽容了。 这一般不是解析字符串时想要的。
因此这是我正在使用的解决方案:
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
只是要清楚一点,由于它看起来好像个人回答以某种方式冒犯了某人:
关键是您不想只测试一个值并假设另外一个值。 我不认为您老是想将全部内容绝对映射到未解析的值。 产生易于出错的代码。
所以,若是您知道要编码的内容。