Показать оригинальную функцию при регистрации funcName в декораторе - PullRequest
0 голосов
/ 17 мая 2019

У меня есть декоратор, чтобы повторить некоторые операции 3 раза, если возникает тупик, и выполняет некоторую регистрацию в процессе:

def retry_on_deadlock(func):
    logger = logging.getLogger('test')

    @wraps(func)
    def decorated(*args, **kwargs):
        retry_count = 0

        while retry_count < 3:
            try:
                return func(*args, **kwargs)
            except DeadLockException:
                retry_count += 1

                if retry_count == 3:
                    raise

                logger.warning('We are in the decorated function here')

    return decorated

@retry_on_deadlock
def crucial_function(value):
    with value:
        do_something()

crucial_function(important_data)

Наш формат регистрации включает %(funcName)s, который в данном конкретном случаеоценим до decorated.Есть ли способ сделать так, чтобы crucial_function появлялось в журналах?

Я уже пытался реализовать фильтр журналирования, но необходимая логика стала немного громоздкой, так как нужно проверять стек, и еслирегистрация происходила непосредственно в функции decorated (т.е. не в функции, вызываемой исходной функцией), она будет перезаписывать funcName в записи журнала.Если это единственный способ, я с сожалением приму его.

Обновление : Это не то же самое, что этот вопрос, так как мне все равноо сигнатуре функций (которая фактически сохраняется декоратором @wraps).Я хочу дать указание библиотеке logging пропускать один уровень из трассировки стека при регистрации имени функции через %(funcName)s, %(filename)s и %(lineno)s.

...