【Python】Python の bool を扱う際の注意事項

◾️はじめに

Python の bool については

https://dk521123.hatenablog.com/entry/2021/10/02/000000

でやったが、別の問題でハマったので、
この際だから、今回は、Pythonの bool を扱う際の注意事項について
まとめてみようと思う。

目次

【0】前提知識:Pythonの bool の正体
【1】型判定でisinstance() を使った際の注意
 1)isinstanceを使った場合(NG動作)
 2)typeを使った場合(OK動作)
【2】文字列 => bool に変換する際の注意点

【0】前提知識:Pythonの bool の正体

https://note.nkmk.me/python-bool-true-false-usage/#booltruefalse1-0

より抜粋
〜〜〜〜
True, Falseはそれぞれ1, 0と等価。
〜〜〜〜

https://docs.python.org/ja/3/c-api/bool.html

Python の Bool 型は整数のサブクラスとして実装されています。

【1】型判定でisinstance() を使った際の注意

https://dev.classmethod.jp/articles/python-isinstance-or-type/

にも記載されているが、「isinstance(is_bool, int)」だと正しく判定されない

理由

* 冒頭で書いた通り「Python の Bool 型は整数のサブクラス」だから。

1)isinstanceを使った場合(NG動作)

is_bool = True

if isinstance(is_bool, int):
  print("int") # ★こっちにくる
else:
  print("Not int")

print("************")

is_number = 1

if isinstance(is_number, bool): # ★これだとOK
  print("bool")
else:
  print("Not bool") # ★こっちにくる

2)typeを使った場合(OK動作)

is_bool = True

if type(is_bool) == bool:
  print("bool") # ★こっちにくる
else:
  print("Not bool")

print("************")

is_number = 1
if type(is_number) == bool:
  print("bool")
else:
  print("Not bool") # ★こっちにくる

【3】文字列 => bool に変換する際の注意点

* bool("<String>")でも boolへの変換は可能だが
 以下の「意図した動作にならなかった例」のように
 bool('False') は Trueになってしまう。

 => bool() の仕様として、以下のようになるため。
 + True : 空でない文字列str型すべて
 + False : 空文字列

意図した動作にならなかった例

xxx = "False"
is_xxx = bool(xxx)

# is_xxx = True (!!!???)
print(f"is_xxx = {is_xxx}")

関連記事

Python ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/08/07/231242
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / bool ~
https://dk521123.hatenablog.com/entry/2021/10/02/000000
Python ~ 基本編 / CSV
https://dk521123.hatenablog.com/entry/2019/11/07/214108
Python ~ 基本編 / 辞書・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/10/11/000000