簡體   English   中英

Python動態輸入驗證

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

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