5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python bool() の中で何が起こっているか

Posted at

組み込み関数の1つ、bool()
引数として渡されたオブジェクトの真偽値を返却します。

中で何が起こっているか確認する

オブジェクトの真偽値はどうやって決まるのでしょうか?
公式リファレンスによると
https://docs.python.org/ja/3/library/stdtypes.html#truth

オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__() メソッドを定義していて、それが False を返す場合、または __len__() メソッドを定義していて、それが 0 を返す場合は偽と判定されます。

だそうです。試してみます。

# __bool__() __len__()を定義している場合
>>> class Class1:
...     def __bool__(self):
...         print('__bool__が呼ばれたよ')
...         return False
...     def __len__(self):
...         print('__len__が呼ばれたよ')
...         return 0
...
>>> hoge = Class1()
>>> bool(hoge)
__bool__が呼ばれたよ
False

# __bool__()が定義されていない場合
>>> class Class2:
...     def __len__(self):
...         print('__len__が呼ばれたよ')
...         return 0
...
>>> piyo = Class2()
>>> bool(piyo)
__len__が呼ばれたよ
False

# __bool__()__len__()が定義されていない場合
>>> class Class3():
...     pass
>>> fuga = Class3()
# デフォルトどおり真が返る
>>> bool(fuga)
True

応用してみる

組み込み型のクラスであれば__bool__()__len__()のどちらかは定義されています。
組み込み型を継承して自作クラスをつくる場合はこれらの特殊メソッドをオーバーライドできます。
例えば↓こんな感じ

# 通常のリストの場合、要素が1つ以上あれば真になる
>>> list = list([0])
>>> bool(list)
True
# 要素それぞれの真偽値判定をし、真になるものが1つ以上あれば真を返す
>>> class MyList(list):
...     def __bool__(self):
...         return any(self)
...
>>> my_list = MyList([0])
>>> bool(my_list)
False

bool()の中で何が起こっているか理解していると、こういったアレンジができちゃいます。
(特殊メソッドをオーバーライドすると影響範囲が大きくなるので、やるときは慎重に!)

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?