Pythonの型判定の新常識!isinstance() を使いこなして堅牢なコードを書く方法

この記事は約3分で読めます。

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コードはぐっとプロフェッショナルで堅牢なものになるはずです。

コメント

タイトルとURLをコピーしました