這不是“奇技淫巧” – Python中將字串編譯成表示式執行的方法和使用場景

channingbj發表於2019-02-16

Python的自帶函式 eval 提供了一個非常有趣的特性,可以將給一個字串當做一個表示式去執行。先上一個例子:

cond = compile(`succ_rate<99`,`<string>`,`eval`)
succ_rate = 100
print(eval(cond))

上面這段程式碼執行結果是 True

表示式執行所需的引數如果不想硬編碼,也可以通過一個字典傳遞進去:

cond = compile(`succ_rate<99`,`<string>`,`eval`)
data={`succ_rate`:100}
print(eval(cond,data))

看到這裡大家可能會有疑問,這種“奇技淫巧”到底有什麼用,表示式都是靜態程式碼直接正常寫不就行了麼?實際上在大型的系統中經常會有“配置中心”之類的模組,這種模組通常是為了能夠在程式碼不需要上線的情況下提供動態改變一些判斷邏輯的功能,邏輯簡單並且改動頻繁的業務判斷可以通過這種動態的方式來進行實現。

例如一個功能的上線以後需要篩選一部分手機裝置進行逐步開啟功能開關,第一批可能會提供一批裝置的機型列表進行開啟,隨後過幾天會在這個基礎上增加作業系統版本號的判斷,再過一段時間以後會去掉機型的限制轉而根據CPU型號進行判斷等等。對於這種純體力活,我們可以將表示式儲存在資料庫中,需要判斷的時候準備好引數 eval 一下即可,達到不需要上線程式碼就能完成需求的目的,甚至還可以將許可權下放給產品同學自行控制。

另外一個非常適合的應用場景是可以用來實現簡單的規則引擎,規則引擎的判斷邏輯可以完全用python的表示式進行書寫,可讀性會比自己建立一種描述規則好很多,也能降低學習成本。例如這種伺服器自助運維的運維任務中 criteria 的定義和判斷:

criteria: succ_rate<99 and succ_rate>50
action: "service xxx restart"

相關文章