如何在Python中对变量进行类型检查?
如何在Python中对变量进行类型检查?
我有一个Python函数,它接受一个数字参数,必须是整数才能正确运行。在Python中验证这一点的首选方法是什么?
我的第一反应是这样做:
def isInteger(n): return int(n) == n
但我不能帮助想到这是:1)昂贵的,2)丑陋的,3)受机器epsilon的影响。
Python是否提供本地的变量类型检查手段?或者这是否被认为是违反语言动态类型设计的行为?
编辑:由于许多人问到——相关应用程序处理IPv4前缀,从平面文本文件获取数据。如果将任何输入解析为浮点数,则应将该记录视为格式不正确并忽略。
是的,正如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