Re:数値型判定はどうしたらいいのだろう?
「2009-06-20 - Pythonで遊ぶよ - pythonグループ」の以下のコードを見て。「数値型オブジェクトかを判定する、ただし bool 型は除く」という関数です。
def is_numeric(n): return not isinstance(n,bool) and \ (isinstance(n,int) or isinstance(n,long) or isinstance(n,float) or isinstance(n,complex))
これの改良案を3つほど紹介します。後のものほど、よりすっきりしていると思います。
1つ目。Python 2.5 以降限定です。 any 関数とジェネレータ表記のあわせ技で or と isinstance を繰り返し書くのを省いています。
def is_numeric(n): return not isinstance(n, bool) and \ any(isinstance(n, c) for c in (int, long, float, complex))
2つ目。 isinstance 関数はクラスのタプルを取れることを利用します。
def is_numeric(n): return not isinstance(n, bool) and \ isinstance(n, (int, long, float, complex))
3つ目。 Python 2.6 以降限定です。 numbers.Number を使います。じつは有理数型 fractions.Fraction でも True となるため上記のコードとまったく同じではありません。
import numbers def is_numeric(n): return not isinstance(n, bool) and isinstance(n, numbers.Number)