如何在Python中键入check变量?

2024-06-26 14:01:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python函数,它接受一个数值参数,该参数必须是整数才能正常工作。在Python中,首选的验证方法是什么?

我的第一反应是这样做:

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

但我忍不住想,这是一个昂贵的丑陋和3)受温柔的怜悯的机器epsilon。

Python是否提供了任何类型检查变量的本地方法?或者这被认为违反了语言的动态类型设计?

编辑:由于许多人问过这个问题,这个应用程序使用IPv4前缀,从纯文本文件中获取数据。如果任何输入被解析为浮点,则该记录应被视为格式错误并被忽略。


Tags: 方法函数机器语言编辑类型参数return
3条回答
if type(n) is int

这将检查n是否是Python int,并且是int。它不接受int的子类。

然而,类型检查并不适合“Python方式”。最好使用n作为int,如果它抛出异常,则捕获它并对其执行操作。

isinstance(n, int)

如果您需要知道它是否是一个实际的int而不是int的子类(通常您不需要这样做):

type(n) is int

这:

return int(n) == n

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

是的,正如埃文所说,不要打支票。试着使用这个值:

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才有意义的上游例程。

既然如此,我仍然认为应该将参数作为已接收的参数传递给上游函数。上游函数将正确处理它,例如,如果需要,将引发错误。我非常怀疑,如果你给IPs一个float,它处理IPs的函数会有奇怪的行为。如果你能告诉我们图书馆的名字,我们可以帮你查一下。

但是。。。如果上游函数的行为不正确,如果你给它一个浮点数(我仍然非常怀疑),就会杀死一些孩子,那么只要调用它上的int()

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

你仍然没有打字,所以你得到了不打字的最大好处。


即使如此,如果您真的想输入check,尽管它会降低应用程序的可读性和性能,但绝对没有任何好处,请使用assert来完成它。

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

这样我们就可以关闭asserts,并通过调用它来从程序中删除这个<sarcasm>特性

python -OO program.py

相关问题 更多 >