type で型を調べる
このレッスンで分かること
- 値の型を調べるには組み込み関数
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何もないことを表すNonelistリスト (例[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の子クラスで、Trueは1、Falseは0として扱える、というのも覚えておくと便利です。
文法のおさらい
型を文字列として取り出す方法はいくつかありますが、いちばん安全なのは 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 に入れています。value が 3.14 のとき、name は 'float' になります。
図を箇条書きで言い換えると、次のとおりです。
value = 3.14を準備type(value)で<class 'float'>を取り出す.__name__で文字列'float'に変換'float'を呼び出し元へ返す
よくある間違い
型まわりでつまずきやすいポイントを 3 つ紹介します。
type(x) == 'int'と比較するtype(x)はクラスオブジェクトで文字列ではないので、文字列の'int'とは決して等しくなりません。type(x) is intかtype(x).__name__ == 'int'を使います。boolをintと混同するTrueの型はboolであってintではありません。type(True).__name__は'bool'を返します。Noneの型を'None'と書く 正しくはNoneTypeです。type(None).__name__は'NoneType'を返します。
型判定では
type(x) is intよりもisinstance(x, int)のほうが継承を考慮できるので、本来はこちらが推奨されます。
isinstance との違い
type と isinstance は似ているように見えて、使いどころが少し違います。type(x) is int は その値が厳密に int 型かどうか を調べますが、isinstance(x, int) は int のサブクラスでも True を返します。たとえば True は bool 型ですが bool は int のサブクラスなので、isinstance(True, int) は True です。一方 type(True) is int は False になります。
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(値, 型)。bool は int のサブクラス、None の型名は 'NoneType'。
やってみよう
引数 value を受け取り、その型名を文字列で返す関数 get_type_name を実装してください。手順は次のとおりです。
def get_type_name(value):で関数を定義するtype(value).__name__の値をreturnする- 「実行」ボタンでテストを走らせ、
intstrboolNoneTypefloatlistの 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 つができることを確認しましょう。
- type の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. type とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- type 関数を使って引数の型オブジェクトを取得する
- 型オブジェクトの name 属性で名前文字列を取り出す
- 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"