【Python】typeでオブジェクトの型を取得、判定【入門第47回】

158, 2019-09-07

目次

typeの使い方

今回はPythonのtypeクラスを使って型を取得し、判定する方法を解説します。
オブジェクトの型を取得し、判定することが出来るようになれば、Pythonでより厳密なプログラミングが可能になります。

関連にisinstanceがあります。こっちはクラスのインスタンスを判定するのに役に立ちます。

typeについて、具体的には↓を見ていきます。

  • オブジェクトの型の取得方法

  • オブジェクトの型の判定方法

  • inを使った型判定

  • not inを使った型判定

  • 取得した型からインスタンスを生成

  • クラスを動的に定義する

オブジェクトの型の取得方法

typeはクラスです。
このtypeの第1引数にオブジェクトを渡すと、型を取得することができます。

print(type(1))

↑のコードの実行結果は↓のようになります。

<class 'int'>

1の型がint型であることがわかります。
もちろん文字列やリスト、タプルや辞書も型を取得できます。

print(type(1.23))
print(type('cat'))
print(type([1, 2, 3]))
print(type((1, 2, 3)))
print(type({ 'a': 1 }))

↑のコードの実行結果は↓のようになります。

<class 'float'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'dict'>

自作クラスのインスタンスの型も取得できます。

class Animal:
    pass

class Cat(Animal):
    pass

animal = Animal()
cat = Cat()

print(type(animal))
print(type(cat))

↑のコードの実行結果は↓のようになります。

<class '__main__.Animal'>
<class '__main__.Cat'>

↑のコードの例では、AnimalクラスとCatクラスが明確に区別されていますが、変数catAnimalクラスを継承したクラスのオブジェクトなのかどうかを判定したい時は、isinstanceを使います。
isinstanceについては↓で解説しています。

オブジェクトの型の判定方法

typeでオブジェクトの型を取得すると、↓のように型を判定することが出来るようになります。

print(type(1) is int)

is演算子はオブジェクトのアイデンティティーを比較する演算子ですが、↑の例では型のアイデンティティーを比較しています。
↑のコードの実行結果はTrueになります。

この判定を使って、たとえば↓のように型によって処理の振る舞いを変えることができます。

def func(x):
    if type(x) is int:
        print('int型です')
    elif type(x) is str:
        print('str型です')
    else:
        print('サポートしていない型です')

func(0)
func('cat')
func([1, 2, 3])

↑のコードの実行結果は↓のようになります。

int型です
str型です
サポートしていない型です

inを使った型判定

in演算子を使えば複数の型に対して判定を取れます。

def func(x):
    if type(x) in (int, str):
        print('サポートしている型です')
    else:
        print('サポートしていない型です')

func(0)
func('cat')
func([1, 2, 3])

↑のコードの実行結果は↓のようになります。

サポートしている型です
サポートしている型です
サポートしていない型です

not inを使った型判定

not in演算子も使えます。
たとえば関数の引数の型をチェックして、エラーを送出したい場合は↓のようにします。

def func(x):
    if type(x) not in (int, float):
        raise TypeError('サポートしていない型です')
    print(x)

func(1)
func(1.23)
func('cat')

↑のコードの実行結果は↓のようになります。

1
1.23
Traceback (most recent call last):
  File "sample.py", line 8, in <module>
    func('cat')
  File "sample.py", line 3, in func
    raise TypeError('サポートしていない型です')
TypeError: サポートしていない型です

関数の最初のほうで引数の型をチェックすれば、より厳密な関数を書くことができます。

取得した型からインスタンスを生成

typeで取得した型は型なので、↓のように型からインスタンスを作ることができます。

t = type(1)
print(t(2))

↑のコードの実行結果は2になります。
↑の変数tintなので、カッコをつけてインスタンスを作ることができます。

クラスを動的に定義する

typeを使うとクラスを動的に定義することができます。
ふつうは↓のようにクラスを作りますが、

class Cat:
    name = 'ミケ'

↑と同様のクラスは↓のようにして作ることができます。

Cat = type('Cat', (object, ), dict(name='ミケ'))
print(Cat)

mike = Cat()
print(type(mike))

↑の変数Catはクラスなので、カッコをつけてインスタンスを作ることができます。
↑のコードの実行結果は↓のようになります。

<class '__main__.Cat'>
<class '__main__.Cat'>

typeの第1引数にはクラス名を書きます。
第2引数には継承させたいクラスをタプルで渡します。
第3引数にはクラスの属性を辞書で渡します。

type(クラス名, ベースクラスのタプル, 属性を設定する辞書)

このようにtypeを使えば動的にクラスを作ることが出来るようになります。

おわりに

typeを使えばPythonのプログラムをより厳密に書くことが出来るようになります。
Pythonは動的型付けで、動的に型が決定されます。
そのため型についてはゆるい言語と言えます。
生真面目でガチガチでセキュアなプログラムを作りたい時は型判定を使いましょう。

以上、次回に続きます。

また見てね

関連動画

TODO: 動画

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク