0

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

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

eval_input()

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

如何在评估之前从输入中填充字符串?

4

3 回答 3

9

第一:依靠 eval().

您可以简单地捕获NameErrorSyntaxError以及)并假设输入是一个字符串:

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

这里可能还有其他例外情况,但接下来为了避免使用eval()我还想警告不要使用毯子except:except Exception:处理程序,这些通常也不是好主意。

更好的技术是使用ast.literal_eval

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

literal_eval仅接受 python 文字值(so 'string'or 123or ),如果无法解析该输入('some', 'more', [1, 2, 4.5], 'complex structure'),将抛出 a 。ValueError

没有遭受的安全问题eval(),也不需要捕获尽可能多的异常,只ValueError需要处理即可。

于 2013-01-10T12:38:36.907 回答
2

如果您正在接受用户输入,那么您大概知道您要的是什么以及它应该是什么类型。你需要写一个验证器。您可以使用正则表达式以文本方式执行此操作,或者更基本地使用“强制转换”或转换函数。

例如,如果您要查找整数,请使用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 ,并且只有 that ,因此您可以轻松地判断您得到的不是数字。

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

您可以对float. 你得到input的总是一个str,所以如果这是你想要的,那就使用它。

于 2013-01-10T12:56:38.183 回答
0

好的,只是作为一个答案,我将把这个

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

但是你真的不想使用 eval,它的邪恶、讨厌、会导致 bug 和安全风险,并且很难开发、调试和正确使用

于 2013-01-10T12:38:27.010 回答