Introducing functool.wraps
Свайпніть щоб показати меню
Коли ви створюєте власні декоратори, часто втрачається важлива інформація про оригінальну функцію, така як її ім'я, docstring та модуль. Це відбувається тому, що декоратор замінює оригінальну функцію новою обгорткою. Щоб уникнути цього, використовуйте декоратор functools.wraps зі стандартної бібліотеки Python.
Застосовуючи functools.wraps до вашої обгортки, ви зберігаєте метадані оригінальної функції. Це означає:
- Атрибут
__name__функції залишається таким самим, як у оригіналу; - Рядок документації
__doc__функції зберігається без змін; - Атрибут
__module__та інші метадані також зберігаються.
Збереження метаданих важливе для налагодження, генерації документації та інструментів, які використовують інспекцію функцій. Без functools.wraps трасування стеку та допоміжні утиліти можуть відображати некоректну або заплутану інформацію, що ускладнює підтримку та налагодження коду.
1234567891011121314151617181920212223from functools import wraps # Define a decorator that will wrap another function def my_decorator(func): # Use @wraps to preserve metadata from the original function @wraps(func) def wrapper(*args, **kwargs): # This code runs before the original function print("Running the decorated function...") return func(*args, **kwargs) # Call the original function return wrapper # Return the wrapper as the new decorated function # Apply the decorator to a function def say_hello(): """Prints a hello message.""" print("Hello!") say_hello = my_decorator(say_hello) say_hello() # Print out the preserved metadata print(f"Function name: {say_hello.__name__}") # Name is preserved print(f"Docstring: {say_hello.__doc__}") # Docstring is preserved
Ви можете побачити, як використовувати functools.wraps для збереження метаданих оригінальної функції при створенні декоратора. Застосовуючи functools.wraps до обгортки, ви гарантуєте, що такі атрибути, як ім'я функції та docstring, не будуть втрачені після декорування.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат