2024-04-19 21:47:09 发布
网友
我在做一个计算器,用户输入一个表达式,比如3*2+1/20,我用eval来显示答案。你知道吗
是否有一个函数允许我在其他基(bin、oct、hex)中执行相同的操作?你知道吗
否;eval用于解析Python和the base of numbers in Python code is fixed。你知道吗
eval
如果您坚持使用这个方法,您可以使用regex replace以0x作为数字的前缀,但是最好构建一个解析器,利用int(string, base)来生成数字。你知道吗
0x
int(string, base)
如果您真的想沿着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
这样更安全,因为它尊重字符串之类的东西。你知道吗
如果它们以十六进制、二进制等形式输入值,eval将工作:
eval("0xa + 8 + 0b11") # 21
不过要小心,eval can be dangerous。你知道吗
否;
eval
用于解析Python和the base of numbers in Python code is fixed。你知道吗如果您坚持使用这个方法,您可以使用regex replace以
0x
作为数字的前缀,但是最好构建一个解析器,利用int(string, base)
来生成数字。你知道吗如果您真的想沿着Python的路线走下去,下面是一个基于令牌的转换:
这样更安全,因为它尊重字符串之类的东西。你知道吗
如果它们以十六进制、二进制等形式输入值,eval将工作:
不过要小心,eval can be dangerous。你知道吗
相关问题 更多 >
编程相关推荐