Pythonのtypeとisinstanceで型を取得・確認する

263, 2021-06-04

目次

Pythonで型を取得・確認する

Pythonではデータの型を取得して確認(判定)することができます。
型の取得と確認にはtypeisinstance関数を使います。

結論から言うと型の取得は↓のようにします。

typ = type(1)
print(typ)
# <class 'int'>

typ = type('Good')
print(typ)
# <class 'str'>

型の判定は↓のように行います。

if type(1) is int:
    print('int型です')

if isinstance('Good', str):
    print('str型です')

この記事では型の取得・確認について具体的に↓を見ていきたいと思います。

  • 型とは?

  • type()による型の取得

  • type()による型の判定

  • type()による複数の型判定

  • 型オブジェクトによるデータの生成

  • isinstance()による型の判定

  • isinstance()によるサブクラスの判定

  • isinstance()による複数の型判定

参考記事は↓です。

型とは?

型とはなんでしょうか。
型とはデータの大きさのことです。
型によってデータの大きさや特性は変わります。

型はデータのそばに寄り添うように立っています。
データが存在する場合、型はかならずそばにいます。つまりデータにとって型とはかけがえのない存在です。

型チェック: a_out.png

プログラミング言語によってこの型の取り扱いは変わります。
たとえばC/C++などのコンパイラ型の言語の型は、明示的に書きます。
たとえばint abc = 1;とかstd::string def = "hello";などのように。

Pythonではこの型の宣言は必要ありません。
これはPythonが動的型付けに分類されるプログラミング言語だからです。
Pythonのデータの型は動的に決定されるので、ほとんどの場合開発者はデータの型を意識しなくても大丈夫です。
しかし、そのデータの裏には、型が顔をのぞかせているのです。

Pythonで型を意識したプログラミングを行いたい場合、今回の記事で紹介するtypeisinstanceを使うことになります。
これらのクラスや関数を使うことでPythonのデータの型を取得し、確認(判定)することが可能になります。

type()による型の取得

Pythonのデータの型を取得したい場合はtype()を使用します。
type()は↓のような構造になっています。

class type(object)

type()は引数が1つだけの場合は、その引数のオブジェクトの型を返します。
この型のことを型オブジェクトと言います。

型はint型であれば<class 'int'>のような形で表現されます。
str型であれば<class 'str'>です。

type()でデータの型を取得するには↓のようにします。

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

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

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

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

print(type((1, 2, 3)))
# <class 'tuple'>

print(type({'a': 1, 'b': 2}))
# <class 'dict'>

print(type({1, 2, 3}))
# <class 'set'>

print(type(None))
# <class 'NoneType'>

↑の場合、type()に直接値を渡していますが、もちろん変数も渡すことができます。

var = 1
print(type(var))
# <class 'int'>

type()の返す型オブジェクトは変数に入れておくことも出来ます。

typ = type(1)
print(typ)
# <class 'int'>

type()による型の判定

type()による型の判定を行うにはis演算子と組み合わせます。
型オブジェクトと型オブジェクトを比較して、それが真であれば同じ型、偽であれば違う型になります。

if type(1) is int:
    print('int型です')
    # int型です

if type('Good') is str:
    print('str型です')
    # str型です

is notと組み合わせればその型ではない時に真になります。

if type(1) is not str:
    print('str型ではありません')
    # str型ではありません

type()による複数の型判定

type()in演算子を組み合わせれば、複数の型と判定を取ることができます。

if type(1) in (int, str):
    print('intかstrかのどちらかです')
    # intかstrかのどちらかです

if type('Good') in (int, str):
    print('intかstrかのどちらかです')
    # intかstrかのどちらかです

if type([1, 2, 3]) not in (int, str):
    print('intとstrのどちらでもありません')
    # intとstrのどちらでもありません

型オブジェクトによるデータの生成

type()で取得した型オブジェクトは型なので、データから型を取得し、その型からデータを生成するということができます。

intclass = type(1)
print(intclass())
# 0

この特性を使うと、型を知らなくてもオブジェクトのコンストラクタを呼び出して新しいデータを生成するなどの芸当が可能になります。

isinstance()による型の判定

isinstance()を使うと型の判定を取ることができます。
type()との違いはisinstance()はサブクラスのオブジェクトにも判定を取れるということです。

isinstance()は↓のような構造になっています。

isinstance(object, classinfo)

isinstance()の第1引数(object)には判別したいオブジェクトを渡します。
そして第2引数(classinfo)には型オブジェクトやクラスなどの情報を渡します。

isinstance()objectclassinfoのインスタンスまたはサブクラスのインスタンスの場合にTrueを返します。

print(isinstance(1, int))  # True
print(isinstance(True, bool))  # True
print(isinstance('Good', str))  # True
print(isinstance([1, 2, 3], list))  # True
print(isinstance((1, 2, 3), tuple))  # True
print(isinstance({'a': 1, 'b': 2}, dict))  # True
print(isinstance({1, 2}, set))  # True

isinstance()によるサブクラスの判定

たとえばboolintのサブクラスなので、↓のコードはTrueになります。

print(isinstance(True, int))  # True

それから↓のようなベースクラスとサブクラスの関係において、isinstance()は↓のような振る舞いになります。

class Animal:
    pass

class Cat(Animal):
    pass

cat = Cat()
print(isinstance(cat, Animal))  # True
print(isinstance(cat, Cat))  # True

↑の場合、CatAnimalのサブクラスです。そのためCatのオブジェクトとAnimalisinstance()で判定すると結果はTrueになります。
また当然ながらCatとの判定もTrueです。

isinstance()による複数の型判定

isinstance()の第2引数にタプルを渡すと、そのタプル内の型と判定が取れます。

print(isinstance(1, (int, str)))  # True
print(isinstance(1, (list, str)))  # False

↑の場合、isinstance()の第1引数がタプル内のいずれかの型である場合にTrueになります。
いずれの型でもない場合はFalseになります。

おわりに

今回はPythonの型の取得と確認方法を見てみました。
Pythonの型を意識するとセキュアなプログラミングが可能になるなど嬉しい副作用があります。
うまいこと使うと吉かもしれません。

型にはめてあげる

きゅぅ