type で型を調べる

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 値の型を調べるには組み込み関数 type(値) を使います、戻り値はクラスオブジェクトです
  • 型名を文字列で取り出すには type(値).__name__'int' 'str' などが得られます
  • 最小例は def get_type_name(value): return type(value).__name__

type で型を調べる とは

引数の型を type で調べて文字列で返す方法を学びます。本レッスンでは、type で型を調べる の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

type 関数で型を調べる

Python動的型付け 言語なので、変数を作るときに型を明示しません。とはいえ、内部では int str bool float list dict tuple None といった型が値ごとに必ず決まっています。値の型を知りたいときは 組み込み関数type を使います。

Python

type(1) # <class 'int'> type('hello') # <class 'str'> type(True) # <class 'bool'> type(None) # <class 'NoneType'>

type の戻り値は class オブジェクトで、表示すると <class 'int'> のような形になります。プログラム内で型を判定したいときは、type(x) is int のように is で比較するか、__name__ 属性で名前文字列 'int' を取り出します。

Python の型は値そのものに付くもので、変数に付くものではありません。同じ変数に違う型の値を再代入することも可能です。

主な組み込み型

Python には数多くの型がありますが、よく使うのは下記の数種類です。

  • int 整数 (例 1, 42, -7)
  • float 小数 (例 3.14, 0.1)
  • str 文字列 (例 'abc')
  • bool 真偽値 (例 True, False)
  • NoneType 何もないことを表す None
  • list リスト (例 [1, 2])
  • dict 辞書 (例 {'a': 1})
  • tuple タプル (例 (1, 2))
type(値)type(値).__name__
42<class 'int'>'int'
3.14<class 'float'>'float'
'abc'<class 'str'>'str'
True<class 'bool'>'bool'
None<class 'NoneType'>'NoneType'
[1, 2]<class 'list'>'list'

bool は実は int の子クラスで、True1False0 として扱える、というのも覚えておくと便利です。

文法のおさらい

型を文字列として取り出す方法はいくつかありますが、いちばん安全なのは type(x).__name__ を使う方法です。

Python

def get_type_name(value): return type(value).__name__ get_type_name(1) # 'int' get_type_name('hi') # 'str' get_type_name(True) # 'bool' get_type_name(None) # 'NoneType'

__name__ 属性には型の名前が文字列として入っています。<class 'int'> のような余計な装飾なしで 'int' という短い文字列だけが得られます。

動きを追ってみる

Python

value = 3.14 t = type(value) name = t.__name__ return name

このコードでは、value の型を t に取り出し、その __name__name に入れています。value3.14 のとき、name'float' になります。

diagram (will load when visible)

図を箇条書きで言い換えると、次のとおりです。

  • value = 3.14 を準備
  • type(value)<class 'float'> を取り出す
  • .__name__ で文字列 'float' に変換
  • 'float' を呼び出し元へ返す

よくある間違い

型まわりでつまずきやすいポイントを 3 つ紹介します。

  1. type(x) == 'int' と比較する type(x) はクラスオブジェクトで文字列ではないので、文字列の 'int' とは決して等しくなりません。type(x) is inttype(x).__name__ == 'int' を使います。
  2. boolint と混同する True の型は bool であって int ではありません。type(True).__name__'bool' を返します。
  3. None の型を 'None' と書く 正しくは NoneType です。type(None).__name__'NoneType' を返します。

型判定では type(x) is int よりも isinstance(x, int) のほうが継承を考慮できるので、本来はこちらが推奨されます。

isinstance との違い

typeisinstance は似ているように見えて、使いどころが少し違います。type(x) is intその値が厳密に int 型かどうか を調べますが、isinstance(x, int)int のサブクラスでも True を返します。たとえば Truebool 型ですが boolint のサブクラスなので、isinstance(True, int)True です。一方 type(True) is intFalse になります。

Python

isinstance(True, int) # True type(True) is int # False
比較方法継承を考慮用途
type(x) is Tしない (厳密一致)「ぴったり T 型」を判定したいとき
isinstance(x, T)する (サブクラス OK)「T として扱える値か」を判定したいとき
type(x).__name__しない (文字列を取得)表示やログ出力で型名を文字列で欲しいとき

実務では isinstance を使うことが多いですが、レッスンの目的に応じて使い分けましょう。

この章のポイント

ここまでの要点 型を取り出すなら type(値)、文字列で欲しいなら type(値).__name__、判定が目的なら isinstance(値, 型)boolint のサブクラス、None の型名は 'NoneType'

やってみよう

引数 value を受け取り、その型名を文字列で返す関数 get_type_name を実装してください。手順は次のとおりです。

  1. def get_type_name(value): で関数を定義する
  2. type(value).__name__ の値を return する
  3. 「実行」ボタンでテストを走らせ、int str bool NoneType float list の 6 種類すべてで pass するか確認する

if で型を場合分けするのではなく、type(value).__name__ の 1 行で書けることを意識しましょう。print ではなく return で返すのも忘れずに。

よくある質問

Q. このトピックは Python 以外の言語でも同じ書き方ですか?

A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。

Q. 実行してエラーが出た場合の対処は?

A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。

Q. 次のステップで何を学ぶべきですか?

A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。

次のレッスン

次は 文字列を int に変換する で、引数の型を type で調べて文字列で返す方法を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. type の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. type とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. type 関数を使って引数の型オブジェクトを取得する
  2. 型オブジェクトの name 属性で名前文字列を取り出す
  3. if 文で場合分けせず 1 行で書く

入出力例

test-cases.txt

get_type_name(1)"int" get_type_name("hello")"str" get_type_name(true)"bool" get_type_name(null)"NoneType" get_type_name(3.14)"float" get_type_name([1,2,3])"list"

ヒント

main.py
main.py
学習モード

メモ

type で型を調べる

⌘S で保存