銀月の符号

Python 使い見習いの日記・雑記

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)