Skip to content

Instantly share code, notes, and snippets.

@kissgyorgy
Last active January 10, 2022 21:25
Show Gist options
  • Save kissgyorgy/ee1c27fc39cbf69a8459d2a38beb1491 to your computer and use it in GitHub Desktop.
Save kissgyorgy/ee1c27fc39cbf69a8459d2a38beb1491 to your computer and use it in GitHub Desktop.
Python: lazily evaluate field for structlog
class LazyField:
"""Evaluates __repr__ lazily for heavy calculations.
Expects callable with args and kwargs of how to calculate the value.
"""
def __init__(self, func, *args, **kwargs):
self._func = func
self._args = args
self._kwargs = kwargs
self._value = ...
def __repr__(self):
if self._value is ...:
value = self._func(*self._args, **self._kwargs)
self._value = value
return self._value
# Usage:
import structlog
def expensive_computation(base, *, exponent):
return base**exponent
logger = structlog.get_logger()
logger.debug("Event", lazy_field=LazyField(expensive_computation, 2, exponent=1000))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment