Pythonで文字列からブール値に変換しますか?


745

誰かがPythonで文字列からブール値に変換する方法を知っていますか?このリンクを見つけました。しかし、それを行う適切な方法のようには見えません。つまり、組み込み機能などを使用します。

私がこれを尋ねる理由は、私int("string")がここから学んだからです。しかし、bool("string")それを試すと常に戻りますTrue

>>> bool("False")
True

2
私はこれだけのためにいくつかの外国語を含むマイクロライブラリを作成しました。たとえば、ポーランド語の「tak」、北京語の「 '是的」はTrueと評価されます。明示的でない場合、true-ishはFalseと評価されます。提案は大歓迎です。Githubリンク:github.com/kmonsoor/str2bool
kmonsoor

18
@jzwienerの答えは、ホイールを再発明してカルトカルトする必要のある一連のコードを記述するのではなく、Python標準ライブラリの関数をdistutils.util.strtobool(some_string)使用しています。技術的には、出力はint値付きの型0または1->本当に必要なbool場合は、その関数をでラップできますbool(distutils.util.strtobool(some_string))
Trevor Boyd Smith

1
pip install str2bool
Symon

頭を上げただけです。distutils.util.strtobool@kmonsoorによる解決策とは異なり、外国語のはい/いいえを処理できませんが、外国語のTrue / False(VERO、などFALSO)でExcelで作成されたCSVファイルを処理できません。そのため、ホイールの再発明が必要になる場合があります。
Matteo Ferla

回答:


838

実際には、文字列を、trueを表すものとして受け入れると期待するものと比較するだけなので、次のようになります。

s == 'True'

または、一連の値全体をチェックするには:

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

以下を使用する場合は注意が必要です。

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

空の文字列はに評価されますがFalse、それ以外はすべてに評価されTrueます。したがって、これはいかなる種類の解析目的にも使用すべきではありません。


48
+1:ほど簡単なものはありませんs == "True"。しかし、私は人々がこれを実際に台無しにするのを見てきました。def convert(s):if s == "True":Trueを返します。Falseを返します。
S.Lott、2009

24
私はif / elseよりもs == "True"を返すことを好む
Dana

26
if s == "True":trueを返すelif s == "False":falseを返すelse:レイズを返す
不明

9
ブール値への文字列の解析は、distutils.util.strtoboolにすでに実装されています:stackoverflow.com/a/18472142/923599
jzwiener 2013

9
私はこれが本当に古いトピックであることを知っていますが、コードのデバッグに4時間費やしたことを証明したかったのです。私の間違いはキャストしようとしていたbool("False")。常ににキャストされTrueます。
Ev。

304

使用する:

bool(distutils.util.strtobool(some_string))

真の値は、y、yes、t、true、on、および1です。false値は、n、no、f、false、off、および0です。valがそれ以外の場合、ValueErrorが発生します。

distutils.util.strtobool()は整数表現を返すbool()ため、ブール値を取得するにはラップする必要があることに注意してください。


38
残念ながら、このリターン1/ 0ないTrue/ Falseので、あなたは、実際のブール値を取得するために、ブール値()で結果をラップする必要がありますbool(distutils.util.strtobool(some_string))
マリウシュJamro

2
その機能は食欲をそそります。それが整数として、Noneおよびstr(None)入力として処理されれば完璧です。
MarkHu

20
私はこれを投票数の多い回答よりもずっと好きです...それはstdlibからのものであり、必要なことを正確に行います。...のような悪いことをしていない限りbool1/の代わりに実際に必要とする理由は通常あり0ませんif x == False。また、intsとNonesを扱っている場合は、特別な関数が必要ない場合は、それらをチェックするだけです。直接if myint:またはif not maybe_none_var:
Enentropic

4
@Secator boolは、サブクラスですint
エントロピー2014

2
エラーをグーグルで保存するには、distutilsをインポートし、distutils.utilをインポートしてください。
エドワードB.

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

次に、次のように呼び出します。

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

trueとfalseを明示的に処理する:

関数に、単語の真のリストと単語の偽のリストを明示的にチェックさせることもできます。次に、どちらのリストにもない場合は、例外をスローできます。


29
少しエンハンスメントを用いて作製することができる、STR(V).lower()の代わりにv.lower() 。次に、文字列でなくても機能します。たとえば、1、0
kmonsoor

RE:true / falseを明示的に処理します。文字列が一致しない場合は、true / falseコマンドラインプロンプトの動作と同様に、デフォルト値を指定することもできます。続行しますか?(y / N)
Johnus

113

JSONパーサーは、一般的に文字列を適切なpythonタイプに変換する場合にも役立ちます。

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

31
このメソッドは小文字の場合にのみ機能することに注意してください。大文字の場合はできません。電話する必要があります.lower()
CppLearner 2013年

107

Python 2.6以降では、 ast.literal_eval

>>> astをインポート
>>>ヘルプ(ast.literal_eval)
モジュールastの関数literal_evalに関するヘルプ:

literal_eval(node_or_string)
    式ノードまたはPythonを含む文字列を安全に評価する
    式。提供される文字列またはノードは、次のもののみで構成されます
    Pythonリテラル構造:文字列、数値、タプル、リスト、辞書、ブール値、
    なし。

文字列が次のいずれかになることが確実である限り、これはうまくいくようです:"True""False"

>>> ast.literal_eval( "真")
本当
>>> ast.literal_eval( "False")
誤り
>>> ast.literal_eval( "F")
トレースバック(最新の呼び出しが最後):
  ファイル ""、1行目 
  ファイル「/opt/Python-2.6.1/lib/python2.6/ast.py」、68行目、literal_eval
    _convert(node_or_string)を返す
  ファイル「/opt/Python-2.6.1/lib/python2.6/ast.py」、67行目、_convert内
    ValueError( '不正な文字列')を発生させます
ValueError:不正な形式の文字列
>>> ast.literal_eval( "'False'")
「誤り」

通常はお勧めしませんが、完全に組み込まれているため、要件によっては適切な場合もあります。


1
このソリューションの一般的な適用性はわかりませんが、一般的な方法では非常に優れています。+1!
SingleNegationElimination 2009

3
ああ、それは恐ろしいことです!それから、あなたそれをお勧めしないと言いました、そしてそれきちんと質問に答えます。良い発見!
ヴァネッサフィップス

4
残念ながら、このケースは処理されません>>> ast.literal_eval( 'true')またはast.literal_eval( 'TRUE')発生します>>> raise ValueError( 'malformed string')ast.literal_eval(to_test .title())
ブーシャン

この特定の質問に対する優れた解決策ではありませんが、...うわー、literal_evalはとても便利です。リスト、辞書、その他の文字列。
travc 2014年

それはユニコードで動作しますか?私のDjangoビューでは、ブール値に変更したい着信値があり、不正な文字列例外が発生しています。
Prakhar Mohan Srivastava

48

文字列がまたはのどちら"True""False"になることがわかっている場合は、そのまま使用できますeval(s)

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

ただし、文字列に有効なPythonが含まれていない場合は例外がスローされ、文字列に含まれているコードも実行されるため、文字列の内容が確実な場合にのみ使用してください。


5
その文字列はどこから来ます。if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
ヌレティン

4
@nurettinなので、文字列の内容が確かな場合にのみ使用することについての私のコメント。
ジョエルクロトー

17

このバージョンは、int(value)のようなコンストラクターのセマンティクスを保持し、受け入れ可能な文字列値を定義する簡単な方法を提供します。

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:最後の「テストケース」は、最初の呼び出しでエラーになり、他のテストは行いません。また、エラーが発生しなくても失敗しません
オーギュラ2017年

12

これが私のバージョンです。正の値リストと負の値リストの両方をチェックして、不明な値の例外を発生させます。そして、それは文字列を受け取りませんが、どんなタイプでも受け取るべきです。

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

サンプルの実行:

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

これに噛まれる可能性があります:サポートされているto_bool(["hello"])場合、これ[]は完全に有効な呼び出しです
Rafael T

1
「例外:ブール値変換の無効な値:['hello']」が返されます。これは予期され、文書化されています。私の意見では、空のリストは明らかに誤りでしたが、['false']は明らかに何でもないため、意図的に除外しました。これはバグではなく機能です。空でないリストに対してtrueを返すサポートが必要な場合は、簡単にサポートを追加できます。
Petrucio

1
あなたはそれを文書化しました。しかし、実際のライブでは、電話をかけることは決してありませんto_bool([])。代わりに、彼はこれらの行に沿って何かを行います:myList=someFunctionThatReturnAList`if(is_bool(myList)):... 'したがって、リストがあり、このリストがNoneまたは空であるかどうかを知りたいです。
Rafael T

なぜこれを試さないのか:>>> def a2b(arg):... default = bool(arg)... if isinstance(arg、str):... return arg.lower()in ['true'、 ' t '、' yes '、' y '、' 1 '] ... else:...デフォルトを返す
ThePracticalOne

5
マイナーポイント:おそらく、単純な例外よりもValueErrorを優先する必要があります。
dshepherd

10

あなたはいつも次のようなことをすることができます

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

括弧内のビットはFalseと評価されます。これは、実際の関数呼び出しを行わなくても実行できるもう1つの方法です。


1
val = "false"この例で行は何をしていますか?なぜそこにあるのですか?どういう意味ですか?
S.Lott、2009

9
私はそれが42を意味だと思う
ジオ

@地域:同意します。しかし、その声明で答えられる質問は何でしたか?
S.Lott、2009

これはまさに私が探していたものであり、ファイルの入力フィールドを評価し、ブール値を格納する結果に基づいています。ありがとうございました。
jimh 2017年

9

クールでシンプルなトリック(@Alan Marchioriの投稿に基づく)ですが、yamlを使用します。

import yaml

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

これが広すぎる場合は、型の結果をテストすることで調整できます。yamlが返す型がstrである場合、それは他の型(とにかく考えることができる)にキャストできないため、それを個別に処理するか、単にtrueにすることができます。

私は何も推測しませんが、とにかくQt guiでyamlデータを操作しているので、これは素晴らしい対称性を持っています。


1
yamlモジュールは、サードパーティのライブラリです:PyYAMLと
ピーター・ウッド

8

許容範囲が広すぎるため、ここでの解決策には同意しません。これは通常、文字列を解析するときに必要なことではありません。

だからここで私が使っている解決策:

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

はっきりしているのは、私の回答が誰かを怒らせたかのように見えるからです。

ポイントは、1つの値だけをテストして、もう1つの値を仮定したくないということです。常にすべてを解析されていない値にマッピングする必要があるとは思いません。エラーが発生しやすいコードが生成されます。

だから、あなたがそれをコーディングしたいものがわかっているなら。


2
ポイントを逃していると思います:答えのポイントは、一般的な原理を示すことであり、質問した人に正確にどのようにすべきかを伝えることではありませんでした。質問をした人は、もともとは単純な問題とは何なのかを考えすぎていました。
Keith Gaughan、

8
@キース私は同意しません。重要なのは、質問されたとおりに質問に答えることです。
estani 2012年

1
質問は、文字列をブール値に変換する方法でした。それが私が答えた質問でした。元のポスターに有効なブール文字列と見なされるものもわかりませんし、あなたも知りません。そのため、投稿者に完全な答えを与えるよりも、一般原則を示すことが重要です。元のポスターでは、すべてを綴る必要はありませんでした。必要なのは、一般的な原則を実証することだけでした。それから、有能な誰でもあなたの答えを得るでしょう。
Keith Gaughan、

2
@dshepherd isinstanceは、期待どおりに解析していることを確認するためにあります。文字列を解析しているので、偶然 '1'を返すcar_race.lower()メソッドはtrueを返さず、ValueErrorをスローします。しかし、他の場合にはそれで十分かもしれません。
エスタニ2015

2
@CivFan興味深い点。私はそれを試してみましたが、それは(私にとって)あまり読みませんでした。elifはリターンワードのため冗長ですが、をスキャンしなくても、より多くの情報が得られますreturn。しかし、それは私だけです。PEPスタイルの違反があった場合は、それを変更します。他の制約なしに、私たちは常に読みやすさを追求する必要があります(そして標準はそれを行います)。ヘッドアップと興味深いコメントをありがとう!
エスタニ2015

7

dict(実際にはdefaultdict)は、このトリックを行う非常に簡単な方法を提供します。

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

このメソッドを希望する正確な変換動作に合わせて調整するのは非常に簡単です。許可されたTruthyおよびFalsyの値をこのメソッドに入力し、値が見つからない場合、またはデフォルトでTrueになっている場合に例外を発生させる(またはNoneを返す)ことができます。デフォルトはFalse、または必要なものに設定します。


5

おそらくすでに解決策がありますが、false、no、および0に加えて、None、[]、{}、および ""を含む「標準」のfalse値を使用して値をブール値に変換する方法を探している他の人のために。

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
セットを使用することnot inをお勧めします。また、誤ったアイテムの選択は多少特異的です。
SilentGhost 2010年

5

組み込み関数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)

そして出力:

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

1
これは、テストされた値が有効なpythonである場合にのみ機能します。「true」と「false」は例外を発生させます。
Gordon Bean

13
さらに、evalは文字列内で任意のコードを実行するため、解析に「eval」を使用するのは非常に悪い習慣です。状況によっては、これによりセキュリティ全体が大きくなる場合があります。
Christopher Barber

7
これは本当に悪い答えです。ブールを解析するために任意の式を評価することは良い方法ではありません。
オーギュラ2017年

5

さらに別のオプション

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

しかし、実稼働環境では、ansibleとそのすべての依存関係が必要ない場合は、ソースコードを確認して、必要なロジックの一部をコピーすることをお勧めします。


4

ブール値にキャストするための通常のルールがあることいくつかの特別なリテラル(False00.0()[]{})がfalseと私は次のことをお勧めしますので、その後、他のすべてが、真です。

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

3

これは私が書いたバージョンです。他のいくつかのソリューションを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)

文字列を取得する場合は特定の値が必要ですが、そうでない場合は例外が発生します。文字列を取得しない場合は、ブールコンストラクターにそれを認識させるだけです。次のケースをテストしました:

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

str代わりに使用type('')
pppery

3

入力が「True」または「False」のいずれかになることがわかっている場合は、次のように使用しないでください。

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

実際にはif s else Falseビットは必要ありません。"False" == "True"すでにどのように戻るかについて考えFalseます。
テイラーエドミストン2016年

入力sが文字列なのか、それともすでにブール値なのかわからない場合は、を追加できif type(s) is bool: return sます。
kontur 2017年

3

私が使う

# 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

これには3項演算子を使用します。これは、1行を超えてはならないような感じの場合は少し簡潔になるためです。

True if myString=="True" else False

1
my_string == 'True'よりもどのように簡潔ですか?
S. de Melo

2

私はこれが古い投稿であることを理解していますが、いくつかの解決策はかなりのコードを必要とします、これが私が最終的に使用したものです:

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

7
これは、機能的に同等であり、より複雑です:( 'True'、 'true')の戻り値
Keith Gaughan


1

私が好きなら、文字列である変数からのブール値が必要です。@jzwienerで前述したように、ディスティルを使用できます。しかし、彼が提案したように、モジュールをインポートして使用することはできませんでした。

代わりに、私はpython3.7でこの方法を使用することになります

Pythonでブール値に変換するdistutils文字列

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

distutilsはpython std libの一部なので、インストールする必要はありません。すごい!👍


1

私の簡単な解決策を共有したいと思いeval()ます。これは、文字列を変換しますTrueし、False文字列が正確にタイトル形式の場合は、適切なブール型にTrueまたはFalse最初の手紙の資本または他の機能は、エラーが発生します常に。

例えば

>>> eval('False')
False

>>> eval('True')
True

もちろん、動的変数の場合は.title()、ブール文字列をフォーマットするために簡単に使用できます。

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

これはエラーになります。

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

これは、同じ答えの多くを取得するための組み込みの方法です。Pythonは""falseと見なし、他のすべての文字列はtrueと見なしますが、TCLは物事について非常に異なる考えを持っていることに注意してください。

>>> 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インスタンスを作成する必要があります。

どのような真または偽と見なされることの動作に依存Tcl_GetBooleanみなし、0falsenooff虚偽であること、および1trueyesおよびon真、ケース小文字を区別しないように。空の文字列を含むその他の文字列は、例外の原因になります。


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

アイデア:文字列をFalseに評価するかどうかを確認してください。それ以外の場合、bool()は空でない文字列に対してTrueを返します。


0

以下は、文字列の真実性を評価するために一緒に投げたものです。

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)

使用するのとほぼ同じ結果evalですが、安全です。


0

私はこれをしなければならなかったので...多分パーティーに遅刻しました-しかし誰かがそれを役に立つと思うかもしれません

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

true/を返すエンティティを制御できる場合false、1つのオプションは1/の0代わりにtrue/を返すようにすることfalseです。

boolean_response = bool(int(response))

int常に文字列であるネットワークからの応答を処理する追加のキャスト。


-5

Pythonの組み込みeval()関数と.capitalize()メソッドを使用することで、「true」/「false」の文字列(初期大文字に関係なく)を真のPythonブール値に変換できます。

例えば:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

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

# OUTPUT: <type 'bool'>

4
文字列に含まれている場合はどうなります#\nshutil.rmtree('/someImportantDirectory')か?(試してはいけません!)
mastov

@mastov-ばかげた反対投票。当然、着信文字列を制御できない場合は、他のコードと同様に、予防策を講じる必要があります。しかし、ワークフローを制御する場合、これは機能する単純なソリューションです。すべての点で完璧ではない解決策と悪い答えを混同しないでください。
elPastor 2017年

1
危険に言及しないことは別として(これはすでに悪い答えになっています):入力を事前にサニタイズすることを提案していますか?これにより、この方法のシンプルさが失われます。これが主な利点でした。
mastov

4
evalこの単純なものに使用することは、脆弱性を要求することです。
mastov

1
すべてのコードとは限りません。ただし、特に文字列を他の型に変換するコード通常、制御できません。多くの場合、それを理解することすらありません。「それは私のデータベース(または構成ファイル)であり、私の制御下にある私のシステムの一部です。」次に、他のいくつかのモジュールにデータベースへのアクセス権を与えます。理由は次のとおりです。しかし、evalこれらの文字列を使用すると、誰かがシステム全体を引き継ぐのに役立つ場合があります。
mastov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.