note.nkmk.me

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

Date: 2018-03-21 / tags: Python

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

ここでは、

  • オブジェクトの型を取得、確認: 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'>
source: type.py

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

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

print(type(str))
# <class 'type'>
source: type.py

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

型の判定にはtype()isinstance()を使う。

type()を使った型の判定

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

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

print(type('string') is int)
# False
source: type.py
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
source: type.py

複数のいずれかの型かどうかを判定したい場合は、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
source: type.py

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

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
source: type.py

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()と使い分ける。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事