什么是检查一个对象是否是数字的最pythonic方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (67)

给定一个任意的python对象,确定它是否是数字的最好方法是什么?这里is定义为acts like a number in certain circumstances

例如,假设你正在编写一个矢量类。如果给出另一个向量,则需要查找点积。如果给定一个标量,则需要缩放整个向量。

检查,如果事情是intfloatlongbool很烦人,不包括可能像数字用户定义的对象。但是,__mul__例如,检查是不够好的,因为我刚描述的矢量类将定义__mul__,但它不会是我想要的那种数字。

提问于
用户回答回答于

Numbernumbers模块中使用进行测试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 '%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
用户回答回答于

你想检查一些对象

在某些情况下就像一个数字

如果使用Python 2.5或更高版本,唯一真正的方法是检查一些“特定情况”并查看。

在2.6或更好的,你可以使用isinstancenumbers.Number -一个抽象基类(ABC)存在正是为了这个目的(其它更多的ABC中存在的collections模块为各种形式的集合/容器,重新开始与2.6;以及也只有在这些版本中,如果需要,您可以轻松添加自己的抽象基类)。

Bach到2.5及更早版本,“可以添加0和不可迭代”在某些情况下可能是一个很好的定义。但是,你真的需要问自己,你在问什么是你想要考虑的“一个数字”肯定能够做到的,以及它绝对无法做到的 - 并检查。

这可能也需要在2.6或更高版本中,可能是为了使您自己的注册添加您尚未注册的关注类型numbers.Numbers- 如果您想排除某些声称它们是数字的类型,但是您因为ABC没有unregister办法[例如,你可以制作自己的ABC WeirdNum并在那里注册所有这些奇怪的类型,然后isinstance在继续之前首先检查它们以便保释出来检查isinstance正常numbers.Number继续成功。

顺便说一句,如果当你需要检查是否x可以做某些事情时,你通常不得不尝试类似于:

try: 0 + x
except TypeError: canadd=False
else: canadd=True

__add__本身的存在告诉你什么都没有用,因为例如所有的序列都有它与其他序列连接的目的。例如,该检查等同于“一个数字是这样的事物,以至于这些事件的序列是内建函数的有效单一参数sum”的定义。完全奇怪的类型(例如,当总结为0时引发“错误”异常的类型,例如a ZeroDivisionErrorValueErrorc)将传播异常,但这没问题,让用户尽快知道这样的疯狂类型是不可接受的公司;-); 但是,一个可以归并为标量的“矢量”(Python的标准库没有一个,但当然它们作为第三方扩展很受欢迎)也会在这里给出错误的结果,所以(例如“不允许迭代”(例如,检查iter(x)提出的内容TypeError,或者是否存在特殊的方法__iter__- 如果在2.5或更早的版本中,因此需要自己的检查)。

扫码关注云+社区

领取腾讯云代金券