确定Python数字文字所代表的数字的种类(int,float)?

时间:2012-08-08 22:23:30

标签: python tokenize standard-library number-literal

如果有人有兴趣,这是Regular expression to match a Python integer literal的后续内容。

tokenize模块对于拆分Python表达式非常有用,但tokenize.NUMBER不具有表现力,因为它表示各种数字文字,例如1,{{ 1}}(在Python 2中),1l0xf21e-101.10b1010o17都被视为NUMBER(以及所有以前的大写字母)。标准库中是否有一个函数告诉我上面的内容是什么?我特别关心如果我有一个整数或浮点数(复数也被认为是浮点数),但进一步的表现力也可以:)。基本上,我不想尝试自己捕获所有可能的数字文字,因为我已经设法做错了一次。

3 个答案:

答案 0 :(得分:3)

您可以使用ast.literal_eval将任何Python数字格式解析为int,float或long:

>>> ast.literal_eval('1')
1
>>> ast.literal_eval('1l')
1L
>>> ast.literal_eval('0x2')
2
>>> ast.literal_eval('0b1101')
13

请记住Python中没有'hex'或'oct'或'bin'类型。这些文字字符串会立即转换为它们的十进制等值。

这非常有效:

def numtype(s):
    numtypes=[int,long,float,complex]

    try:
        n=ast.literal_eval(s)
    except SyntaxError:
        return None

    if type(n) not in numtypes:
        return None  
    else:
        return type(n)    

for t in ['1','0x1','0xf2','1e-10','0o7','1j', '0b1101']:
    print t, numtype(t)              

打印:

1 <type 'int'>
0x1 <type 'int'>
0xf2 <type 'int'>
1e-10 <type 'float'>
0o7 <type 'int'>
1j <type 'complex'>
0b1101 <type 'int'>

如果你真的需要区分不同的小数类型,你可以这样做:

def numtype(s):
    numtypes=[int,long,float,complex]

    try:
        n=ast.literal_eval(s)
    except SyntaxError:
        return None

    if type(n) not in numtypes:
        return None    

    if type(n) != int:
        return type(n)
    else:
        if 'x' in s.lower():
            return 'HEX'
        if 'o' in s.lower():
            return 'OCT'   
        if 'b' in s.lower():
            return 'BIN'     

        return int

答案 1 :(得分:2)

可能ast.literal_eval

type(ast.literal_eval(s))

答案 2 :(得分:0)

def is_int(number_string):
    try:
        i = int(number_string)
    except ValueError:
        return False
    return True