Pythonで型を取得・判定するtype関数, isinstance関数

Pythonで、変数などのオブジェクトの型を取得して確認したり、特定の型であるかを判定したりするには、組み込み関数type()やisinstance()を使います。

  1. 組み込み関数 type(object) — Python 3.6.4 ドキュメント
  2. 組み込み関数 isinstance(object, classinfo) — Python 3.6.4 ドキュメント

ここでは、

オブジェクトの型を取得、確認: type() オブジェクトの型の判定: type(), isinstance() type()を使った型の判定 isinstance()を使った型の判定 type()とisinstance()の違いについて、サンプルコードとともに説明します。

オブジェクトの型を取得、確認: type()関数

type(object)は、引数に渡したオブジェクトの型を返す関数。これを使ってオブジェクトの型を調べることができます。

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

type()の返り値はstrやintなどのtype型(型オブジェクト)。

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

オブジェクトの型の判定: type()関数, isinstance()関数

型の判定にはtype()かisinstance()を使います。

type()を使った型の判定

type()の返り値と任意の型を比較することで、そのオブジェクトが任意の型であるかを判定できます。

print(type('string') is str)
# True

print(type('string') is int)
# False 

def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

複数のいずれかの型かどうかを判定したい場合は、inと複数の型のタプルを使います。

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

引数の型によって処理を変える関数を定義することもできます。

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

isinstance()を使った型の判定

isinstance(object, class)は、第一引数のオブジェクトが、第二引数の型のインスタンス、またはサブクラスのインスタンスであればTrueを返す関数。 第二引数には型のタプルを指定することもできます。いずれかの型のインスタンスであればTrueを返します。

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

type()を使った型の判定の例と同様の関数は以下のように書けます。

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False 

def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False 

def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

type()とisinstance()の違い

type()とisinstance()の違いは、isinstance()は第二引数に指定したクラスを継承するサブクラスのインスタンスに対してもTrueを返すという点。 例えば、以下のようなスーパークラス(基底クラス)とサブクラス(派生クラス)を定義します。

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

type()を使った型の判定では型が一致しているときのみTrueとなるが、isinstance()ではスーパークラスに対してもTrueを返します。

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

標準の型でも、例えばTrue, Falseの真偽値型boolは注意が必要。boolは整数型intのサブクラスなので、isinstance()では継承元のintに対してもTrueを返します。

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

正確な型を判定したい場合はtype()、継承も考慮した上で判定したい場合はisinstance()と使い分けます。

Last Updated: 6/26/2019, 10:34:03 PM