是的,就像Evan说的,不要进行类型检查。只需尝试使用该值即可。
def myintfunction(value):
""" Please pass an integer """
return 2 + value
那没有类型检查。这太棒了!让我们看看我尝试时会发生什么:
>>> myintfunction(5)
7
那个可以,因为它是整数。嗯。让我们试试一些文本。
>>> myintfunction( text )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in myintfunction
TypeError: unsupported operand type(s) for +: int and str
它显示了一个错误类型错误,这本来就是应该的。如果调用者想要捕获它,是可能的。
如果您进行类型检查,您会怎么做?显示错误吗?因此您不必进行类型检查,因为错误已经自动显示出来了。
此外,由于您没有进行类型检查,因此您的函数可以使用其他类型。
浮点数:
>>> 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
所以很明显,通过类型检查你什么都得不到,但会失去很多。
UPDATE:
由于您编辑了问题,现在清楚的是,您的应用程序调用了一些只使用整数才有意义的上游例程。
既然如此,我仍然认为您应该将参数按接收到的方式传递给上游函数。上游函数将正确地处理它,例如如果需要则引发错误。我非常怀疑如果您将浮点数传递给处理IP的函数,它不会出现奇怪的行为。如果您可以告诉我们库的名称,我们可以为您检查。
但是...如果上游函数的行为不正确,并且在你将其传递给它时会杀死一些孩子(我仍然非常怀疑),那么只需要调用int()
即可:
def myintfunction(value):
""" Please pass an integer """
return upstreamfunction(int(value))
你仍然没有进行类型检查,因此你可以获得大部分不进行类型检查而获得的好处。
即使经过这一切,你真的想进行类型检查,尽管它降低了应用程序的可读性和性能,而且没有任何好处,那么可以使用assert
进行检查。
assert isinstance(...)
assert type() is xxxx
这样我们可以关闭assert
并通过将其称为来删除程序中的<sarcasm>
特性</sarcasm>
。
python -OO program.py