PYTHON · 함수형
모나드 패턴
모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.
함수형고급monad모나드Maybe함수형
핵심 설명
모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.
Python code
from typing import TypeVar, Callable, Optional, Generic
T = TypeVar("T")
U = TypeVar("U")
class Maybe(Generic[T]):
"""None을 안전하게 처리하는 Maybe 모나드"""
def __init__(self, value: Optional[T]):
self._value = value
@classmethod
def of(cls, value: T) -> "Maybe[T]":
return cls(value)
def bind(self, func: Callable[[T], "Maybe[U]"]) -> "Maybe[U]":
if self._value is None:
return Maybe(None)
return func(self._value)
def map(self, func: Callable[[T], U]) -> "Maybe[U]":
if self._value is None:
return Maybe(None)
return Maybe(func(self._value))
def or_else(self, default: T) -> T:
return self._value if self._value is not None else default
def __repr__(self):
return f"Maybe({self._value!r})"
# 안전한 딕셔너리 접근
def safe_get(d, key):
return Maybe(d.get(key))
data = {"user": {"address": {"city": "서울"}}}
result = (
Maybe.of(data)
.bind(lambda d: safe_get(d, "user"))
.bind(lambda d: safe_get(d, "address"))
.bind(lambda d: safe_get(d, "city"))
.map(str.upper)
.or_else("Unknown")
)
print(result) # 서울 → SEOUL학습 팁
Maybe 모나드는 중첩된 if x is not None: 체크를 우아하게 대체합니다.
주의할 점
모나드 패턴을 남용하면 Python의 관용적 스타일과 맞지 않아 다른 개발자가 이해하기 어려워집니다.
자주 묻는 질문
모나드 패턴란 무엇인가요?
모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.
모나드 패턴 학습 시 주의할 점은 무엇인가요?
모나드 패턴을 남용하면 Python의 관용적 스타일과 맞지 않아 다른 개발자가 이해하기 어려워집니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.