Python, как избежать оценки аргументов для записи операторов ниже текущего уровня - PullRequest
0 голосов
/ 05 февраля 2020

Предположим, у меня есть такой оператор

logging.debug('%r', do_really_expensive_computation())
or
logging.debug('%r', find_my_object().do_really_expensive_computation())

Когда уровень ведения журнала установлен выше DEBUG, он не будет регистрироваться, но все равно будет оценивать аргументы перед вызовом logging.debug() и выполнением do_really_expensive_computation() также find_my_object() может быть довольно тяжелым.

Есть ли хороший шаблон , чтобы пропустить все вычисления, связанные с регистрацией, когда ниже текущего уровня?

1 Ответ

1 голос
/ 05 февраля 2020

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

class r:
    def __init__(self, callback):
        self.callback = callback

    def __repr__(self):
        return repr(self.callback())

так что:

import logging

def expensive():
    print('this is expensive')
    return 1

print('debug:')
logging.debug('%r', r(lambda: expensive()))
print('error:')
logging.error('%r', r(lambda: expensive()))

выходы:

debug:
error:
this is expensive
ERROR:root:1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...