HOWTO · Python
Python で変数の型をチェックする
Python の値の型を、`type()` 関数と `isinstance()` 関数を使って確認する方法を解説します。
このページの内容
type(value) を使うと値の型を確認でき、isinstance(value, SomeType) を使うと、その値が指定した型(そのサブクラスを含む)に属するかを調べられます。Python の変数はオブジェクトに結び付けられた名前なので、あらかじめ宣言された変数の型ではなく、値を確認します。
Python の変数と型
Python では名前がオブジェクトを参照し、そのオブジェクトが型を持ちます。値を代入すると、名前はそのオブジェクトに結び付きます。名前の型を事前に宣言する必要はありません。たとえば、42、3.5、"hello"、True、[1, 2] は、それぞれ int、float、str、bool、list 型の値です。同じ名前が、後から別の型のオブジェクトを参照することもあります。
Python で変数の型を確認する
手早く確認するには値を type() に渡し、コード内で真偽値による型判定が必要な場合は isinstance() を使います。次の例では整数と文字列を使い、両方の方法を示します。単独で実行できる例なので、Python で実行すると表示結果を確認できます。
count = 50
label = "Ada"
print(type(count))
print(type(label))
print(isinstance(count, int))
print(isinstance(label, int))
<class 'int'>
<class 'str'>
True
False
type() 関数で Python の変数の型を確認する
組み込み関数 type() は、渡された値の型オブジェクトを返します。一般的な組み込み型を表示すると、<class 'int'>、<class 'float'>、<class 'str'> のような形式になります。デバッグ中に値を調べたり、その値の正確な型に応じて処理を選んだりするときに便利です。
たとえば、type(50) は int、type(10.5) は float、type("Ada") は str です。type() はオブジェクトの型を報告するだけで、別の型に変換するものではありません。
isinstance() 関数で Python の変数の型を確認する
isinstance(value, classinfo) を使うと、value が指定したクラス(またはクラス群)のインスタンスかどうかを True または False で取得できます。type(value) の結果をクラスと直接比較する方法とは異なり、isinstance() はサブクラスも認識します。そのため、あるクラスとその派生クラスを受け入れる判定に適しています。
class Animal:
pass
class Dog(Animal):
pass
pet = Dog()
print(isinstance(pet, Dog))
print(isinstance(pet, Animal))
print(type(pet) is Dog)
True
True
True
この例では、Dog が Animal を継承しているため、2つの isinstance() による判定はいずれも True になります。また、pet は Dog として作成されているため、型の完全一致を調べる比較も True です。type(value) is SomeType は、型が完全に一致する必要がある場合にだけ使います。型の確認やインスタンス判定によって、値の型が変わることはありません。
この違いは、基底クラスや、そこから派生したオブジェクトを扱う関数を設計するときに重要です。たとえば、Animal を受け取るコードは、同じインターフェースを通じて Dog も処理できることが多く、isinstance(pet, Animal) はその意図を表します。type(pet) is Animal のような完全一致の判定では、Dog が Animal を継承していても拒否されます。サブクラスを別扱いにする必要がある場合や、サブクラスを明示的に許可しない場合に限って完全一致の判定を使い、通常のポリモーフィックなコードでは、サブクラスも認識する判定を使うほうが柔軟です。