반응형
클로저, 람다를 이용한 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
반응형
'Python 기초' 카테고리의 다른 글
파이썬, groupby (from itertools) 예제 (0) | 2025.02.05 |
---|---|
파이썬, 랜덤 값 다양한 기능 예제 (0) | 2025.01.26 |
파이썬, 유용한 다섯 가지 데코레이터 (0) | 2025.01.20 |
파이썬, f 문자열 기초와 활용 예제 (0) | 2025.01.18 |
파이썬, 비밀번호가 문자/숫자/특수문자 조합이고 8자리 이상 검증 (0) | 2025.01.06 |