Mengubah dari string menjadi boolean dengan Python?


745

Adakah yang tahu cara melakukan konversi dari string ke boolean dengan Python? Saya menemukan tautan ini . Tapi itu tidak terlihat seperti cara yang tepat untuk melakukannya. Yaitu menggunakan fungsionalitas bawaan, dll.

Alasan saya menanyakan hal ini adalah karena saya belajar int("string")dari sini. Tetapi ketika mencobanya bool("string")selalu kembali True:

>>> bool("False")
True

2
saya telah membuat perpustakaan-mikro hanya untuk ini yang juga menyertakan beberapa kata asing misalnya "tak" untuk Polandia, "'是 的" dalam bahasa Mandarin-Mandarin akan dievaluasi ke True . Jika tidak secara eksplisit true-ish akan dievaluasi menjadi False . Saran diterima. Tautan Github: github.com/kmonsoor/str2bool
kmonsoor

18
Alih-alih menemukan kembali roda dan menulis banyak kode yang harus Anda kumpulkan, jawaban @ jzwiener menggunakan fungsi dari pustaka standar pythondistutils.util.strtobool(some_string) . Secara teknis output adalah tipe intdengan nilai 0atau 1-> jika Anda benar-benar ingin / perlu boolmaka Anda dapat membungkus fungsi itu dengan bool(distutils.util.strtobool(some_string)).
Trevor Boyd Smith

1
pip install str2bool
Symon

Hanya kepala. distutils.util.strtobooltidak dapat menangani asing ya / tidak, tidak seperti solusi oleh @kmonsoor, yang bagaimanapun tidak dapat menangani file CSV buatan Excel dengan Benar / Salah dalam bahasa asing (mis. VERO, FALSO). Jadi reinvention roda kadang-kadang diperlukan.
Matteo Ferla

Jawaban:


838

Sungguh, Anda hanya membandingkan string dengan apa pun yang Anda harapkan diterima mewakili benar, sehingga Anda dapat melakukan ini:

s == 'True'

Atau untuk memeriksa sejumlah nilai:

s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

Berhati-hatilah saat menggunakan yang berikut ini:

>>> bool("foo")
True
>>> bool("")
False

String kosong dievaluasi untuk False, tetapi semua yang lain dievaluasi True. Jadi ini tidak boleh digunakan untuk keperluan parsing apa pun.


48
+1: Tidak banyak yang bisa lebih sederhana dari itu s == "True". Tetapi saya telah melihat orang-orang mengacaukan ini. def convert (s): if s == "True": return True; mengembalikan False.
S.Lott

24
Saya lebih suka mengembalikan s == "Benar" daripada if / else
Dana

26
jika s == "True": kembali Benar elif s == "Salah": kembali False lain: kembali kenaikan gaji
tidak diketahui

9
Parsing string ke booleans sudah diimplementasikan di distutils.util.strtobool: stackoverflow.com/a/18472142/923599
jzwiener

9
Saya tahu ini adalah topik yang SANGAT lama, tetapi saya ingin membuktikan bahwa saya baru saja menghabiskan 4 jam mencoba men-debug kode saya. Kesalahan saya adalah mencoba untuk melemparkan bool("False"). Itu akan selalu dilemparkan ke True.
Ev.

304

Menggunakan:

bool(distutils.util.strtobool(some_string))

Nilai sebenarnya adalah y, ya, t, benar, dan 1; nilai false adalah n, no, f, false, off dan 0. Meningkatkan ValueError jika val adalah hal lain.

Sadarilah bahwa distutils.util.strtobool()mengembalikan representasi integer dan karenanya perlu dibungkus dengan bool()untuk mendapatkan nilai Boolean.


38
Sayangnya ini mengembalikan 1/ 0tidak True/ False, jadi Anda harus membungkus hasilnya dalam bool () untuk mendapatkan boolean yang sebenarnya:bool(distutils.util.strtobool(some_string))
Mariusz Jamro

