簡體   English   中英

在Python 3.x中使用eval()評估輸入時,如何不出現字符串錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM