2012-03-02 9 views
0

를 호출하는 동안 다음 추가 인수를 추가 I라는 맵이 같은 함수에 문자열을 매핑이 : 나는 유형에 따라 해당 유효성 검사 함수를 호출 할 필요가그것으로 인수 함수 포인터를 보내고

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 

최대-렌

는 문자열을 기반으로, 그래서 나는 64 자와 256 자와 성을 말할와 FIRST_NAME에 대한 validate_str 호출 할 필요가 다를 수 있습니다.

다른 필드를 사용하여이 필드에 max_len이 있다고 말할 수는 있지만 validator_str 함수에 대한 포인터를 필드에 기반하여 미리 설정된 max-len 인수와 함께 사용할 수 있습니까?

뭔가 같은 :

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. 

이것은 우리가 다음 필드는 최대-렌이 함께 전송해야합니다 것을 다시 기억하지 않아도 있도록 쉽게 생활을하게 그것으로.

+0

오타가 발생할 수 있습니다 :'validate'는'validator'를 의미합니까? '요소 '란 무엇입니까? 'first_name','last_name' 또는 사전과 같은 문자열 목록 인 것 같습니다. – ninjagecko

+0

실수를 수정했습니다. 지적 해 주셔서 감사합니다. –

+0

문제 없습니다. 'element '를 사전'data = {'first_name ':'Bob ','last_name ':'Bobley ','phone ': 1234567890}'으로 만들고 data.items()의 필드, : validator가 아닌 경우 [field] (value) : ...'. 훨씬 더 깨끗하게 읽습니다. – ninjagecko

답변

3

당신은 하나 개의 인자의 기능을 (문자열 유효성을 검사) 만들 수 람다를 사용하지만에 내에서 정의 된 길이가 수 :

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

챔피언처럼 일합니다. 당신에게 좋은 점 :-) –

+2

이것은 OP가 찾고 있던 두 가지 대답 중 하나입니다. 참고로 람다를 사용하여 함수를 카레합니다. – ninjagecko

0

이 작업을 수행하는 두 가지 방법이있다합니다.

구체적으로 묻는 답변은 카레를 칠하는 방법입니다 (Scott Hunter가 대답).

또 다른 방법은 같은 폐쇄의 사용자 정의 매개 변수를 캡처하는 기능을 반환하는 함수 공장 ("고차 기능")을 사용하는 것입니다 그러나 일반적으로

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

을, 이 시스템에 자신을 제한하면 필드간에 "교차 절단"유효성 검사가 수행되지 않습니다. 예를 들어 필드가 각각 birthday_day, birthday_month, birthday_year 인 경우 개별적으로 30 일인지 31 일인지를 개별적으로 확인할 수 있지만 어느 달 (2 월에 윤년을 계산할지)을 결정하기 위해 해당 달을 알지 못합니다.

그러나 개인적으로이 시스템을 수시로 개인적으로 사용합니다. 그러한 요구가 발생하면 나중에 복잡한 시스템으로 현재 시스템을 보완 할 수 있습니다.

+0

감사합니다. 이것은 잘 작동합니다 .. :-) –