Я представляю, 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)]))
Если Вы зависите только от доступа к глобальным атрибутам состояния, можно инстанцировать класса 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 )
Связанный: