기본 패턴
python
def log_call(func):
def wrapper():
print("called")
return func()
return wrapper
@log_call
def hello():
print("hello")설명
- decorator는 함수를 입력으로 받아, 기능이 확장된 새 함수를 돌려주는 패턴입니다.
- 로깅, 권한 검사, 캐싱, 시간 측정처럼 "기존 함수 전후에 공통 동작을 덧붙이는" 상황에 잘 맞습니다.
@name문법은 "이 함수를 해당 decorator로 감싼다"는 뜻으로 읽으면 됩니다.- 처음에는 문법이 낯설지만, 결국 함수도 값이라는 Python 특징의 응용이라고 볼 수 있습니다.
짧은 예제
python
def emphasize(func):
def wrapper():
return f"**{func()}**"
return wrapper
@emphasize
def greet():
return "hello"빠른 정리
| 요소 | 역할 |
|---|---|
| decorator 함수 | 다른 함수를 받아 감쌈 |
| wrapper | 실제 확장 동작 수행 |
@decorator | 적용 문법 |
| 공통 처리 | 로깅, 검증, 측정 등에 유용 |
공식 참고: Glossary: decorator, functools
주의할 점
decorator는 강력하지만 함수 흐름을 한 번 더 감추기 때문에 남용하면 읽기가 어려워집니다. 공통 처리 패턴이 반복될 때 명확한 이름의 decorator로 쓰는 편이 좋습니다.