[英]Python dynamic input validation
我有一個看起來像這樣的控件結構:
entries = [
{'sql_col' : 'name', 'display_text' : 'Enter your name: '},
{'sql_col' : 'email', 'display_text' : 'Enter your email: '},
{'sql_col' : 'zip', 'display_text' : 'Enter your Zip Code: '},
]
entries
列表中的每個條目都代表一個文本框,用戶將在其中填寫一個對話框。 我希望能夠為該結構內的每個輸入指定一個驗證函數,即:
entries = [
{'sql_col' : 'name', ... , 'validate' : lambda x: return is_name_valid(x)},
{'sql_col' : 'email', ... , 'validate' : lambda x: return is_email_valid(x)},
...
]
問題是我無法弄清楚用於此類內容的正確語法。 我的entries
語法正確嗎? 我該如何在代碼的后面部分調用驗證函數,並將用戶輸入作為參數傳遞給它?
另外,最好的答案是我不需要安裝任何新模塊的答案-我在用於進行任何安裝的系統上沒有足夠的特權。
問題是我無法弄清楚用於此類內容的正確語法。 我的輸入語法正確嗎?
你試過了嗎? 您收到的錯誤消息應立即告訴您它不是,並指出出現問題的地方,並向希望幫助您解決問題的讀者提供提示:
{'sql_col' : 'name', 'validate' : lambda x: return is_name_valid(x)},
^
SyntaxError: invalid syntax
問題在於, lambda
不允許語句,僅允許表達式,而return
是語句。 您不需要在lambda
return
,因為它會自動返回表達式計算得出的結果。 所以:
{'sql_col' : 'name', 'validate' : lambda x: is_name_valid(x)},
但是,值得指出的是, lambda x: foo(x)
作用與傳遞foo
本身完全相同,只是更加冗長和緩慢。 因此,更好:
{'sql_col' : 'name', 'validate' : is_name_valid},
我該如何在代碼的后面部分調用驗證函數,並將用戶輸入作為參數傳遞給它?
您可以像訪問dict的其他任何成員一樣來訪問它-它並不偶然是函數,因為就Python而言,函數完全是正常值。
而且您將其稱為與調用任何其他函數相同—沒關系,它是一個表達式,而不是文字名稱,因為就Python而言,求值函數(或其他可調用對象)的表達式是完全正常的可調用對象被關注到。
所以:
if entry['validate'](value):
print('Good value!')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.