2017-05-13 120 views
1

我使用裝飾器來驗證參數到達我的功能(通過字典對象),當我有2個或更多的鍵時,它工作正常。但是,如果我只有密鑰它會返回一個錯誤(check_person)。我定義2個函數來舉例說明我的問題:Python裝飾器驗證

def required(**mandatory): 
     """ 

     :param mandatory: 
     :return: 
     """ 

     def decorator(f): 
      @wraps(f) 
      def wrapper(**dicts): 
       for argname, d in dicts.items(): 
        for key in mandatory.get(argname, []): 
         if key not in d: 
          raise Exception('Key "%s" is missing from argument "%s"' % (key, argname)) 
       return f(**dicts) 
      return wrapper 
     return decorator 

@required(json_request=(_PROVIDER, _REPORT)) 
def check_campaign(json_request): 
    """ 

    :param json_request: 
    :return: 
    """ 

    return True 

@required(json_request=(_NAME)) 
def check_person(json_request=None): 
    """ 

    :param json_request: 
    :return: 
    """ 
    return True 

我需要改變check_person到:

if _NAME in json_request: 
     return True 
    return False 

要使它發揮作用。

當我嘗試:

self.assertTrue(validator.check_person(json_request=json.loads("""{"name": "Elon Musk"}"""))) 

或具體爲:

{"name": "Elon Musk"} 

我得到:

Error 
Traceback (most recent call last): 
    File "/Users/spicyramen/Documents/OpenSource/Development/Python/gonzo/utils/validate/validator_test.py", line 46, in test_person 
    self.assertTrue(validator.check_person(json_request=json.loads("""{"name": "Elon Musk"}"""))) 
    File "/Users/spicyramen/Documents/OpenSource/Development/Python/gonzo/utils/validate/validator.py", line 26, in wrapper 
    raise Exception('Key "%s" is missing from argument "%s"' % (key, argname)) 
Exception: Key "n" is missing from argument "json_request" 

在我的字典裏有超過1個鍵,它工作正常(像check_campaign) 。

回答

1

這個問題是一個微妙的語法區分。

隨着@required(json_request=(_PROVIDER, _REPORT)),您的請求是一個元組:(_PROVIDER,_REPORT)。

相比之下,在您的失敗示例@required(json_request=(_NAME))中,請求僅爲值_NAME。要使它成爲一個元組,請添加逗號:@required(json_request=(_NAME,))。那應該解決你所有的麻煩。


至於爲什麼你得到確切錯誤,你遍歷說法。當它是一個元組時,它可以按需要工作。當它是一個字符串時,迭代它會得到每個字母。這就是爲什麼'n'丟失的原因:這是'name'的第一個字母。