Pythonでオブジェクトの型を判定する方法を解説

Python

本記事では、Pythonでオブジェクトの型を判定する方法を解説します。判定する方法はisinstance()とtype()の2つあり、これらについて説明します。

isinstance(object, classinfo)

isinstance(object, classinfo)は第一引数にオブジェクト、第二引数にクラスを受け取り、渡したオブジェクトがクラスのインスタンスかどうかの判定(bool)を返します。継承関係を考慮し、サブクラスのインスタンスもTrueを返します。

s = "Hello"

print(isinstance(s, str))  # True
print(isinstance(s, int))  # False

class Animal:
    pass

class Dog(Animal):
    pass

a = Animal()
d = Dog()

print(isinstance(d, Dog))     # True  (d は Dog のインスタンス)
print(isinstance(d, Animal))  # True  (Dog は Animal を継承している)
print(isinstance(a, Dog))     # False (a は Dog のインスタンスではない)
print(isinstance(a, Animal))  # True  (a は Animal のインスタンス)

また、タプルを渡すことで複数の型のいずれかに一致するかどうかを確認できます。

print(isinstance(3, (int, float)))  # True
print(isinstance(3.5, (int, float))) # True

type(object)

type(object)は引数に渡されたオブジェクトのクラスを返します。継承関係を考慮せず、正確にその型と一致する場合のみTrueになります。

num = 42

print(isinstance(num, int))  # True
print(isinstance(num, str))  # False

print(type(d) == Dog)    # True  (d は Dog のインスタンス)
print(type(d) == Animal) # False (d は Animal を継承しているが、直接の型は Dog)
print(type(a) == Animal) # True  (a は Animal のインスタンス)

isinstance() と type() の違い

機能isinstance()type()
継承を考慮✅ (サブクラスを認識)❌ (厳密に一致)
複数の型を判定✅ (タプル指定可)❌ (不可)
返り値True / Falseクラスオブジェクト

例えば、継承を考慮した判定が必要な場合は isinstance() を使うべきです。

class Parent:
    pass

class Child(Parent):
    pass

obj = Child()

print(isinstance(obj, Parent)) # True
print(type(obj) == Parent)     # False

どちらを使うべきか?

isinstance() を使うべき場面

  • 継承関係を考慮したいとき
  • 「このオブジェクトは int または float ですか?」のような型のチェック
  • None のチェック (isinstance(obj, type(None)))

type() を使うべき場面

  • 正確な型を判定したいとき(継承を無視)
  • isinstance() よりシンプルなコードで済む場合

推奨

  • 通常は isinstance() を使うのが望ましい

The isinstance() built-in function is recommended for testing the type of an object.

https://docs.python.org/2/library/functions.html#type
  • type() を使うのは「型が厳密に一致するかどうかをチェックしたい場合」のみ

例外的に type() を使うべきケース

たとえば、変数が dict 型であることを保証したい場合、isinstance() を使うと dict を継承したカスタムクラスも許可してしまいます。

class MyDict(dict):
    pass

d = MyDict()
print(isinstance(d, dict))  # True
print(type(d) == dict)      # False

この場合、厳密に dict 型のみ許可したいなら type(d) == dict を使うべきです。

まとめ

  • 継承を考慮するなら isinstance()
  • 厳密な型チェックなら type()
  • 通常は isinstance() を使うのが安全
タイトルとURLをコピーしました