如何评估其他基础中的表达式?

时间:2014-09-17 02:51:46

标签: python tkinter calculator

我正在制作一个计算器,用户输入一个表达式,例如3 * 2 + 1/20,我使用eval来显示答案。

是否有一个函数可以让我在其他基础上执行相同的操作(bin,oct,hex)?

2 个答案:

答案 0 :(得分:1)

如果他们输入十六进制,二进制等值,eval将起作用:

eval("0xa + 8 + 0b11")
# 21

请注意,eval can be dangerous

答案 1 :(得分:0)

没有; eval用于解析Python和the base of numbers in Python code is fixed

如果您坚持使用此方法,则可以使用正则表达式替换为0x前缀数字,但最好使用int(string, base)来生成解析器来生成数字。< / p>

如果你真的想沿着Python路线前进,这里是一个基于令牌的转换:

import tokenize
from io import BytesIO

def tokens_with_base(tokens, base):
    for token in tokens:
        if token.type == tokenize.NUMBER:
            try:
                value = int(token.string, base)
            except ValueError:
                # Not transformable
                pass
            else:
                # Transformable
                token = tokenize.TokenInfo(
                    type   = tokenize.NUMBER,
                    string = str(value),
                    start  = token.start,
                    end    = token.end,
                    line   = token.line
                )

        yield token

def python_change_default_base(string, base):
    tokens = tokenize.tokenize(BytesIO(string.encode()).readline)
    transformed = tokens_with_base(tokens, base)
    return tokenize.untokenize(transformed)

eval(python_change_default_base("3*2+1/20", 16))
#>>> 6.03125

0x3*0x2+0x1/0x20
#>>> 6.03125

这更安全,因为它尊重字符串等内容。