Понимание базовых декораторов
На этом шаге мы познакомимся с концепцией декораторов и их базовым использованием. Декоратор — это функция, которая принимает другую функцию в качестве аргумента, добавляет некоторую функциональность и возвращает другую функцию, и все это без изменения исходного кода оригинальной функции.
Сначала найдите файл decorator_basics.py в проводнике файлов слева в WebIDE. Дважды щелкните по нему, чтобы открыть. Мы напишем наш первый декоратор в этом файле.
Скопируйте и вставьте следующий код в 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__}")
Давайте разберем этот код:
- Мы определяем функцию-декоратор
log_activity, которая принимает функцию func в качестве своего аргумента.
- Внутри
log_activity мы определяем вложенную функцию wrapper. Эта функция будет содержать новое поведение. Она выводит сообщение в лог, вызывает оригинальную функцию func, а затем выводит еще одно сообщение в лог.
- Функция
log_activity возвращает функцию wrapper.
- Синтаксис
@log_activity над функцией greet является сокращением для 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 теперь обернута сообщениями логирования. Во-вторых, имя и строка документации (docstring) функции были заменены на соответствующие значения функции wrapper. Это может вызвать проблемы при отладке и интроспекции. На следующем шаге мы узнаем, как это исправить.