检查Python 2.7和3.x中的变量是int还是long

Check whether variable is int or long in Python 2.7 and 3.x

我想对在Python2.7及更高版本中工作的API函数进行输入类型检查。API的参数为epoch以来的时间戳(毫秒)。我需要确保输入是正数。

根据值的不同,python 2.7将时间戳表示为integerlong。所以类型检查如下:

1
isinstance(timestamp, (int, long))

但是,对于python 3,long类型与int类型合并。实际上,long类型不再存在。所以上面这一行会导致一个异常。相反,支票应该是这样的:

1
isinstance(timestamp, int)

为了与python 2.7兼容,我尝试将时间戳强制转换为int。但是,如果值不在integer范围内,则强制转换操作仍返回long。这意味着在Sun Jan 25 1970 20:31:23之后,任何时间戳的检查都将失败。另请参阅此问题的答案。

在这两个版本的python中,什么是使这一检查成为通用检查的最佳方法?


检查任何整数,使用numbers.Integral

1
isinstance(timestamp, numbers.Integral)

或者遵循这个关于python 2-3兼容代码的练习表

只需安装future包:pip install future

1
2
3
4
5
6
7
# Python2
>>> x = 9999999999999999999999L
>>> isinstance(x, int)
False
>>> from builtins import int
>>> isinstance(x, int)
True


借用six包:

1
2
3
4
5
6
7
8
9
10
import sys

PY3 = sys.version_info[0] == 3

if PY3:
    integer_types = (int,)
else:
    integer_types = (long, int)

long_type = integer_types[0]

然后你可以查一下

1
if isinstance(value, integer_types):

和铸造

1
value = long_type(value)


如果要检查变量类型是否完全等于Intgiven,只需使用type()函数:

1
2
3
4
5
import sys
if sys.version_info >= (3,0):
    long = int

type(v) in (int, long)


1
2
3
4
5
6
7
# This will works in both Python2, Python3
# Just check type of the variable and compare
import time
timestamp = time.time()

type(timestamp) == int
type(timestamp) == float