Python / type() / データ型を確認する関数
Pythonのtype(value)は値の実際の型オブジェクトを返し、"int"のような文字列ではありません。厳密に同じ型かはtype(value) is intで確認します。サブクラスも許可する通常の検査にはisinstance()が適しています。
基本的な使い方と戻り値
1引数のtype()は対象の型を返します。数値・文字列・コレクションだけでなく型自体もオブジェクトです。対話シェルでは式の結果が表示されますが、ファイル実行ではprint()などで表示します。
例はPython 3.12で実行できます。コード全体をUTF-8のtype_example.pyに保存し、python type_example.py、環境によってはpython3で実行します。各例は内容を置き換えて独立に試せます。
values = (123, 12.3, "abc", [1, 2], (1, 2), {"a": 1}, {1, 2}, 1 + 2j, True, None)
for value in values:
print(type(value))
期待される出力:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'set'>
<class 'complex'>
<class 'bool'>
<class 'NoneType'>
<class 'int'>は整数型オブジェクトの表示で、文字列との比較は型検査になりません。__name__は読みやすい名前に使えますが、同名の別クラスもあるため判定には型オブジェクトを使います。
kind = type(123)
print(kind is int)
print(kind == "int")
print(kind.__name__)
True
False
int
3引数のtype(name, bases, dict)は新しいクラスを作る別の用途です。単純な型確認では1引数の形式と区別します。
厳密な型比較とisinstance()の違い
type(value) is Tは実際の型がTそのものか確認します。isinstance(value, T)はサブクラスも認めるので継承に有用です。次はAnimalを継承するDogと数値型を比べる完全な例です。
class Animal:
pass
class Dog(Animal):
pass
pet = Dog()
print(type(pet).__name__)
print(type(pet) is Animal)
print(isinstance(pet, Animal))
print(type(True) is int)
print(isinstance(True, int))
print(isinstance(3, (int, float)))
Dog
False
True
False
True
True
Dogの実際の型はDogなのでAnimalそのものではありませんが、Animalのインスタンスです。またboolはintのサブクラスなのでisinstance(True, int)は真です。個数に論理値を許可しないなら厳密なint検査やboolの別途除外が必要です。型のタプルで複数の候補も指定できます。
別の型を変数に再代入した場合
Pythonのオブジェクトと型では、名前と現在参照する対象を区別します。同じ名前に文字列を代入しても、以前の整数オブジェクトを文字列に変えるわけではありません。
value = 123
original = value
print(type(value).__name__)
value = "123"
print(type(value).__name__)
print(type(original).__name__)
int
str
int
最初は2つの名前が同じ整数を参照します。value = "123"後はvalueが文字列、originalが以前の整数を参照します。この再束縛はint()やstr()による値の変換とは別です。
コンテナーの型・内容・型ヒント
type(values)はすべてのリスト要素の型を調べません。list[int]などの型ヒントも、実行時に自動検証や変換を強制するものではありません。
values: list[int] = [1, "2"]
print(type(values).__name__)
print(all(type(item) is int for item in values))
try:
print(isinstance(values, list[int]))
except TypeError:
print("TypeError")
list
False
TypeError
intと注釈しても文字列"2"を含むリストを実行時に作れます。要素ごとの厳密なint検査は偽です。isinstance()の第2引数にlist[int]を渡すとTypeErrorになります。外側の型と内部スキーマの検証を分け、静的型チェッカーの警告も活用します。
Noneと値の条件も確認する
Noneは欠如を表す別のオブジェクトで、value is Noneなら明確です。型が正しくても業務上の値として有効とは限りません。次の関数はboolを除く厳密な整数で0以上だけを許可します。
value = None
print(value is None)
print(type(value).__name__)
def valid_count(value):
return type(value) is int and value >= 0
for value in (3, -1, True, "3", None):
print(repr(value), valid_count(value))
True
NoneType
3 True
-1 False
True False
'3' False
None False
andは型検査が偽なら後の比較を省き、文字列やNoneへの>= 0を避けます。-1は整数でも値の条件で拒否されます。入力を変換するか特定の型だけ受け付けるか決め、範囲・欠如・形式の条件を追加します。