2
Fungsi itu menggiurkan. Akan sempurna jika menangani bilangan bulat dan Nonedan str(None)sebagai input.
MarkHu

20
Saya lebih suka ini daripada jawaban pilihan yang lebih tinggi ... itu dari stdlib dan melakukan persis apa yang diperlukan. Biasanya tidak ada alasan untuk membutuhkan yang sebenarnya boolalih-alih 1/ 0selama Anda tidak melakukan hal-hal buruk seperti if x == False... dan jika Anda berurusan dengan ints dan Nones Anda tidak memerlukan fungsi khusus, Anda bisa memeriksanya langsung if myint:atauif not maybe_none_var:
Anentropic

4
@Secator booladalah sub-kelas dariint
Anentropic

2
Untuk menyelamatkan seseorang dari kesalahan Google: impor distutils dan import distutils.util agar ini berfungsi.
Edward B.

267
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

Kemudian menyebutnya seperti ini:

>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False

Menangani benar dan salah secara eksplisit:

Anda juga dapat membuat fungsi Anda secara eksplisit memeriksa daftar kata yang benar dan daftar kata yang salah. Maka jika itu tidak ada dalam daftar, Anda bisa melempar pengecualian.


29
sedikit peningkatan dapat dibuat menggunakan, str (v) .lower () bukan v.lower () . Kemudian, ia dapat bekerja meskipun bukan string, misalnya 1, 0
kmons atau

RE: menangani true / false secara eksplisit, Anda juga bisa memberikan nilai default jika string tidak cocok, seperti bagaimana baris perintah benar / salah bekerja: Lanjutkan? (y /
T

113

Parser JSON juga berguna untuk mengkonversi string secara umum menjadi tipe python yang masuk akal.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True

31
Perhatikan metode ini hanya berfungsi jika huruf kecil. Jika huruf besar, Anda tidak bisa. Anda harus menelepon.lower()
CppLearner

107

Dimulai dengan Python 2.6, sekarang ada ast.literal_eval:

>>> impor ast
>>> bantuan (ast.literal_eval)
Bantuan pada fungsi literal_eval di modul ast:

literal_eval (node_or_string)
    Mengevaluasi simpul ekspresi atau string yang mengandung Python dengan aman
    ekspresi. String atau simpul yang disediakan mungkin hanya terdiri dari yang berikut ini
    Struktur literal Python: string, angka, tupel, daftar, dicts, boolean,
    dan Tidak ada.

Yang tampaknya berhasil, selama Anda yakin string Anda akan berupa "True"atau "False":

>>> ast.literal_eval ("Benar")
Benar
>>> ast.literal_eval ("False")
Salah
>>> ast.literal_eval ("F")
Traceback (panggilan terakhir terakhir):
  File "", baris 1, dalam 
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", baris 68, dalam literal_eval
    return _convert (node_or_string)
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", baris 67, di _convert
    meningkatkan ValueError ('string cacat')
ValueError: string salah bentuk
>>> ast.literal_eval ("'False'")
'Salah'

Saya biasanya tidak merekomendasikan ini, tetapi ini sepenuhnya built-in dan bisa menjadi hal yang tepat tergantung pada kebutuhan Anda.


1
Tidak yakin dengan penerapan umum dari solusi ini, tetapi itu sangat bagus, secara umum. +1!
SingleNegationElimination

3
Gaah, itu mengerikan! Kemudian lagi, Anda tidak mengatakan Anda tidak merekomendasikan hal, dan itu tidak menjawab pertanyaan rapi. Bagus temukan!
Vanessa Phipps

4
Sayangnya itu tidak menangani kasus ini >>> ast.literal_eval ('true') atau ast.literal_eval ('TRUE') Meningkatkan >>> meningkatkan ValueError ('string cacat') Perbaikannya sederhana meskipun ast.literal_eval (to_test .title ())
Bhushan

Bukan solusi yang bagus untuk pertanyaan khusus ini, tapi ... Wow, literal_eval sangat berguna! String to list, dict, dll.
travc

Apakah ini berfungsi pada unicodes? Dalam tampilan Django saya, saya memiliki nilai masuk yang ingin saya ubah ke boolean, itu memberikan pengecualian string salah bentuk.
Prakhar Mohan Srivastava

48

Jika Anda tahu string akan berupa "True"atau "False", Anda bisa menggunakannya eval(s).

>>> eval("True")
True
>>> eval("False")
False

Gunakan ini hanya jika Anda yakin akan isi string, karena akan mengeluarkan pengecualian jika string tidak mengandung Python yang valid, dan juga akan mengeksekusi kode yang terkandung dalam string.


5
tali itu akan datang dari suatu tempat. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
nurettin

4
@nurettin, maka komentar saya tentang hanya menggunakannya jika Anda yakin dengan isi string.
Joel Croteau

17

Versi ini menjaga semantik konstruktor seperti int (nilai) dan menyediakan cara mudah untuk mendefinisikan nilai string yang dapat diterima.

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

3
Nit: "test case" terakhir Anda akan gagal pada panggilan pertama dan tidak menguji yang lain. Juga, itu tidak akan gagal jika kesalahan tidak dinaikkan.
augurar

12

Ini versi saya. Ini memeriksa daftar nilai positif dan negatif, meningkatkan pengecualian untuk nilai yang tidak diketahui. Dan itu tidak menerima string, tetapi semua jenis harus dilakukan.

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

Sampel berjalan:

>>> 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
>>>

Seseorang bisa digigit oleh ini: to_bool(["hello"])yang seharusnya menjadi panggilan yang benar-benar valid, jika []didukung
Rafael T

1
Mengembalikan "Pengecualian: Nilai tidak valid untuk konversi boolean: ['hello']", yang diharapkan dan didokumentasikan. Menurut pendapat saya, daftar kosong jelas salah, tetapi ['salah'] tidak jelas apa-apa, jadi saya sengaja meninggalkannya - itu fitur bukan bug. Seharusnya mudah untuk menambahkan dukungan untuk mengembalikan true untuk daftar yang tidak kosong jika itu yang Anda inginkan.
Petrucio

1
Shure Anda mendokumentasikannya. Tetapi dalam kehidupan nyata seseorang tidak akan pernah menelepon to_bool([]). Sebagai gantinya dia akan melakukan sesuatu di sepanjang baris ini: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... ´ jadi orang memiliki daftar dan ingin tahu apakah daftar ini Tidak ada atau kosong.
Rafael T

Mengapa tidak mencoba ini: >>> def a2b (arg): ... default = bool (arg) ... jika isinstance (arg, str): ... return arg.lower () di ['true', ' t ',' yes ',' y ',' 1 '] ... else: ... return default
ThePracticalOne

5
Poin minor: Anda mungkin harus lebih memilih ValueError daripada pengecualian biasa.
dshepherd

10

Anda selalu bisa melakukan sesuatu seperti

myString = "false"
val = (myString == "true")

bit pada parens akan dievaluasi menjadi False. Ini hanyalah cara lain untuk melakukannya tanpa harus melakukan pemanggilan fungsi yang sebenarnya.


1
Apa yang val = "false"dilakukan garis pada contoh ini? Kenapa disana? Apa artinya?
S.Lott

9
Saya pikir artinya 42.
Geo

@ Geo: Saya setuju; tetapi pertanyaan apa yang dijawab oleh pernyataan itu?
S.Lott

ini persis apa yang saya cari, mengevaluasi bidang input dari file dan berdasarkan pada hasil menyimpan boolean. Terima kasih.
jimh

9

Trik yang keren dan sederhana (berdasarkan apa yang diposting @Alan Marchiori), tetapi menggunakan yaml:

import yaml

parsed = yaml.load("true")
print bool(parsed)

Jika ini terlalu lebar, dapat disempurnakan dengan menguji hasil tipe. Jika jenis yaml-dikembalikan adalah str, maka itu tidak dapat dilemparkan ke jenis lain (yang dapat saya pikirkan), sehingga Anda dapat mengatasinya secara terpisah, atau membiarkannya benar.

Saya tidak akan menebak dengan cepat, tetapi karena saya bekerja dengan data yaml di bawah Qt gui, ini memiliki simetri yang bagus.


1
The yamlmodul pihak ketiga perpustakaan: PyYAML
Peter Wood

8

Saya tidak setuju dengan solusi apa pun di sini, karena mereka terlalu permisif. Ini biasanya tidak seperti yang Anda inginkan saat mengurai string.

Jadi di sini solusinya saya gunakan:

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)

