
こんにちはPyQサポートです。 今回は複数のifの実行順を調整してエラーを解消する方法について紹介します。
- 質問:以下のコードを実行するとエラーになりました。 n には数値か None が入るはずなので、このように判定しているのですが、なぜでしょうか。
- 回答:Noneに大小の比較演算子は使えないからです。
- PyQで、Noneの扱い方を学びましょう
質問:以下のコードを実行するとエラーになりました。 n には数値か None が入るはずなので、このように判定しているのですが、なぜでしょうか。
>>> n = None
>>> if n == 0:
... print("n == 0")
... elif n > 0:
... print("n > 0")
... elif n < 0:
... print("n < 0")
... elif n is None:
... print("n is None")
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
TypeError: '>' not supported between instances of 'NoneType' and 'int'
回答:Noneに大小の比較演算子は使えないからです。
エラーメッセージを見ると elif n > 0: の箇所で TypeError が発生しています。「演算子 > は、 'NoneType' と int の比較をサポートしていません」というメッセージが表示されていますね。
この条件文は、 n と 0 (整数)または None との比較を行っています。
以下のように、 None と整数値の is や == による比較はエラーになりませんが、大小比較はエラーとなります。
>>> None == 0 False >>> None is None True >>> 0 is None False >>> None > 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '>' not supported between instances of 'NoneType' and 'int'
このため、 elif で None と整数の大小比較が行われないように、最初の if 文で n が None の場合について判定しておくことで、エラーを回避できます。
書き直したコード
>>> n = None
>>> if n is None:
... print("n is None")
... elif n == 0:
... print("n == 0")
... elif n > 0:
... print("n > 0")
... elif n < 0:
... print("n < 0")
n is None
他にもPython 3.10 で追加された match ... case を使う方法もあります。 match ... case については、以下のブログで紹介しています。
PyQで、Noneの扱い方を学びましょう
PyQでは、 Noneの扱い方 を学習できます。