2016-12-15 45 views
0

我要驗證輸入的方法:如何通過變量的「隨機」量不是所有的人都存在

def validate_user_input(*args): 
    for item in args: 
     if not re.match('^[a-zA-Z0-9_-]+$', item): 

我打電話這樣說:

validate_user_input(var1, var2, ..., var7) 

但那些是從用戶輸入生成的,其中一些可能會丟失。如果不製造大量的if語句,那麼正確的做法是什麼?

變量從一個JSON輸入分配了類似的話,和JSON的輸入可能沒有一些必要的屬性:

var1 = request.json.get('var1') 

我以爲他們是<class 'NoneType'>

這裏的錯誤:TypeError: expected string or buffer

+0

那麼,例如'var2'沒有定義?這些變量如何獲得它們的值? –

+2

當你說'失蹤'時,你的意思是'未定義'或'沒有'? – DyZ

+0

http://stackoverflow.com/questions/919680/can-a-variable-number-of-arguments-be-passed-to-a-function可能的重複。 –

回答

1

如果您request.json對象是一個字典或類似字典的,你可以只傳遞一個默認值作爲第二個參數get

+0

偉大,簡單和優雅;) – 4c74356b41

+0

或者你可以檢查「變量」是否在'request.json'中,並相應地採取行動。 – DyZ

-1

如果調用validate_user_input時某些var變量實際上可能未定義,爲什麼不將它們全部初始化(例如爲空字符串''以便y我們的正則表達式失敗了)在實際定義它們之前?

1

如果我理解正確,你由request.json.get('var_')產生var_變量,要麼返回一個字符串,你想要驗證或None,如果該字段丟失。

如果是這種情況,那麼你可以在特殊的情況下,只需添加到validate_user_inputNone值:

def validate_user_input(*args): 
    for item in args: 
     if item is None: 
      continue #this is acceptable, don't do anything with it 
     elif not re.match('^[a-zA-Z0-9_-]+$', item): 
      ... 

或者,它可能更有意義來存儲所有你感興趣的字典的值:

wanted_keys = {'var1','var2','var3'} 
    ## set intersection works in python3 
present_keys = wanted_keys & response.json.keys() 
    ## or for python 2 use a basic list comp 
#present_keys = [key for key in response.json.keys() if key in wanted_keys] 
actual_data = {key: response.json[key] for key in present_keys} 

然後,你會通過actual_data.values()作爲參數列表validate_user_input。

+0

謝謝,我可能會使用獲取變體,但是這個也是不錯的 – 4c74356b41

+0

獲取變體仍然需要在您的驗證函數中檢查'None',這是我的主要建議解決方案,字典是我如何這樣做可以讓你訪問所有的值爲'actual_data。values()'和所有以'actual_data.keys()'出現的鍵,因此它更直觀。當然,這是基於不知道代碼的其餘部分是什麼樣的;) –