2017-05-13 1 views
1

나는 두 개의 키 이상을 가지고있을 때 (사전 객체를 통해) 함수에 도착하는 매개 변수의 유효성을 검사하기 위해 데코레이터를 사용하고 있습니다. 하지만 키가 있으면 오류 (check_person)가 반환됩니다. 작동하려면파이썬 장식 자 유효성 검사

if _NAME in json_request: 
     return True 
    return False 

: I가 check_person을 변경해야

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 

: 나는 내 문제를 예시하기 위해이 개 기능을 정의했다.

내가하려고하면 :

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'입니다.