是的,正如埃文所说,不要输入检查。只需尝试使用该值:
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'
它显示了一个错误,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
所以你显然通过类型检查一无所获。并且损失很多。
更新:
由于您已经编辑了问题,现在很明显您的应用程序调用了一些仅对 int 有意义的上游例程。
既然如此,我仍然认为您应该将收到的参数传递给上游函数。上游函数将正确处理它,例如,如果需要,会引发错误。我非常怀疑,如果你传递一个浮点数,你处理 IP 的函数会表现得很奇怪。如果您可以给我们图书馆的名称,我们可以为您检查。
但是......如果上游函数会表现不正确并在你传递一个浮点数时杀死一些孩子(我仍然非常怀疑它),那么只需调用int()
它:
def myintfunction(value):
""" Please pass an integer """
return upstreamfunction(int(value))
您仍然没有进行类型检查,因此您获得了不进行类型检查的最大好处。
如果即使在这之后,您真的想进行类型检查,尽管它会降低您的应用程序的可读性和性能而绝对没有任何好处,请使用 anassert
来执行此操作。
assert isinstance(...)
assert type() is xxxx
这样我们就可以关闭s 并通过调用它来从程序assert
中删除这个<sarcasm>
特性</sarcasm>
python -OO program.py