web-dev-qa-db-ja.com

pythonオブジェクトが数値であるかどうかを確認するにはどうすればよいですか?

Javaでは、数値型はすべてNumberから派生しているため、

(x instanceof Number).

同等のpythonは何ですか?

170
Neal Ehardt

最新のPythonバージョン(2.6以降。古いバージョンでは、いくつかのハードコードされた型のチェックにほとんど制限されています)の正しい方法は、変数が numbers.Number のインスタンスであるかどうかをテストすることです。

>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]

これは ABCs を使用し、すべての組み込みの数値クラスと、ソルトに値するすべてのサードパーティクラス(Number ABCのサブクラスとして登録されている場合)でも機能します。ただし、多くの場合、手動で型指定されたチェックを心配する必要はありません-Pythonはアヒル型であり、通常互換性のある型の混合が通常機能しますが、一部の操作が意味をなさない場合(4 - "1")これはほとんど必要ありません。それは単なるボーナスです。このモジュールを終了するときに追加して、実装の詳細で他の人を悩ませないようにすることができます。

213
user395760

私はこれがうまくいくと思う:

isinstance(x, (int, long, float, complex))

159
Matt

Numberモジュールのnumbersを使用して、isinstance(n, Number)をテストします(2.6以降で使用可能)。

isinstance(n, numbers.Number)

ここでは、さまざまな種類の番号と1つの非番号で動作しています。

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2,0), Fraction(2,1), '2']:
...     print '%15s %s' % (n.__repr__(), isinstance(n, Number))
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

もちろん、これはアヒルのタイピングに反しています。オブジェクトが何であるかではなく、どのように動作するかをもっと気にする場合は、番号があるかのように操作を実行し、例外を使用してそうでないことを伝えます。

49

isinstanceを使用できますが、これはPythonの動作ではないことに注意してください。 Pythonはアヒル型言語です。タイプを明示的にチェックしないでください。誤った型が渡された場合、TypeErrorが発生します。

したがって、それがintであると仮定してください。気にしないでください。

1
user225312

それは実際にはpythonの仕組みではありません。数字と同じように使用してください。数字ではないものを誰かが渡すと失敗します。正しい型を渡すのはプログラマーの責任です。

0
Falmarri