Как применить Interceptor в python?

1

Мне нужно знать, когда вызывается функция и что-то делать после вызова функции. Кажется, Interceptor может это сделать.

Как я могу использовать Interceptor в python?

Теги:
interceptor

1 ответ

0
Лучший ответ

Это можно сделать с помощью декораторов:

from functools import wraps


def iterceptor(func):
    print('this is executed at function definition time (def my_func)')

    @wraps(func)
    def wrapper(*args, **kwargs):
        print('this is executed before function call')
        result = func(*args, **kwargs)
        print('this is executed after function call')
        return result

    return wrapper


@iterceptor
def my_func(n):
    print('this is my_func')
    print('n =', n)


my_func(4)

Выход:

this is executed at function definition time (def my_func)
this is executed before function call
this is my_func
n = 4
this is executed after function call

@iterceptor заменяет my_func результатом выполнения функции iterceptor, то есть с функцией- wrapper. wrapper обертывает данную функцию в некоторый код, обычно сохраняя аргументы и результат выполнения wrappee, но добавляет некоторое дополнительное поведение.

@wraps(func) есть, чтобы скопировать данные подписи /docstring функции func на вновь созданную функцию wrapper.

Больше информации:

  • 0
    Функция my_func находится в классе в библиотеке, а не в любом классе моего кода. Исходя из того, что вы сказали, я должен изменить библиотеку, и я не хочу делать это настолько, насколько это возможно.
  • 0
    Вы можете изменить способ применения декоратора, fancy @ syntax делает именно это, только для локальных функций: my_lib.my_func = interceptor(my_lib.my_func)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню