1. ホーム
  2. python

[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?

2022-07-07 13:55:30

質問

任意の Python オブジェクトが与えられたとき、それが数であるかどうかを判断する最良の方法は何でしょうか?ここで is は次のように定義されます。 acts like a number in certain circumstances .

例えば、ベクトルのクラスを書くとします。別のベクトルが与えられたら、その内積を求めたい。スカラーが与えられたら、ベクトル全体をスケーリングしたい。

何かが int , float , long , bool は厄介で、数値のように振る舞うかもしれないユーザー定義オブジェクトをカバーしません。しかし __mul__ をチェックするのは十分ではありません。なぜなら、先ほど説明したベクトルクラスは __mul__ を定義しますが、それは私が欲しい数の種類ではないでしょう。

どのように解決するのですか?

使用方法 Number から numbers モジュールをテストするために isinstance(n, Number) をテストするためのモジュールです (2.6 以降で利用可能)。

>>> 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(f'{n!r:>14} {isinstance(n, Number)}')
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

これはもちろん、ダックタイピングに反しています。 もしあなたが、オブジェクトがどのように がどのように振る舞うかを重視するならば ということよりも である。 のように、数値があるかのように操作を行い、そうでない場合は例外を使用します。