如何在Python中对变量进行类型检查?

21 浏览
0 Comments

如何在Python中对变量进行类型检查?

我有一个Python函数,它接受一个数字参数,必须是整数才能正确运行。在Python中验证这一点的首选方法是什么?

我的第一反应是这样做:

def isInteger(n):
    return int(n) == n

但我不能帮助想到这是:1)昂贵的,2)丑陋的,3)受机器epsilon的影响。

Python是否提供本地的变量类型检查手段?或者这是否被认为是违反语言动态类型设计的行为?

编辑:由于许多人问到——相关应用程序处理IPv4前缀,从平面文本文件获取数据。如果将任何输入解析为浮点数,则应将该记录视为格式不正确并忽略。

admin 更改状态以发布 2023年5月21日
0
0 Comments

是的,正如Evan所说,不要进行类型检查。尝试使用值:

def myintfunction(value):
   """ Please pass an integer """
   return 2 + value

它没有类型检查。这非常好!让我们看看当我尝试使用它时会发生什么:

>>> myintfunction(5)
7

这可以工作,因为它是一个整数。嗯。让我们尝试一些文本。

>>> myintfunction('text')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 3, in myintfunction
TypeError: unsupported operand type(s) for +: 'int' and 'str'

它会显示错误,TypeError,这本来就是它应该做的。如果调用者想要捕获它,那是可能的。

如果你做了类型检查,你将会做什么?显示一个错误?所以你不必进行类型检查,因为错误已经自动出现。

此外,由于你没有进行类型检查,你的函数可以使用其他类型:

浮点数:

>>> print myintfunction(2.2)
4.2

复数:

>>> print myintfunction(5j)
(2+5j)

十进制数:

>>> import decimal
>>> myintfunction(decimal.Decimal('15'))
Decimal("17")

甚至是完全任意的可以加数字的对象!

>>> class MyAdderClass(object):
...     def __radd__(self, value):
...             print 'got some value: ', value
...             return 25
... 
>>> m = MyAdderClass()
>>> print myintfunction(m)
got some value:  2
25

所以很明显,通过类型检查你什么也得不到。却失去了很多。


更新:

由于你编辑了问题,现在清楚的是,你的应用程序调用了一些仅在整数情况下才有意义的上游程序。

既然如此,我仍然认为你应该将参数按接收到的方式传递给上游函数。上游函数将正确处理它,比如需要时引发错误。我非常怀疑,处理IP的函数如果你传递一个浮点数会表现出奇怪的行为。如果你可以告诉我们库的名称,我们可以为你检查一下。

但是...如果上游函数在传递浮点数时会不正确地行为并杀死一些孩子(我仍然非常怀疑),那么就对它调用int()

def myintfunction(value):
   """ Please pass an integer """
   return upstreamfunction(int(value))

如果你仍然不想进行类型检查,那么你将获得不进行类型检查的大部分优势。


即使在这样的情况下,你真的想要进行类型检查,尽管它会降低应用程序的可读性和性能,而没有任何好处,可以使用一个assert来执行它。

assert isinstance(...)
assert type() is xxxx

这样我们就可以通过调用它来关闭assert并从程序中删除这个功能

python -OO program.py

0
0 Comments

isinstance(n, int)

如果您需要知道它是否绝对是实际的 int 而不是 int 的子类(通常情况下您不需要这样做):

type(n) is int

这样做:

return int(n) == n

并不是一个好主意,因为跨类型比较可能会是真的 - 特别是 int(3.0)==3.0

0