type・isinstance関数の使い方や違いについて知りたい
今回は、Pythonにおける基本的な型の調べ方について、やさしく解説していきたいと思います。プログラムを書いていると、変数などの型を調べる必要が出てきますよね。そんな時に知っていると重宝する関数をご紹介したいと思います。
- 型とは
- そもそも型とは
- type関数、isinstance関数の使い方
- type関数、isinstance関数の違いとは
など、型を調べる方法についてわかりやすく解説していきます。
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Pythonにおける型とは
変数の型とは、その変数に格納されているデータのタイプの事です。例えば、数値が格納されているならint型、小数点が含まれているならfloat型、文字列ならstr型などがあります。
プログラムを書いていると、扱っている変数の型を調べなければいけない場面は多くあります。そのため、型を調べる方法を知っておくととても便利です。
type関数で型を調べる方法
ここでは、type関数の基礎や実際の使い方について解説していきます。
そもそもtype関数とは
型を調べる時は、基本的にはtypeという関数を使います。type関数は、引数に指定したオブジェクトの型を返します。以下のコードをご覧ください。
myvar = 1234 print(type(myvar))
出力結果は以下の通りです。
<type 'int'>
上記コードでは、int型の値1234を格納する変数myvarの型を調べてみました。type関数の引数に型を調べたい変数を当てはめるだけで、戻り値にその変数の型が返ってきます。ご覧いただけるように、int型と表示されました。
type関数の使い方
先ほどのサンプルコードで、type関数の基本的な使い方は理解いただけたと思います。では今度は、int型のみでなく色んなオブジェクトの型を調べてみましょう。以下のコードをご覧ください。
mystr = "Hello" print(type(mystr))
出力結果は以下の通りです。
<type 'str'>
上記コードでは、変数mystrの型を調べてみました。ちゃんと、str型と判別されました。このような基本的なデータ型のみではなく、複数の要素で構成されるコンテナ型変数や、function(関数)などの型も調べる事が出来ます。
以下のコードをご覧ください。
mylist = [1,2,3,4] mydict = {"one":1, "two":2, "three":3} print(type(mylist)) print(type(mydict))
出力結果は以下の通りです。
<type 'list'> <type 'dict'>
上記コードでは、リスト型オブジェクトmylistと辞書型オブジェクトmydictの型を調べてみました。このように、前者はlist、後者はdictと正しく判別されました。最後に、関数オブジェクトの型を調べてみましょう。
Pythonにおいて、関数はオブジェクトの一種なので、type関数で型を調べる事が出来ます。以下のコードをご覧ください。
def myfunc(): return(0) print(type(myfunc))
出力結果は以下の通りです。
<type 'function'>
上記コードでは、myfuncといった0を返すだけの関数を定義しました。myfuncの型をtype関数を用いて調べると、ご覧いただけるようにfunction型と表示されました。
isinstanceで型を調べる方法
Pythonにおいて変数の型を調べるのに、type関数とは別にもう一つ便利なisinstanceという関数が存在します。isinstance関数は引数を二つ要し、bool型を返します。
一つ目の引数は型を調べたい変数、二つ目はクラス名を指定します。ちなみに、クラスと型はPythonにおいて同義語として考えても良いです。isinstance関数は、第一引数に指定したオブジェクトが第二引数に指定したクラスであるかをbool型で返します。
以下のコードをご覧ください。
myvar = 1234 print(isinstance(myvar, int))
出力結果は以下の通りです。
True
上記コードでは、変数myvarがint型かどうかを調べてみました。ご覧いただけるように、myvarは1234を格納しているint型の変数なので、Trueと表示されました。
type関数とisinstance関数の違いとは
今まで紹介したtypeとisinstanceはどちらも型を調べるのに便利な関数です。オブジェクトのクラスを知りたい時はtype関数を、オブジェクトのクラスと指定したクラスが一致しているかを調べたい時は、isinstance関数を使用するのが良いでしょう。
特に、isinstanceは関数の引数などの適正さなどを判断したい時に使われます。引数の型によって挙動が変わる関数などもあるためです。予想外のエラーを引き起こさないためにも、isinstance関数で一度確認しておくことが大切です。
type関数とinstance関数には、引数や戻り値だけではなくもう一つ大きな違いがあります。isinstance関数は、第一引数のオブジェクトが第二引数として指定したクラスのインスタンスであるかをチェックします。
クラスが「型」であれば、インスタンスとはそのクラスを実体化したものです。つまり、int型の変数myvarの場合、intというクラスが「型」でmyvarがそのインスタンスです。
isinstance関数は、二つの引数がオブジェクトと所属クラス、または所属クラスの継承元クラスの両方の場合にも True を返す点です。以下のコードをご覧ください。
class mysuperclass(object): pass class myclass(mysuperclass): pass myinstance = myclass() print(type(myinstance)) print(isinstance(myinstance, myclass)) print(isinstance(myinstance, mysuperclass))
<class '__main__.myclass'> True True
上記コードでは、myclassといったクラスと、そのスーパークラスにあたるmysuperclassを作成しました。myclassのインスタンスを作成しtype関数で型をチェックすると、myclass型であることが分かりました。
一方、isinstance関数を使用すると、myclassのインスタンスはmysuperclassが第二引数に指定されていてもTrueを返しました。このように、type関数は継承関係を考慮しないので、場合によってisinstance関数と使い分けるのが良いでしょう。
まとめ
今回はPythonにおける基本的な型の調べ方をご紹介しました。type関数に加え、isinstance関数なども知っておくと使い分ける事が出来るので便利です。本記事を通して、ご自身でも試して理解を深めてくださいね。