함수 호출을 감싸 공통 동작을 재사용합니다.
데코레이터는 함수를 받아 새 함수를 반환하며 @문법으로 적용합니다. 권한 검사, 측정, 재시도처럼 여러 함수 호출 전후에 같은 동작을 넣을 때 사용합니다. functools.wraps로 원래 함수의 이름과 문서를 보존합니다.
@trace가 add를 wrapper로 바꿔 놓기 때문에 add(3, 4)를 부르면 wrapper가 먼저 add 시작을 출력하고, 원래 함수를 실행한 뒤 add 완료를 출력합니다. 반환된 7은 그다음 바깥 print로 전달되어 결과: 7이 마지막 줄에 나옵니다. wrapper가 *args와 **kwargs를 그대로 넘기므로 인수 개수가 다른 함수에도 같은 데코레이터를 붙일 수 있습니다.
인수를 받는 데코레이터는 데코레이터 팩토리, 실제 데코레이터, 래퍼의 세 단계가 됩니다. 실행 시점과 감싸는 순서를 천천히 추적하세요.
비즈니스 로직이 데코레이터에 과도하게 숨지 않게 하고 인증과 트랜잭션 경계는 실패 동작을 명확히 문서화합니다.
wraps를 빼면 디버깅과 문서 도구에서 모든 함수 이름이 wrapper로 보일 수 있습니다.
직접 바꿔보세요호출 횟수를 세어 출력하는 데코레이터로 확장하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.