2014-01-10 83 views
-1

用Python/PySide編寫的我的應用程序將使用用戶定義的腳本進行定製。有時候用戶只能輸入一個返回值的表達式,有時候也可以是整個腳本(即Python中常常稱爲「suite」的多語句)。我不知道他/她將選擇哪個選項。無論用戶輸入什麼內容,它都會存儲在一個字符串中,然後該字符串將被解析並執行。Python - 解析表達式或套件

是否有任何簡單的方法來檢查一個字符串是否包含python表達式或套件?我知道有parser.expr()parser.suite()compile(,,'expr')compile(,,'eval')函數,但對於這些我需要知道,如果我要解析/編譯表達式或套件。

我可以把解析操作放到try/except中,並嘗試兩種方法(如果其中一個通道那麼它是正確的),但在我看來這不是一個可行的解決方案,因爲用戶腳本可以包含任何其他語法錯誤和try/except可以將這些錯誤混入到我的表達式/套件決策邏輯中。

另一種方法是自己檢查字符串是否包含分號或換行符(當然是字符串或註釋外部),表示它是套件,但我不確定這是否足夠健壯。

是否有任何其他更簡單的方法來區分存儲在字符串中的表達式或套件?

回答

1

由於任何表達式是有效的套件,但並不是所有的套房都是有效的表情,我說你應該嘗試eval字符串作爲表達式,如果失敗,考慮exec uting它作爲套件:

try: 
    resultValue = eval(text) 
except Exception as evalProblem: 
    try: 
     exec(text) 
    except Exception as execProblem: 
     print "Problems during eval (%s) and during exec (%s)." % (
      evalProblem, execProblem) 
else: 
    print "Result of eval was:", resultValue 

我沒有看到任何問題,因爲你害怕碰到有關周圍邏輯的「混亂」。當然,每次你執行用戶提供的代碼時,用戶都會搞砸你的東西(考慮包含os.delete('/path/to/my/important/file')的字符串)。但除非有意這樣做,否則單純的錯誤不會「搞砸」任何東西。