기본 데코레이터 이해하기
이 단계에서는 데코레이터의 개념과 기본적인 사용법을 소개합니다. 데코레이터는 다른 함수를 인수로 받아 일부 기능을 추가하고 또 다른 함수를 반환하는 함수이며, 이 모든 과정은 원본 함수의 소스 코드를 변경하지 않고 수행됩니다.
먼저, WebIDE 왼쪽 파일 탐색기에서 decorator_basics.py 파일을 찾으십시오. 두 번 클릭하여 엽니다. 이 파일에 첫 번째 데코레이터를 작성할 것입니다.
다음 코드를 decorator_basics.py에 복사하여 붙여넣으십시오.
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
이 코드를 분석해 보겠습니다.
- 우리는 함수
func를 인수로 받아들이는 데코레이터 함수 log_activity를 정의합니다.
log_activity 내부에서 중첩 함수 wrapper를 정의합니다. 이 함수는 새로운 동작을 포함하게 됩니다. 로그 메시지를 출력하고, 원본 함수 func를 호출한 다음, 또 다른 로그 메시지를 출력합니다.
log_activity 함수는 wrapper 함수를 반환합니다.
greet 함수 위의 @log_activity 구문은 greet = log_activity(greet)의 단축 표현입니다. 이는 우리의 데코레이터를 greet 함수에 적용합니다.
이제 파일을 저장합니다 ( Ctrl+S 또는 Cmd+S를 사용할 수 있습니다). 스크립트를 실행하려면 WebIDE 하단에 있는 통합 터미널을 열고 다음 명령을 실행하십시오.
python ~/project/decorator_basics.py
다음과 같은 출력을 보게 될 것입니다. 날짜와 시간은 다를 수 있습니다.
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
출력에서 두 가지 사항에 주목하십시오. 첫째, 우리의 greet 함수는 이제 로깅 메시지로 래핑 (wrapped) 되었습니다. 둘째, 함수의 이름과 docstring 이 wrapper 함수의 이름과 docstring 으로 대체되었습니다. 이는 디버깅 및 인트로스펙션 (introspection) 에 문제가 될 수 있습니다. 다음 단계에서는 이를 수정하는 방법을 배울 것입니다.