«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Понимание декораторов Python: глубокое погружение

Понимание декораторов Python: глубокое погружение

Опубликовано 8 ноября 2024 г.
Просматривать:215

Декораторы Python — это мощные инструменты, которые позволяют нам изменять или улучшать поведение функций или методов. Общие случаи использования включают ведение журнала, авторизацию и многое другое.
Однако, когда их просят определить декоратор, многие могут сказать:

Это оболочка функции.

Хотя это технически правильно, под капотом происходит гораздо больше.

Разбор простого декоратора
Давайте рассмотрим простой пример:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

Здесь my_decorator — это декоратор для функцииsay_hello. Когда параметрsay_hello определен, он автоматически передается в my_decorator, преобразуя вызов функции в:
Say_hello = my_decorator(say_hello)

Когда произойдет эта трансформация?
Это преобразование происходит во время компиляции кода, а именно во время определения функции, а не во время выполнения.

Дизассемблирование кода
Чтобы понять, как декораторы работают на более низком уровне, мы можем использовать модуль dis для проверки байт-кода декорируемой функции:

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)

Разбивка байт-кода

Вывод команды dis.dis(say_hello) может выглядеть так:

Understanding Python Decorators: A Deep Dive
Пояснение байт-кода

  1. Перед вызовом функции

    • LOAD_GLOBAL: загружает функцию печати.
    • LOAD_CONST: загружает сообщение «Перед вызовом функции».
    • CALL_FUNCTION: вызывает печать.
    • POP_TOP: Отбрасывает возвращаемое значение.
  2. Вызов исходной функции

    • LOAD_DEREF: загружает исходную функцию (func), полученную замыканием.
    • LOAD_FAST: загружает позиционные и ключевые аргументы.
    • BUILD_MAP: создает новый словарь для аргументов ключевых слов.
    • CALL_FUNCTION_EX: вызывает исходную функцию с аргументами.
    • STORE_FAST: сохраняет результат в локальной переменной.
  3. После вызова функции

    • Как и в первой части, он вызывает print для вывода «После вызова функции».
    • Возврат результата
    • Загружает результирующую переменную и возвращает ее.

Заключение
Декораторы Python — это больше, чем просто оболочки функций; они позволяют нам изменять поведение функции во время определения. Поняв, как они работают, и изучив байт-код, мы сможем более эффективно использовать декораторы в наших проектах.

На этом всё! Если вы хотите, чтобы я углубился в что-то еще, просто дайте мне знать!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3