Dan hasilnya:

>>> [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

Untuk lebih jelas karena sepertinya jawaban saya menyinggung seseorang:

Intinya adalah bahwa Anda tidak ingin menguji hanya untuk satu nilai dan menganggap yang lainnya. Saya tidak berpikir Anda selalu ingin memetakan Benar-benar segalanya dengan nilai yang tidak diuraikan. Itu menghasilkan kode rawan kesalahan.

Jadi, jika Anda tahu kode apa yang Anda inginkan.


2
Saya pikir Anda tidak mengerti intinya: inti dari jawaban adalah untuk menunjukkan prinsip umum, bukan untuk memberi tahu orang yang mengajukan pertanyaan dengan tepat bagaimana mereka harus melakukannya. Orang yang mengajukan pertanyaan awalnya terlalu banyak berpikir apa sebenarnya masalah sederhana.
Keith Gaughan

8
@Keith saya tidak setuju. Intinya adalah menjawab pertanyaan seperti yang ditanyakan.
estani

1
Pertanyaan yang diajukan adalah bagaimana mengkonversi string menjadi boolean. Itulah pertanyaan yang saya jawab. Saya tidak tahu apa yang dianggap sebagai string boolean yang valid untuk poster asli, dan Anda juga tidak. Itu sebabnya lebih penting menunjukkan prinsip umum daripada memberi poster jawaban lengkap. Poster asli tidak perlu semuanya dijabarkan kepada mereka: yang mereka butuhkan hanyalah prinsip umum untuk diperlihatkan. Dari situ, siapa pun yang kompeten akan mendapatkan jawaban Anda.
Keith Gaughan

2
@ Dshepherd isinstance ada untuk memastikan saya parsing apa yang saya harapkan. Saya parsing string sehingga metode car_race.lower () yang secara kebetulan mengembalikan '1' tidak boleh kembali benar, itu harus membuang ValueError. Tetapi mungkin cukup dalam kasus lain.
estani

2
@CivFan poin menarik. Meskipun saya mencobanya, dan itu tidak enak dibaca (bagi saya). elifredundan karena kata kembali, tetapi memberi Anda lebih banyak informasi tanpa harus memindai return. Tapi itu hanya saya, jika ada pelanggaran gaya PEP, saya akan mengubahnya. Tanpa kendala lain, kita harus selalu mencari keterbacaan (dan standar melakukan itu). Terima kasih atas komentarnya dan menarik!
estani

7

Dict (sungguh-sungguh, defaultdict) memberi Anda cara yang cukup mudah untuk melakukan trik ini:

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

Sangat mudah untuk menyesuaikan metode ini dengan perilaku konversi yang tepat yang Anda inginkan - Anda dapat mengisinya dengan nilai Truthy dan Falsy yang diizinkan dan membiarkannya meningkatkan pengecualian (atau mengembalikan Tidak Ada) ketika nilai tidak ditemukan, atau default ke True, atau default ke False, atau apa pun yang Anda inginkan.


5

Anda mungkin sudah memiliki solusi tetapi untuk orang lain yang mencari metode untuk mengonversi nilai menjadi nilai boolean menggunakan nilai palsu "standar" termasuk Tidak Ada, [], {}, dan "" selain false, tidak, dan 0 .

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems

1
lebih baik menggunakan set, not indan pilihan Anda untuk item palsu agak istimewa.
SilentGhost

5

Anda cukup menggunakan fungsi built-in 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)

