Code Fix

初級

比較できない型同士を比較したエラーの原因

文字列と数値、あるいは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ですが、エラーにはなりません)。多くの人が「型が違う比較はすべて危険」と一括りにしてしまいますが、正確には「順序を問う比較」だけが例外の対象です。この区別を知っておくと、==を使ったチェックとソート処理を混同して書いたコードのどちらが本当に危ないかを判断しやすくなります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)