有誰知道如何在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
只是要清楚一點,由於它看起來好像個人回答以某種方式冒犯了某人:
關鍵是您不想只測試一個值並假設另外一個值。 我不認爲您老是想將全部內容絕對映射到未解析的值。 產生易於出錯的代碼。
所以,若是您知道要編碼的內容。