[Python-ideas] Efficient debug logging

Barry barry at barrys-emacs.org
Tue Feb 14 17:00:31 EST 2017


> On 14 Feb 2017, at 17:39, Kyle Lahnakoski <klahnakoski at mozilla.com> wrote:
> 
> 
> Can you wrap the expensive functions in lambdas? And have your logger
> evaluate it, only if required?
> 
>> debugLog( ‘info is %r’ % (lambda: expensiveFunction(),) )

Interesting idea. I will bench mark and see what the cost of the lamba version is.
It would still be nice to have the code look cleaner without the lambda.

Barry

> 
> 
>> On 2017-02-14 10:51, 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.
>> 
>> For example:
>> 
>> debug_log_enabled = False
>> def debugLog( msg ):
>>      If debug_log_enabled:
>>            print( ‘Debug: %s’ % (msg,) )
>> 
>> Then the caller can simple write:
>> 
>> def main():
>>      debugLog( ‘Start of main’ )
>> 
>> This is fine until the evaluation of the msg becomes expensive.
>> 
>>    debugLog( ‘info is %r’ % (expensiveFunction(),) )
>> 
>> 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.
>> 
>> I could combine the boolean and the log function by using a class to tidy up the implementation.
>> 
>> class DebugLog:
>>    def __init__( self, enabled = False ):
>>        self.enabled = enabled
>> 
>>    def __bool__( self ):
>>        return self.enabled
>> 
>>    def __call__( self, msg ):
>>        if self.enabled: print( ‘Debug: %s’ % (msg,) )
>> 
>> And call like this:
>> 
>>    dbg_log = DebugLog()
>> 
>>       If dbg_log: dbg_log( ‘a debug message’ )
>> 
>> 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.
>> 
>> I cannot see how to do this with python as it stands.
>> 
>> Something would have to be added to allow python to short circuit the argument tuple evaluation.
>> 
>> Maybe python can check for a special dunder on the class that know how to do this idiom, __if_true_call__?
>> 
>> Thoughts?
>> 
>> Barry
>> 
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas at python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: http://python.org/psf/codeofconduct/
> 
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/



More information about the Python-ideas mailing list