概要
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
クラスではないと判断されていることがわかります。サブクラスまで考慮したいかどうかで使い分けると良いですね。