我正在制作一个计算器,用户输入一个表达式,例如3 * 2 + 1/20,我使用eval来显示答案。
是否有一个函数可以让我在其他基础上执行相同的操作(bin,oct,hex)?
答案 0 :(得分:1)
答案 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
这更安全,因为它尊重字符串等内容。