Pythonは非常に柔軟な言語ですが、その自由さが牙を剥くことがあります。
「関数に渡された値が、期待した型じゃなくてエラーになった……」
そんな経験はありませんか?
特に AWS Lambda などのサーバーレス環境で、API Gatewayから渡される event の中身が 「ただの文字列(JSON String)」 なのか 「デコード済みの辞書(dict)」 なのかを判断しなければならない場面は多々あります。
今回は、Pythonの型チェックにおいて最も重要で便利なAPI、isinstance() について徹底解説します。
1. isinstance() とは?
isinstance() は、あるオブジェクトが特定の型(クラス)のインスタンスかどうかを判定する組み込み関数です。
基本的な構文
isinstance(object, classinfo)- object: チェックしたい変数やオブジェクト
- classinfo: 型(int, str, list, dictなど)や、そのタプル
2. なぜ type() ではなく isinstance() なのか?
Pythonには型を調べる type() 関数もありますが、実務(特にバリデーション)では isinstance() が推奨されます。その理由は 「継承」 に対応しているからです。
| 機能 | isinstance(obj, Class) | type(obj) == Class |
| 基本判定 | 〇 可能 | 〇 可能 |
| 継承の考慮 | 〇 子クラスも親クラスとみなす | × 厳密に一致しないとFalse |
| 複数指定 | 〇 タプルで一括判定可能 | × 1つずつ比較が必要 |
💡 Tips: > 拡張性を考慮する場合、
isinstance()を使うのがPythonic(Pythonらしい)な書き方です。
3. 実践:AWS Lambdaでのデータチェック例
ユーザーが仰る通り、AWS Lambdaなどで外部データを受け取る際のバリデーションには isinstance() が非常に強力です。
例えば、受け取った body がすでに辞書形式なのか、まだJSON文字列なのかを判定して処理を分けるコードは以下のようになります。
import json
def lambda_handler(event, context):
body = event.get('body')
# bodyが文字列(str)ならデコードし、辞書(dict)ならそのまま使う
if isinstance(body, str):
data = json.loads(body)
elif isinstance(body, dict):
data = body
else:
return {"error": "Invalid data type"}
# 以降、dataを辞書として安全に処理できる
print(data.get("user_name"))このように、「型が分からない状態」を「確実に扱える状態」へ交通整理するのが isinstance() の役割です。
4. 便利なテクニック:複数の型を一括チェック
isinstance() は、第2引数にタプルを渡すことで「AまたはBである」という判定が1行で書けます。
# 数値(整数または浮動小数点)かどうかをチェック
value = 10.5
if isinstance(value, (int, float)):
print("これは数値です")このスッキリとした記述は、複雑なデータバリデーションを行う際に非常に重宝します。
まとめ:isinstance() は型安全への第一歩
Pythonの動的型付けは大きなメリットですが、システムの境界線(APIの入力部など)では厳密な型チェックが信頼性を生みます。
isinstance()を使って、予期せぬ型エラー(TypeError)を防ぐ- AWS Lambda 等の外部連携では、まず型を確認する癖をつける
- 継承をサポートするため、
type()よりも優先して使用する
これらを意識するだけで、あなたのPythonコードはぐっとプロフェッショナルで堅牢なものになるはずです。

コメント