在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

只是要清楚一點,由於它看起來好像個人回答以某種方式冒犯了某人:

關鍵是您不想只測試一個值並假設另外一個值。 我不認爲您老是想將全部內容絕對映射到未解析的值。 產生易於出錯的代碼。

所以,若是您知道要編碼的內容。

相關文章
相關標籤/搜索