如何检查我的 python 对象是不是为数字? [复制]
Posted
技术标签:
【中文标题】如何检查我的 python 对象是不是为数字? [复制]【英文标题】:How can I check if my python object is a number? [duplicate]如何检查我的 python 对象是否为数字? [复制] 【发布时间】:2011-05-10 09:17:31 【问题描述】:在 Java 中,数字类型都来自 Number,所以我会使用
(x instanceof Number).
python 等价物是什么?
【问题讨论】:
不是真正的重复,另一个是这个问题的一个非常具体的案例(检查某个东西是否是向量中的数字),大多数投票的答案确实与那个细节有关。 将 x 乘以零。如果结果不是零,则 x 不是数字,请参阅:***.com/a/44418960/3419693 【参考方案1】:测试你的变量是否是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 是 duck typed,混合一些兼容的类型通常是可行的,但是当某些操作没有意义时,它会发出错误消息 (4 - "1"
),因此很少需要手动检查。这只是一个奖金。您可以在完成模块时添加它,以避免在实现细节上纠缠他人。
这适用于starting with Python 2.6。在旧版本上,您几乎只能检查一些硬编码类型。
【讨论】:
当你传递一个布尔值时,这会给出一个误报:isinstance(True, numbers.Number)
返回True
,即使True
显然不是一个数字。
@AlexKahn 在 Python 中,布尔值实际上是数字:bool
继承自 int
、abs(True) == 1
、"foo" * False == ""
、sum([True, False, True]) == 2
、"%f" % True == "1.0"
等等。
令人沮丧的是,isinstance(float('nan'), numbers.Number)
返回True
要排除布尔值,您可以使用以下内容。 isinstance(x, numbers.Number) and not isinstance(x, bool)
您也可以使用type(x) in (int, float, complex)
来检查x
是否直接是这些类型之一,而不是它们的实例【参考方案2】:
Python 3:
isinstance(x, (int, float, complex)) and not isinstance(x, bool)
Python 2:
isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)
请注意,此答案不适用于 Numpy 对象。
【讨论】:
谢谢,这最终在 Jython 中为我工作(这是 python 2.5,所以它没有“数字”包)。是的,我有一个真正的理由来打破鸭子打字;我需要区别对待字符串和数字。isinstance(Decimal(10), (int, long, float, complex))
给出False
。 -1
如果x
是布尔值,这也不起作用。 isinstance(True, (int, long, float, complex))
返回True
。
@AlexKahn isinstance(True, numbers.Number)
或 isinstance(False, numbers.Number)
也返回 True。
简短说明:float('nan')
可能被认为是非数字的,但这当然会返回 True
。【参考方案3】:
使用numbers
模块中的Number
来测试isinstance(n, Number)
(自2.6 起可用)。
isinstance(n, numbers.Number)
这里有各种数字和一个非数字:
>>> 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 在允许对各种非算术事物进行算术类型运算方面有点激进——所以仅仅因为一个对象允许+
或 *
并不意味着它就像一个数字。【参考方案4】:
当然可以使用isinstance
,但请注意,这不是 Python 的工作方式。 Python 是一种鸭子类型的语言。您不应该明确检查您的类型。如果传递了不正确的类型,将引发 TypeError
。
所以假设它是int
。不要费心检查。
【讨论】:
如前所述,duck-typing 的全部意义在于允许同一类中的方法重载和方法多态性。 鸭式打字并不总是可行的。有时,最好在函数开头有一个小检查段落并失败或修复输入,而不是将整个代码封装在try-except
中,这会使整个代码难以阅读。【参考方案5】:
这并不是 python 的真正工作方式。就像使用数字一样使用它,如果有人传递给你一些不是数字的东西,那就失败了。传入正确的类型是程序员的责任。
【讨论】:
...但前提是它们被触发。在“正常”情况下,它们比if
语句便宜。
并不总是那么简单,有时两种类型都支持接口,但您希望以不同的方式处理它们。考虑一个应该添加数字但不连接字符串的 reduce 函数。
这个答案是假设最幼稚的脚本,不考虑复杂的情况。正如 Rob 所说,处理数字而不是字符串是合法的需求。在许多情况下,自定义类在乘以数字时需要以一种方式运行,而在乘以自身的实例时需要以不同的方式运行。您可能会以这种方式实现一个矩阵类。
@Falmarri 绝对可以...docs.python.org/2/reference/…
防御性编程是必要的,尤其是当您使用这些值在例如数据库中执行数据操作操作时。动态语言很棒,但有时您需要保证。以上是关于如何检查我的 python 对象是不是为数字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章