Python 2.7 和 Python 3.3 中函数的类型检查

1 投票
3 回答
1466 浏览
提问于 2025-04-17 15:31

在我的函数里,我会检查输入的类型,以确保它是有效的(比如说,对于一个检查数字'n'是否为质数的函数,我不希望'n'被输入为字符串)。

问题出现在检查longint类型的时候。在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中对于longint都是有效的呢?

谢谢!

3 个回答

-2

来自: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类型。

0

在编程中,有时候我们会遇到一些问题,想要找到解决方案。比如,有人可能在使用某个工具或库时,遇到了错误或者不明白的地方。这时候,大家会在像StackOverflow这样的论坛上提问,寻求帮助。

在这些讨论中,其他程序员会分享他们的经验和解决方法,帮助提问者理解问题的根源,以及如何修复它。通常,大家会提供代码示例,说明如何正确使用某个功能,或者指出常见的错误。

总之,StackOverflow是一个很好的地方,可以让程序员们互相学习和解决问题,特别是对于刚入门的编程小白来说,能够从中获得很多实用的知识和技巧。

def isPrime(n):
    """Checks if 'n' is prime"""
    try:
        n = int(n)
    except:
        raise TypeError('n must be int')
    # rest of code
7

我想到了一种方法:

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) 这个方法更清晰明了。

撰写回答