반응형

클로저, 람다를 이용한  validator 파이썬 예제

 

def create_validator(rule):
    """
    유효성 검사 규칙 (rule)에 따라 검사 함수 (클로저)를 생성하는 함수

    Args:
        rule: 유효성 검사 규칙 (문자열, 딕셔너리 등)

    Returns:
        function: 유효성 검사 함수 (클로저)
    """

    if isinstance(rule, str):
        # 문자열 규칙
        if rule == "integer":
            return lambda x: isinstance(x, int)
        elif rule == "email":
            import re
            email_regex = r"[^@]+@[^@]+\.[^@]+"  # 간단한 이메일 정규 표현식
            return lambda x: re.match(email_regex, x) is not None
        # 추가적인 규칙 (문자열 길이, 특정 문자 포함 여부 등)
        elif rule.startswith("length"):
            length = int(rule.split(":")[1])
            return lambda x: len(x) == length
    elif isinstance(rule, dict):
        # 딕셔너리 규칙 (여러 규칙 조합)
        validators = []
        for key, sub_rule in rule.items():
            validator = create_validator(sub_rule)  # 재귀 호출
            validators.append(lambda x: validator(x.get(key))) # 람다 함수 내에 get method를 활용하여 key값 접근
        return lambda x: all(v(x) for v in validators)  # 모든 규칙 만족해야 True

    return lambda x: False  # 기본적으로 False 반환


# 정수 검사 함수(클로저) 생성
is_integer = create_validator("integer")

# 이메일 검사 함수(클로저) 생성
is_email = create_validator("email")

# 특정 길이 문자열 검사 함수(클로저) 생성
is_length_8 = create_validator("length:8")

# 복합 규칙 검사 함수(클로저) 생성 (이름은 8자 이상, 이메일 형식)
is_valid_user = create_validator({
    "name": "length:8",
    "email": "email"
})

# 테스트
print(is_integer(10))      # True
print(is_integer("abc"))   # False
print(is_email("test@test.com"))  # True
print(is_email("test"))     # False
print(is_length_8("12345678")) # True
print(is_length_8("1234"))   # False
print(is_valid_user({"name": "abcdefgh", "email": "test@test.com"})) # True
print(is_valid_user({"name": "abcd", "email": "test@test.com"}))  # False
반응형

+ Recent posts