0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

if args.hoge:と書いてはいけない理由

Last updated at Posted at 2024-10-07

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にゼロが来た時だけ動かない挙動を実装したい場合は(ゼロか非ゼロかで条件分岐させたい場合等)、この書き方のままでよい。

原因は、if0を認識していないのではなく、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=0numが値を持つと認識させるには、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:と書くこと!

0
0
3

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?