概要
if isinstanceの使い方、また、type関数との違いをまとめました。
サンプルコード解説
def process_data(data):
if isinstance(data, list):
total = sum(data)
return total
else:
return "Invalid input data"
data1 = [10, 20, 30, 40, 50]
data2 = "This is not a list"
result1 = process_data(data1)
result2 = process_data(data2)
print(result1)
# 150
print(result2)
# Invalid input data
基本構文
isinstance()関数の基本構文は以下の通りです:
isinstance(object, classinfo)
-
object: 型を調べたいオブジェクトを指定 -
classinfo: クラスやデータ型を指定
objectがclassinfoに指定されたクラスやデータ型に属していればTrueを返し、属していなければFalseを返します。上記サンプルコードの例ではlistを指定しているので、listであれば合計値(total = sum(data))が返され、そうでなければ"Invalid input data"が返されます。
ちなみに以下のようにして、複数の型を指定することもできます。
以下はタプルかリストで指定しており、どちらかであればTrueが返されます。
if isinstance(data, (list, tuple)):
type関数との違いは?
isinstance()は継承関係を考慮して型をチェックするのに対し、type()はオブジェクトの型そのものを返す関数なので、サブクラスまで考慮したい場合はisinstance()を使うのが良いです。
例えば、以下のコードの場合。
class Fruit:
pass
class Apple(Fruit):
pass
obj_fruit = Fruit()
obj_apple = Apple()
print(isinstance(obj_fruit, Apple)) # False
print(type(obj_fruit) == Apple) # False
print(isinstance(obj_apple, Fruit)) # True
print(type(obj_apple) == Fruit) # False
obj_fruitの方はどちらもFalseを返します。これは、obj_fruitの型が厳密にはFruitクラスであり、Appleクラスではないためです。
obj_appleの方では、isinstance(obj_apple, Fruit)でTrueを返しますが、type(obj_apple) == FruitではFalseを返します。obj_appleの型が厳密にはApple クラスであり、Fruitクラスではないと判断されていることがわかります。サブクラスまで考慮したいかどうかで使い分けると良いですね。