こんにちは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の扱い方 を学習できます。