2
3

More than 1 year has passed since last update.

【Python】if x: と if x==True: が異なる場合について

Posted at

概要

普通、後者のように書くと linter に怒られるし、こいつコード書けないやつだと思われるリスクをはらんでいる。
しかし Python は演算オーバーロードの機能を持つので、厳密には両者は異なる。
実用上そんなことするか、と思われるかもしれないが、著者は実際に SymPy を使ったコードで観測した。ここでは単純化したコード例を記す。

コード例

class Foo:
    def __bool__(self):
        return False
    def __eq__(self, other):
        return True

x = Foo()

上のように定義すると、

if x:
    print(1)
else:
    print(0)

を評価すると

result
0

となる。一方、

if x==True:
    print(1)
else:
    print(0)

を評価すると

result
1

となる。

説明

  • if M: ... を評価する場合、まず M を評価して v を得る。つぎに bool(v) を評価して w を得る。この値によって if 文が分岐する。
    • v において特殊メソッド __bool__ が定義されている場合、bool(v)v.__bool__() として評価される。
  • 一方、if M==True: ... を評価する場合、M を評価して v を得る。次に v==True が評価されて w を得る。
    • v において特殊メソッド __eq__ が定義されている場合、v==Truev.__eq__(True) として評価される。

これらのルールにより、__bool____eq__ が異なる振る舞いをするときには if x:if x==True: は等価ではない。

2
3
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
2
3