python - 检查对象是否为数字的最pythonic方法是什么?

标签 python types numbers

给定一个任意 python 对象,确定它是否是数字的最佳方法是什么?这里的 is 被定义为 在某些情况下就像一个数字

例如,假设您正在编写一个矢量类。如果给定另一个向量,您想要找到点积。如果给定一个标量,您希望缩放整个向量。

检查某些东西是否是 intfloatlongbool 很烦人,并且不包括用户-定义的对象可能像数字一样。但是,例如,检查 __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

当然,这与鸭式打字相反。如果您更关心对象的作用而不是它是什么,请像有一个数字一样执行您的操作,并使用异常来告诉您其他情况。

关于python - 检查对象是否为数字的最pythonic方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441358/

相关文章:

python - virtualenv 在生产中的位置

C 数据类型的范围

objective-c - 调用从 ObjC 获取 bool(而不是 BOOL)的 C 函数

c# - Java和C#——字节数组到长转换的区别

node.js - 为字母指定特定数字

Javascript对象月份对应值计算

python - 如何在不将音频文件保存在磁盘上的情况下将 numpy 数组转换为字节对象?

python - 在 Pycharm (Python 2.7) 上的 Jupyter 上向上/向下移动选定的单元格

Python SQLite 更新错误

typescript - 为什么我不能使用常量中的值作为自定义类型定义?