2013-02-11 98 views
1

在我的函数中,我检查输入的类型以使其有效(例如 - 对于检查'n'的素数的函数,我不想'n'作为一个字符串输入)。 问题发生在检查long s和int s。 在Python 3.3,他们删除long型数,故有此问题发生:在Python 2.7和Python 3.3之间的函数中检查类型

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

那么,我该如何检查是否对于v2.7和v3.3是否为long s和int s的有效输入?

谢谢!

+0

你的意思是'isPrime(123456789000L)'? – 2013-02-11 18:08:06

+0

@DavidRobinson'isPrime(123456789000L)'和'isPrime(123456789000)'基本上是一样的:'isinstance(123456789000L,int)'和'isinstance(123456789000,int)'都返回False。 – 2013-02-11 18:09:36

+0

关于什么版本的Python? 'isinstance(123456789000,int)'在Python 2.6和Python 2.7中为我返回'True'。 – 2013-02-11 18:11:00

回答

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),但表示更加连贯。

+0

这是你应该这样做的* only *方法。 – 2013-02-11 18:10:18

+0

在Python 3中,我得到一个无效的语法错误,指向'blah = [1,1.2,1L]'中的'L'。 – martineau 2013-02-11 18:37:06

+0

@martineau这很有道理......因为Py3中没有'long'类型。这是为了演示使用Py2.7(或者实际上来自2.6),可以使用'Integral'作为'int'和'long'或者只是'int' ... – 2013-02-11 18:46:52

-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

这与OP要求的内容完全相反。 – 2013-02-11 19:44:09

+0

在这种情况下,不会使用int(n)将输入转换为int吗?而不是TypeError,ValueError可以通过返回。 – shantanoo 2013-02-11 20:01:52

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

将字符串转换成类似数字的形式,而不仅仅是进行类型检查 - >不是操作者想要的,或者一个好主意。 – 2013-02-12 03:40:48