在Python3.x中使用eval()计算输入时,如何避免字符串出错?

2024-04-26 07:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python 3.x,我想编写一个函数来计算输入的值并打印结果。如果字符串最初是输入的,函数应该只打印字符串而不进行求值。

def eval_input():
    line=input("Something:")
    print(eval(line))

eval_input()

它可以很好地处理整数和数学运算。 但是当一个字符串被输入时,比如“fasdfasd”,它会得到一个错误:“name 'fasdfasd' is not defined”。 我明白为什么会发生这个错误。因为“fasdfasd”被视为变量。 但我不知道如何检查字符串是否是最初输入的?

如何在计算输入之前从输入中填充字符串?


Tags: 函数字符串nameinputisdef错误eval
3条回答

好吧,作为一个回答我要把这个

try:
    print(eval(line))
except Exception as e:
    print "Something went wrong, namely: %s" % e

但是你真的不想使用eval,它的邪恶,肮脏,导致错误和安全风险,并且很难开发,调试和正确使用

如果你正在接受用户输入,假设你知道你要的是什么,应该是什么类型。你需要写一个验证器。你可以用正则表达式,或者更基本的是用“casts”,或者转换函数来实现。

例如,如果要查找整数,请使用int将其转换,并检查是否有错误。

>>> int("22")
22
>>> int("asdf")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'asdf'
>>> 

告诉用户输入一个数字。如果int函数不能解析它,它将引发ValueError,只有这样,您才能很容易地知道您得到的不是数字。

>>> try: 
...     int("asdf")
... except ValueError:
...     print("Enter a number please")
...     

对于float也可以这样做。你从input得到的总是一个str,所以如果这就是你想要的,就用它。

第一:依赖eval()很少是个好主意。

您只需捕获NameError(以及SyntaxError),并假设输入是一个字符串:

try:
    print(eval(line))
except (NameError, SyntaxError):
    print(line)

这里可能会出现其他异常,但接下来要避免使用eval()我还想提醒您不要使用毯子except:except Exception:处理程序,这些通常也是不好的主意。

更好的方法是使用^{}代替:

try:
    print(ast.literal_eval(line))
except ValueError:
    print(line)

literal_eval只接受python文本值(因此'string'123('some', 'more', [1, 2, 4.5], 'complex structure')),如果无法解析该输入,则将抛出ValueError

它没有受到eval()所遭受的安全问题的困扰,也不需要捕获那么多异常,只需要处理ValueError

相关问题 更多 >