Pythonのisinstance関数で型をチェックする

実装していると、変数がint型かfloat型かで処理を分けたいときがありますよね?
そんなときはisinstance関数を使いましょう。

このように使います。

import math

a = math.pi
if isinstance(a, str):
    print(f'a is str. a={a}')
elif isinstance(a, int):
    print(f'a is int. a={a}')
elif isinstance(a, float):
    print(f'a is float. a={a}')
else:
    raise NotImplementedError

# a is float. a=3.141592653589793
# aがfloat型の場合のif文で処理された。

isinstanceは組み込み関数です。

isinstance関数の基本的な使い方

isinstance(object, classinfo)
object引数がclassinfo引数に指定した型、またはそのサブクラスのインスタンスである場合にTrueを返します。
となっています。

サンプルコードで動作を見てみましょう。
str、int、float型のチェックです。

print(isinstance('aaa', str))
# True
# 文字列とstr型を比べる。

print(isinstance('a', str))
# True
# 1文字とstr型を比べる。

print(isinstance(1, int))
# True
# 整数とint型を比べる。

print(isinstance(1.0, float))
# True
# 浮動小数点数とfloat型を比べる。

print(isinstance(1.0, int))
# False
# 比較した型が異なるときはFalseが返る。

list、dict、tuple型のチェックもできます。

print(isinstance([1, 2], list))
# True

print(isinstance({'a': 1}, dict))
# True

print(isinstance((1, 2), tuple))
# True

isinstance関数でbool型をチェックするときは注意

まずは、組み込み型のbool型の説明を見てください。

bool は int のサブクラスです。多くの数値的なコンテキストにおいて、 False と True はそれぞれ整数 0 と 1 であるかのように振る舞います。しかし、そのような振る舞いを信頼することは推奨されません。int() を使って明示的に整数値に変換してください。

出典:ブーリアン型

bool型はint型のサブクラスとなっています。
そして、isinstance関数は、引数で指定した型かまたはそのサブクラスのインスタンスであるかをチェックしています。
つまり、bool型をisinstance関数でチェックすると、bool型でもint型でもTrueが返ってきます。

print(type(True))
print(type(False))
# <class 'bool'>
# <class 'bool'>
# TrueとFalseをtype関数で見るとbool型。

print(type(0))
print(type(1))
# <class 'int'>
# <class 'int'>
# 0と1をtype関数で見るとint型。

print(isinstance(False, bool))
# True
print(isinstance(False, int))
# True
# Falseをisinstance関数で見ると、bool型でもint型でもTrueになる。

print(isinstance(0, bool))
# False
print(isinstance(0, int))
# True
# 0をisinstance関数で見るとint型。

bool型かどうか調べたいときは、type関数を使ってチェックしましょう。

a = False
print(type(a) == bool)
# True

print(type(a) == int)
# False

# boolの変数の型をチェックするときは、type関数を使うようにする。