在Python中从字符串转换为布尔值?

有谁知道如何在Python中从字符串转换为布尔值? 我找到了此连接 。 但这彷佛不是正确的方法。 即便用内置功能等 python

我之因此这样问,是由于我从这里了解了int("string") 。 可是当尝试bool("string")它老是返回True函数

>>> bool("False")
True

#1楼

这是我写的版本。 将其余几种解决方案合并为一个。 测试

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

#2楼

进行浇铸,一个布尔值,一般的规则是,一些特殊的文字( False00.0() [] {}都是假的,而后一切是真实的,因此我提出如下建议: spa

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)

#3楼

这是一个毛茸茸的方法,旨在得到许多相同的答案。 请注意,尽管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的行为,该行为将0falsenooff视为false,将1trueyeson视为true,不区分大小写。 任何其余字符串(包括空字符串)都会致使异常。 string


#4楼

我喜欢使用三元运算符,由于对于某些东西来讲,它不该该超过1行,所以更加简洁。 it

True if myString=="True" else False

#5楼

我不一样意这里的任何解决方案,由于它们太宽容了。 这一般不是解析字符串时想要的。

因此这是我正在使用的解决方案:

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

只是要清楚一点,由于它看起来好像个人回答以某种方式冒犯了某人:

关键是您不想只测试一个值并假设另外一个值。 我不认为您老是想将全部内容绝对映射到未解析的值。 产生易于出错的代码。

所以,若是您知道要编码的内容。

相关文章
相关标签/搜索