比較できない型同士を比較したエラーの原因
文字列と数値、あるいはNoneと数値など、比較できない型同士を比較しようとしたときに出るエラーです。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
'>' not supported between instances of 'str' and 'int'- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 age = "20" ^ 2 if age > 18: 3 print("adult")
Traceback (most recent call last):
File "main.py", line 2, in <module>
if age > 18:
^^^^^^^^
TypeError: '>' not supported between instances of 'str' and 'int'
文字列と数値は大小を比較できません。入力値を数値として扱うにはint()やfloat()で変換します。
直し方: "20" を 20 にします。
広告
広告スロット(未設定)
パターン2
1 score = "90" ^ 2 if score >= 60: 3 print("pass")
Traceback (most recent call last):
File "main.py", line 2, in <module>
if score >= 60:
^^^^^^^^^^^
TypeError: '>=' not supported between instances of 'str' and 'int'
input()で受け取った値は常にstr型です。数値として比較する前にint()で変換する必要があります。
直し方: "90" を 90 にします。
パターン3
1 x = None ^ 2 if x > 0: 3 print("positive")
Traceback (most recent call last):
File "main.py", line 2, in <module>
if x > 0:
^^^^^
TypeError: '>' not supported between instances of 'NoneType' and 'int'
初期値としてNoneを使った変数を、数値と直接比較するとエラーになります。値が入っているかを先にNoneチェックします。
直し方: None を 5 にします。
パターン4
1 data = [1, 2, 3] ^ 2 if data > 5: 3 print("big")
Traceback (most recent call last):
File "main.py", line 2, in <module>
if data > 5:
^^^^^^^^
TypeError: '>' not supported between instances of 'list' and 'int'
リストと数値も大小比較できません。件数を比較したい場合はlen()で数値に変換してから比較します。
直し方: [1, 2, 3] を 8 にします。
パターン5
1 point = (1, 2) ^ 2 if point > 0: 3 print("positive")
Traceback (most recent call last):
File "main.py", line 2, in <module>
if point > 0:
^^^^^^^^^
TypeError: '>' not supported between instances of 'tuple' and 'int'
タプルと数値の比較も同様にエラーになります。座標そのものではなく、比較したい成分を取り出して使います。
直し方: (1, 2) を 5 にします。
よくある誤解
Python 2では異なる型同士の比較でもエラーにならず、何らかの順序で比較できてしまいました。Python 3では明確にエラーになるよう変更されています。
実務での勘所
TypeErrorになるのは<や>のような大小比較だけで、==による等価判定は型が違っても例外にはならず、単にFalseを返します("5" == 5はFalseですが、エラーにはなりません)。多くの人が「型が違う比較はすべて危険」と一括りにしてしまいますが、正確には「順序を問う比較」だけが例外の対象です。この区別を知っておくと、==を使ったチェックとソート処理を混同して書いたコードのどちらが本当に危ないかを判断しやすくなります。