- リスト、辞書、タプルのようなイテレータが使える型には__iter__属性がある
- ただし文字列には__iter__がない
- Javaでいうinstanceofがやりたいときは、組み込み関数isinstance(obj, type)を使う
- issubclass(obj, type)というのもある
それでもどうしても型チェックがやりたくなるときはあります。
引数が本当にリストなのかどうかチェックしたりとか、引数をfor()文でループさせたいときとか。
そういった場合にPythonではどうすればいいのか調べてみました。
以下、すべてPython2.5.2で動作確認しています。
Javaでいうinstanceofに相当するPythonの組み込み関数はisinstance(obj, type)です。このメソッドを使えば、引数がリストか、文字列かといったチェックは簡単にできます。
#listかどうか
isinstance([1,2,3], list)
#辞書かどうか
isinstance({'a':1, 'b':2}, dict)
#タプルかどうか
isinstance((1,2,3), tuple)
引数がiterableかどうか(for文でループできるかどうか)の判定はちょっと複雑で、以下のようになります。#itarableかどうか(Stringを含む)
#実際にはgetattr(obj, '__iter__', False)よりもhasattr(obj, '__iter__')のほうがスマート
isiterable = lambda obj: isinstance(obj, basestring) or getattr(obj, '__iter__', False)
isiterable('abcde')
#iterableかどうか(Stringは含まない)
getattr([1,2,3], '__iter__', False)
#またはhasattrを使って
hasattr([1,2,3], '__iter__')
普通のiterableなオブジェクトは__iter__属性を持っているのでこれですぐに判断できます。しかしなぜか文字列だけは__iter__属性がないのでisinstance()を併用します。
※一部http://bytes.com/forum/thread514838.htmlより転載いたしました。ありがとうございました。