dan hasilnya:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>

1
Ini hanya berfungsi ketika nilai yang diuji adalah python yang valid. "true" dan "false" akan memunculkan pengecualian.
Gordon Bean

13
Selain itu, kebiasaan yang sangat buruk untuk menggunakan 'eval' untuk parsing karena eval akan menjalankan kode arbitrer dalam string. Dalam beberapa situasi ini dapat menghadirkan keseluruhan keamanan besar.
Christopher Barber

7
Ini jawaban yang sangat buruk. Mengevaluasi ekspresi sewenang-wenang untuk mengurai boolean BUKAN pendekatan yang baik.
augurar

5

Namun pilihan lain

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

Tetapi dalam produksi jika Anda tidak memerlukan yang mungkin dan semua dependensinya, ide yang baik adalah melihat kode sumbernya dan menyalin bagian dari logika yang Anda butuhkan.


4

Aturan biasa untuk casting untuk bool adalah bahwa beberapa literal khusus ( False, 0, 0.0, (), [], {}) adalah palsu dan kemudian segala sesuatu yang lain adalah benar, jadi saya sarankan berikut:

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

3

Ini adalah versi yang saya tulis. Menggabungkan beberapa solusi lain menjadi satu.

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)

Jika mendapat string, ia mengharapkan nilai tertentu, jika tidak, akan menimbulkan Pengecualian. Jika tidak mendapatkan string, cukup biarkan konstruktor bool mengetahuinya. Menguji kasus ini:

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

Gunakan strsebagai gantitype('')
pppery

3

Jika Anda tahu bahwa input Anda adalah "Benar" atau "Salah" maka mengapa tidak menggunakan:

def bool_convert(s):
    return s == "True"

Anda sebenarnya tidak membutuhkannya if s else False. Pikirkan bagaimana "False" == "True"akan kembali False.
Taylor Edmiston

Jika Anda tidak yakin apakah input s adalah string atau sudah boolean, Anda dapat menambahkan if type(s) is bool: return s.
kontur

3

saya menggunakan

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""

2

Saya suka menggunakan operator ternary untuk ini, karena ini sedikit lebih ringkas untuk sesuatu yang terasa seperti tidak boleh lebih dari 1 baris.

True if myString=="True" else False

1
Bagaimana ini lebih ringkas daripada my_string == 'Benar'?
S. de Melo

2

Saya menyadari ini adalah posting lama, tetapi beberapa solusi memerlukan sedikit kode, inilah yang akhirnya saya gunakan:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

7
Itu secara fungsional setara dengan, dan lebih kompleks dari: nilai pengembalian dalam ('Benar', 'benar')
Keith Gaughan


1

Jika Anda suka saya hanya perlu boolean dari variabel yang merupakan string. Anda dapat menggunakan distils seperti yang disebutkan sebelumnya oleh @jzwiener. Namun saya tidak dapat mengimpor dan menggunakan modul seperti yang disarankannya.

Sebaliknya saya akhirnya menggunakannya dengan cara ini di python3.7

distutils string ke bool dengan python

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distutils adalah bagian dari python std lib jadi tidak perlu instalasi. Bagus sekali! 👍


1

Saya ingin berbagi solusi sederhana saya: gunakan eval(). Ini akan mengkonversi string Truedan Falseuntuk tipe boolean yang tepat JIKA string tersebut persis dalam format judul Trueatau Falseselalu huruf kapital pertama atau fungsi akan menimbulkan kesalahan.

misalnya

>>> eval('False')
False

>>> eval('True')
True

Tentu saja untuk variabel dinamis, Anda dapat dengan mudah menggunakan .title()untuk memformat string boolean.

>>> x = 'true'
>>> eval(x.title())
True

Ini akan menimbulkan kesalahan.

>>> eval('true')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined

0

inilah yang berbulu, dibangun untuk mendapatkan banyak jawaban yang sama. Perhatikan bahwa meskipun python dianggap ""salah dan semua string lainnya benar, TCL memiliki gagasan yang sangat berbeda tentang berbagai hal.

>>> 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 /']"
>>> 

Hal yang baik tentang hal ini adalah cukup memaafkan tentang nilai yang dapat Anda gunakan. Ini malas mengubah string menjadi nilai, dan itu hygenic tentang apa yang diterima dan ditolak (perhatikan bahwa jika pernyataan di atas diberikan pada prompt tcl, itu akan menghapus hard disk pengguna).

yang buruk adalah bahwa itu mengharuskan Tkinter tersedia, yang biasanya, tetapi tidak benar secara universal, dan lebih penting lagi, mengharuskan instance Tk dibuat, yang relatif berat.

Apa yang dianggap benar atau salah tergantung pada perilaku Tcl_GetBoolean, yang menganggap 0, false, nodan offmenjadi palsu dan 1, true, yesdan onuntuk menjadi kenyataan, kasus tidak sensitif. String lain, termasuk string kosong, menyebabkan pengecualian.


0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

ide: periksa apakah Anda ingin string dievaluasi menjadi False; jika tidak bool () mengembalikan True untuk string yang tidak kosong.


0

Inilah sesuatu yang saya lempar bersama untuk mengevaluasi kebenaran string:

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

hasil yang kurang lebih sama dengan menggunakan evaltetapi lebih aman.


0

Saya hanya perlu melakukan ini ... jadi mungkin terlambat ke pesta - tetapi seseorang mungkin merasa berguna

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default

0

Jika Anda memiliki kendali atas entitas yang mengembalikan true/ false, satu opsi adalah mengembalikannya 1/ 0bukan true/ false, lalu:

boolean_response = bool(int(response))

Pemain tambahan untuk intmenangani respons dari jaringan, yang selalu berupa string.


-5

Dengan menggunakan eval()fungsi dan .capitalize()metode bawaan Python , Anda dapat mengonversi string "benar" / "salah" (terlepas dari kapitalisasi awal) menjadi boolean Python sejati.

Sebagai contoh:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>

4
Apa yang terjadi, jika string berisi #\nshutil.rmtree('/someImportantDirectory')? (Jangan coba-coba!)
mastov

@mastov - downvote yang konyol. Tentunya jika Anda tidak memiliki kendali atas string yang masuk, Anda harus berhati-hati, seperti halnya dengan kode apa pun. Tetapi jika Anda mengontrol alur kerja, ini adalah solusi sederhana yang berfungsi. Jangan bingung solusi yang tidak sempurna dalam segala hal dengan jawaban yang buruk.
elPastor

1
Selain tidak menyebutkan bahaya (yang sudah membuat ini menjadi jawaban yang buruk): Anda mengusulkan untuk membersihkan input sebelumnya? Itu akan membunuh kesederhanaan metode ini, yang merupakan nilai tambah utamanya.
mastov

4
Menggunakan evalsesuatu yang sederhana ini hanya meminta kerentanan.
mastov

1
Tidak semua kode. Tetapi terutama kode yang mengubah string ke tipe lain biasanya adalah di luar kendali Anda. Seringkali Anda bahkan tidak menyadarinya. Anda mungkin berkata: "Ini basis data saya (atau file konfigurasi), ini bagian dari sistem saya, di bawah kendali saya." Kemudian Anda memberikan beberapa modul lain akses ke database karena: "Apa salahnya? Ini hanya beberapa tabel dengan string." Tetapi dengan evalstring itu mungkin membantu seseorang untuk mengambil alih seluruh sistem.
mastov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.