2012-03-02 9 views
0

我有一個地圖,說一個字符串映射到像一個函數:發送函數指針與它的參數,然後添加額外的參數,同時調用

validator = {'first_name' : validate_str, 
      'last_name' : validate_str, 
      'phone' : validate_phone } 

我需要根據類型調用相應的驗證功能我在地圖上的價值,這些價值將作爲例如我的輸入提供給我

for name in elements: 
    # Validate the value of this name in the input map using the function 
    # input is the map that has the value for each of these fields 
    # elements is a list of all fields used to loop through one input at a time 
    if validator[name](input[name]) is False: 
     # Throw validation error 
    else: 
     # Do something else 

除非這種情況下,我不知道這是否可以做到這工作得很好:

的validate_str還檢查給定的字符串是所需的最大長度。

def validate_str(str, max-len): 
    # Throw error if len(str) > max-len 

最大-LEN會有所不同基於字符串,所以我需要調用validate_str爲FIRST_NAME有說64個字符,並與256個字符的姓氏。

我可以使用一個不同的地圖來說這個字段有這個max_len,但是驗證器映射有可能指向帶有根據字段預設的max-len參數的validate_str函數嗎?

類似:

validator = {'first_name' : validate_str(max-len=64), 
      'last_name' : validate_str(max-len=256), 
      'phone' : validate_phone } 

然後調用它進行驗證,如:

if validator[name](str=input[name]) is False: 
    # The appropriate value for max-len goes with the function call and just the 
    # str is appended to the argument list while invoking. 

這使生活更輕鬆,使我們不必再記住再次哪些領域將有MAX-LEN一起發送用它。

+0

可能的拼寫錯誤:通過'validate'你的意思'validator'?什麼是「元素」?它似乎是一個像「first_name」,「last_name」或字典這樣的字符串列表。 – ninjagecko 2012-03-02 00:26:37

+0

更正了錯誤..謝謝指出。 – 2012-03-02 00:29:50

+0

沒問題。你可能會從'elements'字典獲得好處'data_name {'first_name':'Bob','last_name':'Bobley','phone':1234567890}'並且在字段data_item() :如果不是驗證器[field](value):...'。閱讀更乾淨。 – ninjagecko 2012-03-02 00:35:38

回答

3

你可以使用lambda來創建一個參數的函數(字符串被驗證),但具有內定義的長度:

{'first-name':lambda x: validate-str(x, 64), ... 
+0

像冠軍一樣工作..給你的榮譽:-) – 2012-03-02 00:26:52

+2

這是OP正在尋找的兩個答案之一。作爲參考,這是使用lambda來咖喱一個函數。 – ninjagecko 2012-03-02 00:28:11

0

有兩種方法可以做到這一點。

你特別要求的答案是如何討好它(斯科特獵人回答)。

另一種方式是使用一個函數工廠(「高階函數」)返回,其捕獲在封閉的自定義參數,例如一個函數:

def makeStringValidator(maxLength=64): 
    def validator(string): 
     return len(string)<maxLength 
    return validator 

然而,通常限制自己到這個系統可以防止你在域之間進行「交叉」驗證。例如,如果你有場birthday_day, birthday_month, birthday_year作爲單獨的領域,你可以單獨確認說,每一天是30或31,但不知道一個月,以確定哪些(也飛躍天,2月)。

但是我個人使用這個系統不時。如果出現這種需求,您可以在稍後更加複雜的情況下補充現有系統。

+0

謝謝!這工作也很好.. :-) – 2012-03-02 00:43:27