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 default | name or "ゲスト" |
| 全体確認 | all(iterable) | all([True, True]) → True |
| 部分確認 | any(iterable) | any([False, True]) → True |
bool関数は、Pythonの型システムの基盤となる重要な関数です。Falsy/Truthyの概念を理解することで、より簡潔で読みやすいコードを書くことができます。