<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I think we all agree that it cannot be done in Python right now…<div><br></div><div>But i doubt there will be support for a solution just for debugging, and I am having a hard time coming up with other examples…</div><div><br></div><div>Quick thought (very quick) and I am no expert, but maybe an acceptable/compatible solution could be:</div><div><br></div><div>def do_debug(*args):</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>print 'DEBUG: ', args</div><div><br></div><div>def nop_debug(*args):</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>pass # Empty function</div><div><br></div><div>debug = do_debug</div><div>debug( "Some evaluated text %d %d %d" % (1, 2, fact(22)) )</div><div><br></div><div>debug = nop_debug</div><div>debug( "Will not be evaluated, since Python is clever enough to optimise out")</div><div><br></div><div>At least some kind of -O option could optimise this out ?</div><div><br></div><div>Then again, there are probably lot's of reasons for this not to work :-)</div><div><br></div><div>/Rene</div><div><br></div><div><br><div><div>On Dec 26, 2012, at 12:04 AM, anatoly techtonik <<a href="mailto:techtonik@gmail.com">techtonik@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">On Tue, Dec 25, 2012 at 5:45 PM, Vinay Sajip <span dir="ltr"><<a href="mailto:vinay_sajip@yahoo.co.uk" target="_blank">vinay_sajip@yahoo.co.uk</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>Rene Nejsum <rene@...> writes:<br>
<br>
> So doing:<br>
><br>
> if log.debug.enabled():<br>
>       log.debug( bla. bla. )<br>
><br>
> Add's 5-10% extra code lines, whereas if we could do:<br>
><br>
> log.debug( bla. bla )<br>
><br>
> at the same cost would save a lot of lines.<br>
<br>
</div>Bearing in mind that the first statement in the debug (and analogous methods) is<br>
a check for the level, the only thing you gain by having the same check outside<br>
the call is the cost of evaluating arguments. But you can also do this by<br>
passing an arbitrary class as the message object, which lazily evaluates only<br>
when needed. Contrived example:<br>
<br>
class Message(object):<br>
    def __init__(self, func, x, y): # params should be cheap to evaluate<br>
        self.func = func<br>
        self.x = x<br>
        self.y = y<br>
<br>
    def __str__(self):<br>
        return str(self.func(self.x**self.y)) # expense is incurred here<br>
<br>
logger.debug(Message(factorial, 2, 15))<br>
<br>
With this setup, no if statements are needed in your code, and the expensive<br>
computations only occur when required.<br></blockquote><div><br></div>That's still two function calls and three assignments per logging call. Too expensive and syntax unwieldy. I think everybody agrees now that for existing CPython implementation there is really no solution for the problem of expensive logging calls vs code clarity. You have to implement optimization workaround at the cost of readability.</div>

<div class="gmail_quote"><br></div><div class="gmail_quote">The idea is to fix the interpreter, introducing a "feature block" - execution block that works only if it is enabled. Execution block for logging example below is defined by function name "debug" and braces ().</div>

<div class="gmail_quote"><br></div><div class="gmail_quote" style="">    debug( <block contents> )</div><div class="gmail_quote"><br></div><div class="gmail_quote" style="">debug is an object of 'feature' type, which is only executed/evaluated, if the feature is enabled in a table of features.</div>

<div class="gmail_quote" style=""><br></div><div class="gmail_quote" style="">It might be possible to implement this as a custom version of PyPy. Then by hardcoding logic for treating logging call as 'featured'  should give an immediate performance boost to any project. Still it would be nice if logging was build with supported layout for easy optimization or for 'from __future__ import features.logging' .</div>


</div></div>
_______________________________________________<br>Python-ideas mailing list<br><a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>http://mail.python.org/mailman/listinfo/python-ideas<br></blockquote></div><br></div></body></html>