Python 2.7 和 Python 3.3 中函数的类型检查
在我的函数里,我会检查输入的类型,以确保它是有效的(比如说,对于一个检查数字'n'是否为质数的函数,我不希望'n'被输入为字符串)。
问题出现在检查long
和int
类型的时候。在Python 3.3中,他们去掉了long
这种类型,所以就出现了这样的问题:
def isPrime(n):
"""Checks if 'n' is prime"""
if not isinstance(n, int): raise TypeError('n must be int')
# rest of code
这个方法在Python 2.7和3.3中都能用。但是,如果我在一个Python 2.7的程序中导入这个函数,并且输入一个long
类型的数字作为'n',比如说:isPrime(123456789000)
,那么显然会出现TypeError
错误,因为'n'是long
类型,而不是int
类型。
那么,我该如何检查输入在Python 2.7和3.3中对于long
和int
都是有效的呢?
谢谢!
3 个回答
来自:http://docs.python.org/3.1/whatsnew/3.0.html#integers
在新的版本中,sys.maxint这个常量被去掉了,因为现在整数的值没有限制了。不过,你可以用sys.maxsize来表示一个比任何实际的列表或字符串索引都要大的整数。这个值是根据你使用的系统的“自然”整数大小来决定的,通常在同一个平台上,它的值和之前版本中的sys.maxint是一样的(前提是使用了相同的构建选项)。
if not isinstance(n, int) or n > sys.maxsize: raise TypeError('n must be int')
这可能有助于区分int和long类型。
在编程中,有时候我们会遇到一些问题,想要找到解决方案。比如,有人可能在使用某个工具或库时,遇到了错误或者不明白的地方。这时候,大家会在像StackOverflow这样的论坛上提问,寻求帮助。
在这些讨论中,其他程序员会分享他们的经验和解决方法,帮助提问者理解问题的根源,以及如何修复它。通常,大家会提供代码示例,说明如何正确使用某个功能,或者指出常见的错误。
总之,StackOverflow是一个很好的地方,可以让程序员们互相学习和解决问题,特别是对于刚入门的编程小白来说,能够从中获得很多实用的知识和技巧。
def isPrime(n):
"""Checks if 'n' is prime"""
try:
n = int(n)
except:
raise TypeError('n must be int')
# rest of code
我想到了一种方法:
from numbers import Integral
>>> blah = [1, 1.2, 1L]
>>> [i for i in blah if isinstance(i, Integral)]
[1, 1L]
补充说明(在@martineau的有见地评论后)
Python 2.7版本:
>>> map(type, [1, 1.2, 2**128])
[<type 'int'>, <type 'float'>, <type 'long'>]
Python 3.3版本:
>>> list(map(type, [1, 1.2, 2**128]))
[<class 'int'>, <class 'float'>, <class 'int'>]
这个例子依然有效,使用 isinstance(n, numbers.Integral)
这个方法更清晰明了。