2008年9月26日金曜日

Python で変数の型 (クラス) を調べる – types モジュール


1. type, isinstance 関数で、変数の型を調べる

Python で、変数の中身が、どのクラスに所属するのか、または、関数なのか調べたい。

2.1 組み込み関数 によると、 (装飾は、引用者による)

type(object)
object の型を返します。返される値は型オブジェクトです。
isinstance(object, classinfo)
引数 object が引数 classinfo のインスタンスであるか、 (直接または間接的な) サブクラスのインスタンスの場合に真を返します。
例えば、「数値」の場合、次のようにして、数値に対して type 関数を適用する。
print type(100)    #=> <type 'int'>
type 関数の結果を用いて、isinstance 関数の引数に指定した。
print isinstance(100, int)    #=> True

追記 (2011.12.10) :  Python 2.6 では、型の検査として、type 関数は推奨されていない。

type(object)(原文)

object の型を返します。オブジェクトの型の検査には isinstance() 組み込み関数を使うことが推奨されます。

 

関数に対して、type 関数は使えない

次に、関数に対して、type 関数を適用してみる。

def hoge():
    pass

print type(hoge)    #=> <type 'function'>

print isinstance(hoge, function) # ここでエラー 

実行したら、以下のエラーが表示された。

exceptions.NameError: name 'function' is not defined

あれ? (+_+)

 

2. types モジュールに、型の名前が定義されている

先ほどの type 関数の説明の続きに、 次のようにある。

標準モジュール types は、組み込み名を持っていない全ての組み込み型の名前を定義しています。

(同上より、装飾は引用者による)

3.6 types -- 組み込み型の名前 を参照すると、型の一覧が書かれていた。

このモジュールは標準のPythonインタプリタで使われているオブジェクトの型について、名前を定義しています

(同上より)

これによると、「関数」は、

FunctionType
ユーザー定義の関数またはlambdaの型です。
LambdaType
FunctionTypeの別名です。

よって、次のように書ける。

import types
print type(hoge) is types.FunctionType
print isinstance(hoge, types.FunctionType)

ちなみに、isinstance 関数において str , int などを型として利用できる理由は、 次の通り。

Python 2.2以降では、int()str()のようなファクトリ関数は、型の名前となりましたので、typesを使用する必要はなくなりました。

(同上より)

 

参考サイト