今回は、Pythonで型を調べる方法についてご紹介します。
Pythonの型とは
Pythonは動的型付け言語であり、変数に代入されるオブジェクトの型によって振る舞いが異なります。
明示的に型を宣言しなくても動作しますが、型の違いを意識することでエラーを未然に防いだり、コードの可読性を上げたりできます。
また、場合によっては継承関係やサブクラスを含めて型を判定したいときがあるため、Pythonでは複数の方法が用意されています。
型を調べる方法
ここではtype()、__class__属性、isinstance()、issubclass()などを使った方法を見ていきます。
type() 関数
type()は、渡されたオブジェクトの厳密な型を返す組み込み関数です。
継承関係を無視して「そのオブジェクトがどのクラスから生成されたか」を判定したい場合に有効です。
1 2 3 4 |
a = 42 print(type(a)) # 整数型 s = "Hello, Python!" print(type(s)) # 文字列型 |
__class__ 属性
実はオブジェクト自身が持つ__class__属性からも同様の情報を取得可能です。
type(a) と a.__class__ の結果は基本的に同じですが、内部的にカスタマイズしているクラスでは挙動が異なる場合があります。
1 2 |
a = 3.14 print(a.__class__) |
isinstance() 関数
isinstance()は、あるオブジェクトが指定したクラスやそのサブクラスのインスタンスかを判定します。
継承関係も含めて確認したい場合に利用すると便利です。
1 2 3 4 5 6 7 8 9 |
class Animal: pass class Dog(Animal): pass dog = Dog() print(isinstance(dog, Dog)) # Dogクラスのインスタンスか print(isinstance(dog, Animal)) # Animalクラスのサブクラスか |
True
True
複数の型をまとめて判定するときは、タプルで指定できます。
1 2 3 |
num = 10 if isinstance(num, (int, float)): print("数値型です。") |
数値型です。
issubclass() 関数
issubclass()は、クラス同士の継承関係を調べるための関数です。
1 2 3 4 5 6 7 8 |
class Animal: pass class Cat(Animal): pass print(issubclass(Cat, Animal)) print(issubclass(int, float)) |
True
False
型ヒントと静的解析
Python 3以降では、関数の引数や戻り値などに型ヒントを付与し、mypyやPyrightなどの静的解析ツールと組み合わせてコードの安全性を高める手法があります。
実行時には影響しませんが、大規模開発や複数人での開発時に役立ちます。
1 2 3 4 5 |
def greet(name: str) -> str: return f"Hello, {name}!" result = greet("Alice") print(result) |
Hello, Alice!
get_type_hints()を使えば、関数に付与した型ヒントを動的に参照することも可能です。
よくあるエラー
型を調べる際、意図した型と異なるオブジェクトを扱うとTypeErrorが発生することがあります。
たとえば数値を予想していたのに文字列が渡されると、整数の演算に文字列を使おうとしてエラーになる場合が代表的です。
また、AttributeErrorは、想定していたメソッドや属性が定義されていない型のオブジェクトにアクセスするときに起こります。
これらを回避するために、適切にisinstance()を使うか、または型ヒントと静的解析ツールを併用して事前に検出するのが効果的です。
まとめ
Pythonで型を調べる方法は、type()やisinstance()、issubclass()など複数用意されています。
厳密な判定にはtype()、継承関係を含めたい場合にはisinstance()が有効です。
型ヒントの活用や静的解析の導入も併せて検討すると、コードの安全性や可読性が向上します。