Documentation Python

Pythonのbool関数は、任意のオブジェクトを真偽値(TrueまたはFalse)に変換するための組み込み関数です。条件分岐やデータの有無確認で頻繁に使用されます。

真偽値の判定ルール

値の種類Falseになる値Trueになる値
数値0, 0.0, 0jそれ以外の数値
文字列"" (空文字)空でない文字列
リスト[]要素があるリスト
タプル()要素があるタプル
辞書{}キーがある辞書
セットset()要素があるセット
その他None, Falseそれ以外

bool関数の基本

基本的な構文

bool(x)
  • x: 任意のオブジェクト
  • 戻り値: True または False

基本的な使用例

# 数値の真偽値
print(bool(0))      # False
print(bool(1))      # True
print(bool(-1))     # True
print(bool(0.0))    # False
print(bool(3.14))   # True
print(bool(0j))     # False(複素数のゼロ)

# 文字列の真偽値
print(bool(""))     # False(空文字列)
print(bool("Hello"))  # True
print(bool(" "))    # True(スペースも文字)

# コレクションの真偽値
print(bool([]))     # False(空リスト)
print(bool([1, 2])) # True
print(bool({}))     # False(空辞書)
print(bool({1, 2})) # True

Falseと評価される値(Falsy)

PythonでFalseと評価される値は限定されています。

# すべてFalseと評価される値
falsy_values = [
    False,       # ブール値のFalse
    None,        # None型
    0,           # 整数のゼロ
    0.0,         # 浮動小数点のゼロ
    0j,          # 複素数のゼロ
    "",          # 空文字列
    [],          # 空リスト
    (),          # 空タプル
    {},          # 空辞書
    set(),       # 空セット
    frozenset(), # 空フローズンセット
    range(0),    # 空レンジ
]

for value in falsy_values:
    print(f"bool({value!r:15}) = {bool(value)}")

# 出力:
# bool(False          ) = False
# bool(None           ) = False
# bool(0              ) = False
# bool(0.0            ) = False
# bool(0j             ) = False
# bool(''             ) = False
# bool([]             ) = False
# bool(()             ) = False
# bool({}             ) = False
# bool(set()          ) = False
# bool(frozenset()    ) = False
# bool(range(0, 0)    ) = False

Trueと評価される値(Truthy)

Falsy以外のすべての値はTrueと評価されます。

# すべてTrueと評価される値の例
truthy_values = [
    True,           # ブール値のTrue
    1,              # 非ゼロの整数
    -1,             # 負の数も
    0.001,          # 非ゼロの小数
    "False",        # 文字列の"False"はTrue!
    " ",            # スペースも文字
    [0],            # 要素があれば空でない
    (None,),        # Noneを含むタプルも
    {"": ""},       # 空文字キーでも空でない
    object(),       # 任意のオブジェクト
]

for value in truthy_values:
    print(f"bool({str(value):15}) = {bool(value)}")

よくある間違い

# 文字列の"False"はTrueと評価される
print(bool("False"))  # True(空でない文字列)
print(bool("0"))      # True(空でない文字列)
print(bool("None"))   # True(空でない文字列)

# 数値に変換してから判定する
text = "0"
print(bool(int(text)))  # False

# 文字列をブール値として解釈したい場合
def str_to_bool(s: str) -> bool:
    """文字列をブール値に変換"""
    return s.lower() in ('true', '1', 'yes', 'on')

print(str_to_bool("True"))   # True
print(str_to_bool("False"))  # False
print(str_to_bool("1"))      # True

条件式での暗黙的な真偽値評価

Pythonでは、条件式で明示的にbool()を呼び出す必要はありません。

# bool()を使わない書き方(推奨)
data = []
if data:
    print("データがあります")
else:
    print("データは空です")

# bool()を明示的に使う書き方(冗長)
if bool(data):
    print("データがあります")

# 同様にwhile文でも
items = [1, 2, 3]
while items:
    print(items.pop())
# 出力: 3, 2, 1

論理演算子との組み合わせ

# andとorは最後に評価した値を返す
print("" or "default")       # "default"(""はFalsyなので右辺を評価)
print("value" or "default")  # "value"(Truthyなので左辺を返す)
print("value" and "other")   # "other"(両方Truthyなので右辺を返す)
print("" and "other")        # ""(左辺がFalsyなのでそこで終了)

# 短絡評価を利用したデフォルト値設定
name = None
display_name = name or "ゲスト"
print(display_name)  # "ゲスト"

# 注意: 0や空文字もFalsyなので意図しない動作になることがある
count = 0
result = count or 10
print(result)  # 10(0はFalsyなのでデフォルト値が使われる)

# None判定には明示的な比較が安全
count = 0
result = count if count is not None else 10
print(result)  # 0

カスタムクラスでの真偽値制御

__bool__メソッド

class Container:
    """カスタムコンテナクラス"""

    def __init__(self, items=None):
        self.items = items or []

    def __bool__(self):
        """空でなければTrue"""
        return len(self.items) > 0

    def __len__(self):
        return len(self.items)

# 使用例
empty_container = Container()
print(bool(empty_container))  # False

filled_container = Container([1, 2, 3])
print(bool(filled_container))  # True

# 条件式で使用
if filled_container:
    print("コンテナにデータがあります")

__len__メソッドのフォールバック

class Stack:
    """__bool__を定義せず__len__のみ定義"""

    def __init__(self):
        self._items = []

    def push(self, item):
        self._items.append(item)

    def pop(self):
        return self._items.pop()

    def __len__(self):
        return len(self._items)

# __bool__がない場合、__len__が0かどうかで判定
stack = Stack()
print(bool(stack))  # False(__len__が0を返す)

stack.push(1)
print(bool(stack))  # True(__len__が1を返す)

常にTrue/Falseを返すクラス

class AlwaysTrue:
    """常にTrueを返すクラス"""
    def __bool__(self):
        return True

class AlwaysFalse:
    """常にFalseを返すクラス"""
    def __bool__(self):
        return False

print(bool(AlwaysTrue()))   # True
print(bool(AlwaysFalse()))  # False

# 注意: __bool__がbool以外を返すとTypeError
class BadBool:
    def __bool__(self):
        return 1  # intを返すとエラー

# print(bool(BadBool()))  # TypeError: __bool__ should return bool

実践的な使用例

データの存在確認

def process_data(data: list) -> str:
    """データを処理する"""
    if not data:
        return "データがありません"

    # データがある場合の処理
    return f"{len(data)}件のデータを処理しました"

print(process_data([]))        # データがありません
print(process_data([1, 2, 3])) # 3件のデータを処理しました

設定値の検証

from typing import Any, Dict

def validate_config(config: Dict[str, Any]) -> list:
    """設定値を検証してエラーリストを返す"""
    errors = []

    # 必須項目のチェック
    required_fields = ['host', 'port', 'username']
    for field in required_fields:
        if not config.get(field):
            errors.append(f"{field}は必須です")

    # ポート番号の範囲チェック
    port = config.get('port')
    if port and not (1 <= port <= 65535):
        errors.append("portは1-65535の範囲で指定してください")

    return errors

# 使用例
config1 = {'host': 'localhost', 'port': 8080, 'username': 'admin'}
config2 = {'host': '', 'port': 0, 'username': None}

errors = validate_config(config1)
if not errors:
    print("設定は有効です")

errors = validate_config(config2)
if errors:
    print("エラー:", errors)
# 出力: エラー: ['hostは必須です', 'portは必須です', 'usernameは必須です']

フィルタリング

# Falsyな値を除去
mixed_list = [0, 1, "", "hello", None, [], [1, 2], False, True]

# filter関数でFalsyを除去
truthy_only = list(filter(bool, mixed_list))
print(truthy_only)  # [1, 'hello', [1, 2], True]

# リスト内包表記でも同様
truthy_only = [x for x in mixed_list if x]
print(truthy_only)  # [1, 'hello', [1, 2], True]

# Noneのみを除去(0や空文字は保持)
without_none = [x for x in mixed_list if x is not None]
print(without_none)  # [0, 1, '', 'hello', [], [1, 2], False, True]

三項演算子との組み合わせ

# 条件に応じた値の選択
is_admin = True
role = "管理者" if is_admin else "一般ユーザー"
print(role)  # 管理者

# 空チェックを含む値の選択
user_input = ""
display_value = user_input if user_input else "未入力"
print(display_value)  # 未入力

# 複数の条件
score = 85
grade = "A" if score >= 90 else "B" if score >= 80 else "C"
print(grade)  # B

all()とany()との連携

# all(): すべてがTruthyならTrue
conditions = [True, True, True]
print(all(conditions))  # True

conditions = [True, False, True]
print(all(conditions))  # False

# any(): 1つでもTruthyならTrue
print(any(conditions))  # True

conditions = [False, False, False]
print(any(conditions))  # False

# 実践例: データ検証
data = {
    'name': 'Alice',
    'email': 'alice@example.com',
    'age': 25
}

required_fields = ['name', 'email', 'age']

# すべての必須フィールドが存在し、空でないことを確認
is_valid = all(data.get(field) for field in required_fields)
print(f"データは有効: {is_valid}")  # True

注意点とベストプラクティス

明示的なbool()は通常不要

# 冗長な書き方
if bool(some_list) == True:
    pass

# 推奨される書き方
if some_list:
    pass

# 明示的なFalse比較も避ける
if bool(some_list) == False:
    pass

# 推奨される書き方
if not some_list:
    pass

型の比較には使わない

# bool()ではなく型を確認
value = 0

# 間違い: 0もFalseもFalsyだが型が違う
if not value:  # 0でもFalseでもNoneでも成立
    print("値なし")

# 正しい: 明示的な型チェック
if value is None:
    print("Noneです")
elif value == 0:
    print("ゼロです")

まとめ

操作方法
真偽値変換bool(x)bool([])False
空チェックif x:if data:
存在チェックif x is not None:if value is not None:
デフォルト値x or defaultname or "ゲスト"
全体確認all(iterable)all([True, True])True
部分確認any(iterable)any([False, True])True

bool関数は、Pythonの型システムの基盤となる重要な関数です。Falsy/Truthyの概念を理解することで、より簡潔で読みやすいコードを書くことができます。

参考文献

円