argparseを使って引数で受けた数値ゼロ(0
)の条件処理でハマった問題。
まず数値を持つか否かで分岐してから数値判定したいとき、最初の分岐で横着して単にif args.hoge:
と書くときに遭遇した。
まず、問題が起きない非ゼロの例
num = args.hoge #type=int
# num: int = 1
if num:
if num > 0:
print("positive")
else:
print("zero or less")
else:
print("ERROR")
# positive
上記のように、if num:
はnum
が正でも負でも動くが、実はnum
がゼロのときだけ期待通りに動いてくれない。
# num: int = 0
if num:
if num > 0:
print("positive")
else:
print("zero or less")
else:
print("ERROR")
# ERROR
※逆に、numにゼロが来た時だけ動かない挙動を実装したい場合は(ゼロか非ゼロかで条件分岐させたい場合等)、この書き方のままでよい。
原因は、if
が0
を認識していないのではなく、if 0:
がFalse
扱いになる仕様のせい。
if 0:
print("yes")
else:
print("no")
# no
if -5:
print("yes")
else:
print("no")
# yes
if 5:
print("yes")
else:
print("no")
# yes
if num:
にnum=0
もnum
が値を持つと認識させるには、is not None
を加えればよい。
# num: int = 0
if num is not None:
if num > 0:
print("positive")
else:
print("zero or less")
else:
print("ERROR")
# zero or less
この修正なら、それ以降の条件文を一切イジらなくて済む。
教訓(戒め)
if args.hoge:
と横着せず、面倒でも
if args.hoge is not None:
と書くこと!