[Python-ideas] Efficient debug logging
Barry Scott
barry at barrys-emacs.org
Wed Feb 15 06:55:24 EST 2017
On Wednesday, 15 February 2017 22:18:31 GMT Steven D'Aprano wrote:
> On Tue, Feb 14, 2017 at 03:51:05PM +0000, Barry Scott wrote:
> > A common pattern I use is to have logging calls for debug and information
> > with my applications. The logging calls can be separately enabled and
> > disabled.
>
> [...]
>
> > What would be nice is to be able to avoid evaluation the tuple of
> > arguments if debug is>
> > disabled as this can be expensive. I can write this:
> > if debug_log_enabled: debugLog( ‘info is %r’ % (expensiveFunction(),) )
> >
> > But that is a more code then I would like to write. And if the debug code
> > is a performance problem cannot be left in the production code.
>
> Occasionally people (often me... :-) will suggest that it would be good
> if Python had some sort of lightweight "thunk" for delayed evaluation. I
> don't have good syntax for that, but let's pretend it was "<# ... #>"
> just for the sake of having a way to talk about it.
>
> We can think of a thunk as being something like syntax for lazy
> evaluation, so you could write:
>
> debugLog( ‘info is %r’ % (<#expensiveFunction()#>, ) )
>
> and the expensive function call would only actually be made if it was
> required.
The lazy eval sound like a generator.
>
> Python doesn't have thunks, but there is a relatively heavyweight
> solution for delayed evaluation: wrap the code in a function.
>
> debugLog( ‘info is %r’, lambda: expensiveFunction() )
>
>
> and then adjust debugLog so that if the argument is a function, it will
> call the function only when needed:
>
> def debugLog(message, value):
> if debug_log_enabled:
> if isinstance(value, types.FunctionType):
> value = value()
> log(message % value)
And reply suggested this and it works well for the obviously expensive calls
in benchmarks.
> > But I’d like to only write:
> > dbg_log( ‘a debug message’ )
> >
> > And have the evaluation of the argument skipped unless its dbg_log is
> > enabled.
> Indeed. That's what thunks could give us, if only we had a clear picture
> of how they would work, when they would be evaluated, and what syntax
> they should use.
>
> In the meantime, there are other solutions, not as (hypothetically)
> lightweight, but they'll work *now* rather than needing to wait for
> Python 3.7 or 3.9 or 4.5 :-)
At the moment I just put up with the cost of debug calls. The typical of
debug messages did come up in a PYCON UK talk and the suggestion was
to remove the debug logging after the code works. I prefer to leave the debug
logging in production code.
> But if you have some good, concrete suggestions for how to do thunks in
> Python, please tell us!
generators was the best thought so far.
Barry
More information about the Python-ideas
mailing list