60
задан 4 February 2013 в 01:41

2 ответа

Я представляю, Lazyfy:

class Lazyfy(object):
    __slots__ = 'action', 'value'

    def __init__(self, action, *value):
        self.action = action
        self.value = value

    def __str__(self):
        return self.action(*self.value)

Использование:

from pprint import pformat
log.debug("big_result: %s", Lazyfy(pformat, big_result))
log.debug( "x y z: %s", Lazyfy( lambda x, y, z: ' ,'.join( [x, y, z] ), '1', '2', '3' ) )

исходный пример:

logger.info('Stupid log message %s', Lazyfy(lambda: ' '.join((str(i) for i in range(20)))))

, Как Вы видите, это также покрывает другой ответ, который использует функцию лямбды, но использует больше памяти с эти value атрибут и расширение. Однако это сохраняет больше памяти с: Использование __ слоты __?

Наконец, безусловно, наиболее эффективное решение, все еще являющееся следующим, как предложено другой ответ:

if logger.isEnabledFor(logging.DEBUG): 
    logger.debug('Stupid log message ' + ' '.join([str(i) for i in range(20)]))
0
ответ дан 1 November 2019 в 09:52

Если Вы зависите только от доступа к глобальным атрибутам состояния, можно инстанцировать класса Python и lazify он при помощи __str__ метод:

class get_lazy_debug(object):
    def __repr__(self):
        return ' '.join(
                str(i) for i in range(20)
            )

# Allows to pass get_lazy_debug as a function parameter without 
# evaluating/creating its string!
get_lazy_debug = get_lazy_debug()

logger.debug( 'Stupid log message', get_lazy_debug )

Связанный:

  1. Условно оцененные операторы отладки в Python
  2. , Что такое метаклассы в Python?
0
ответ дан 1 November 2019 в 09:52

Другие вопросы по тегам:

Похожие вопросы: