文字列からブール値への変換方法

Pythonで文字列をブール値に変換する際に、単にbool()を使うとすべての非空文字列はTrueと評価されます。そのため、文字列が”True”や”False”であることに基づいて正しく変換するためには、より明示的な方法が必要です。

distutils.util.strtobool()を使った変換

Python 3.10までのバージョンでは、distutils.util.strtobool()が標準ライブラリに含まれており、これを使って安全に文字列をブール値に変換できます。例えば、次のように使用します。

from distutils.util import strtobool
val = strtobool("True")  # 結果: 1 (True)

この関数は、“y”, “yes”, “true”, “1”などをTrue、“n”, “no”, “false”, “0”をFalseと評価し、その他の値に対してはエラーを投げます。ただし、Python 3.12以降ではこのモジュールは廃止されるため、将来的には別の方法を検討する必要があります。

ast.literal_eval()を使った安全な変換

ast.literal_eval()は、eval()の安全な代替として使用でき、ブール値の変換にも使えます。

import ast
val = ast.literal_eval("True")  # 結果: True

この方法は、文字列が”True”または”False”である場合にのみ適用され、他の文字列に対してはエラーを発生させるため、信頼できるデータを扱うときに適しています。

json.loads()を使った変換

json.loads()もブール値の文字列変換に使用できます。

import json
val = json.loads("true")  # 結果: True

json.loads()は、JSONフォーマットに従っている限り、文字列を適切に変換できます。ただし、“True”や”False”のようなPython独自の表現はエラーを引き起こします。

カスタム関数を使う方法

次に、str.lower()を使って”true”や”false”などの値を判定するカスタム関数の例です。

def str2bool(value):
    return value.lower() in ('true', '1', 'yes')
val = str2bool("Yes")  # 結果: True

この方法は柔軟性が高く、用途に応じてカスタマイズ可能です。

eval()の使用は避けるべき

一部の開発者はeval()を使用して文字列をブール値に変換することを提案しますが、eval()は潜在的にセキュリティリスクがあるため、特にユーザー入力に対しては使用すべきではありません。eval()を使うと任意のコードが実行される可能性があります。

安全で確実な方法を選んで、Pythonで文字列をブール値に変換する際に不具合を防ぎましょう。