[英]When using eval() in Python 3.x to evaluate input, how not to get an error with a string?
我正在學習Python3.x。 我想編寫一個計算輸入值並輸出結果的函數。 如果最初輸入了字符串,則該函數應僅打印該字符串而不進行評估。
def eval_input():
line=input("Something:")
print(eval(line))
eval_input()
它可以很好地處理整數和數學運算。 但是,當輸入一個字符串(如“ fasdfasd
”)時,會出現錯誤:“ name 'fasdfasd' is not defined
”。 我了解為什么會發生此錯誤。 因為“ fasdfasd
”被視為一個變量。 但是我不明白如何檢查最初是否輸入了字符串?
如何在評估輸入之前從輸入中填充字符串?
首先:依靠eval()
很少是一個好主意。
您可以簡單地捕獲NameError
(以及SyntaxError
)並假定輸入是字符串:
try:
print(eval(line))
except (NameError, SyntaxError):
print(line)
這里可能還會引發其他異常,但是接下來要避免使用eval()
我也要注意不要使用毯子, except:
或except Exception:
handler except Exception:
,通常也不是好主意。
更好的技術是改用ast.literal_eval
:
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
需要處理。
如果您要接受用戶輸入,那么大概可以知道您要輸入的內容以及輸入的類型。 您需要編寫驗證程序。 您可以使用正則表達式以文本方式執行此操作,或更基本地可以使用“ cast”或轉換函數執行此操作。
例如,如果要查找整數,請使用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
,因此,如果您要使用它,則只需使用它。
好的,我只是將其作為答案
try:
print(eval(line))
except Exception as e:
print "Something went wrong, namely: %s" % e
但是您真的不想使用eval,它的邪惡,討厭,導致錯誤和安全風險,並且難以正確開發,調試和使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.