Hatena::ブログ(Diary)

銀月の符号 このページをアンテナに追加 RSSフィード

のんびり、まったり

2009-06-27

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)

参考

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fgshun/20090627/1246102785
リンク元
Connection: close