文字列からブール値への変換方法
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
で文字列をブール値に変換する際に不具合を防ぎましょう。