我需要將不等式傳遞給函數進行評估。如果作爲字符串傳遞,是否有評估不平等的方法?還是必須傳遞一個不等式的表示並使用if/else語句來生成符號?Python:在字典中傳遞不等式作爲字符串用於評估
回答
你的問題有點含糊,但它聽起來像是要計算包含表達式的字符串(如x > 5
)。而不是這樣做,這是不必要的複雜,並可能是一個安全隱患,只需定義一個函數,無論是傳統的方式或使用lambda。
def gt5(x):
return x > 5
或
gt5 = lambda x: x > 5
這些都是等效;現在你可以繞過gt5
,只要你喜歡,並在時機成熟時,你只需把它
y = 6
if gt5(y):
...
由於Gerrat's回答表明,該operator模塊也可以是這樣的事情很有用。
既然我知道你正在處理用戶字符串,我肯定會建議創建一個將字符串映射到函數的字典。 (也許這就是你的標題中的含義?)將用戶字符串傳遞到getattr
似乎在很多方面都很糟糕。如果你想添加一個不符合operator
屬性的字符串,會發生什麼?如果用戶傳遞一個對應於私有屬性的字符串會發生什麼?最好創建一個將字符串映射到函數的自定義字典。字典允許你指定你想接受的字符串。
func_dict = {
'lt' : operator.lt,
'gt' : operator.gt,
'nand' : lambda x, y: not (x and y)
}
你仍然可以保存自己使用getattr
+ operator
建立從要接受字符串列表的字典工作。喜歡的東西:
func_dict = dict((s, getattr(operator, s)) for s in ['lt', 'gt'])
像這樣然後更新func_dict
:
custom_dict = {
'nand' : lambda x, y: not (x and y)
}
func_dict.update(custom_dict)
從那裏,你可以很容易地調用函數在字典像這樣:
>>> func_dict['lt'](5, 7)
True
這是一個很好的解決方案。在你的建議中,你是否還假設用戶在映射到處理端函數的接口中傳遞了一個字符串?即func_dict存在於處理端? –
@ strimp099,好吧,我假設這是一個最終用戶界面,而不是API或類似的東西。所以,假設是,'func_dict'住在處理端;用戶輸入一個字符串,然後將該字符串傳遞給func_dict以查找要執行的函數。 (但是,只要用戶傳入字符串,或者晚得多,這種情況就會發生 - 不管你的情況是否合理)。如果這是庫模塊的接口或類似的東西,那麼可能不需要根本不使用字符串;你可以接受任何功能。 – senderle
對,我用你的解決方案,這是完美的,謝謝。 –
你可以使用operator
模塊,並通過其上的適當的方法:
import operator
def check(op, a, b)
return op(a,b)
op = operator.ne
check(op, 2,3)
>>> True
我結束了向函數傳遞字符串lt,le,eq,ge或者gt,然後調用完美工作的fcn = getattr(operator,'le')。感謝您的迴應。 –
@ strimp099:那麼爲什麼你首先傳遞一個字符串呢?只需傳遞'operator.lt'等。 –
在界面級別的用戶正在傳遞參數,所以我想讓它更清潔。如果有提高速度,我會考慮,現在我正在測試。好主意,謝謝。 –
- 1. 字典(字符串,字符串)無法評估表達式
- 2. Python字符串替換子字符串(評估字符串字典)
- 3. Python懶惰字典評估
- 4. 評估字典
- 5. Python字符串不等於
- 6. 用於評估字符串的NSPredicate
- 7. 將字符串數組用於評估
- 8. 爲什麼這些字符串被評估爲不相等?
- 9. 評估字符串arrayName中
- 10. 傳遞字符參數並評估
- 11. 在Python中評估布爾表達式作爲字符串的更快方法
- 12. 從Python字典中評估函數
- 13. 將Perl字符串評估爲零僅適用於數字
- 14. 如何評估一個函數傳遞的字符串在C#
- 15. 如何評估字符串值作爲excel公式的字符串值
- 16. 評估沒有評估的字符串:Python
- 17. 在字符串中傳遞位置作爲字符串
- 18. 評估布爾字符串表達式?
- 19. 如何評估字符串?
- 20. Excel VBA字符串評估
- 21. Clojure宏字符串評估
- 22. 評估字符串模板
- 23. 從字符串評估Typescript?
- 24. Javascript字符串評估
- 25. 如何評估連接字符串作爲公式?
- 26. 評估,如果變量名等於字符串
- 27. 在Android Studio中評估字符串
- 28. 將用戶的評論作爲字符串傳遞給java bean
- 29. 在J中評估一個字符串作爲動詞
- 30. 如何在Nant中評估字符串作爲屬性名稱?
你是什麼意思「評估不等式」?你能舉個例子嗎? –