Python 2.7和Python 3.3之间的函数类型检查

时间:2013-02-11 17:58:48

标签: python function types python-3.x python-2.7

在我的函数中,我检查输入的类型是否有效(例如 - 对于检查'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

这适用于v2.7和v3.3。 但是,如果我在Python 2.7程序中导入此函数,并为'n'输入long - 类型编号,如下所示:isPrime(123456789000),它显然会引发TypeError,因为' n'属于long类型,而非int

那么,如何检查longint的v2.7和v3.3的有效输入?

谢谢!

3 个答案:

答案 0 :(得分: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)但更加连贯。

答案 1 :(得分:0)

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

答案 2 :(得分:-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。