<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 10 May 2018 at 17:55, Barry Scott <span dir="ltr"><<a href="mailto:barry@barrys-emacs.org" target="_blank">barry@barrys-emacs.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;"><div><span class="gmail-"><blockquote type="cite"><div>On 7 May 2018, at 18:52, Guido van Rossum <<a href="mailto:guido@python.org" target="_blank">guido@python.org</a>> wrote:</div><br class="gmail-m_807210784696581653Apple-interchange-newline"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, May 7, 2018 at 6:24 AM, Serhiy Storchaka <span dir="ltr"><<a href="mailto:storchaka@gmail.com" target="_blank">storchaka@gmail.com</a>></span> wrote:<span></span><br><span></span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I just don't understand why you need a new keyword for writing runtime checks.<br></blockquote></div><br></div><div class="gmail_extra">Oh, that's pretty clear. The OP wants to be able to turn these checks off with some flag he can set/clear at runtime, and when it's off he doesn't want to incur the overhead of evaluating the check. The assert statement has the latter property, but you have to use -O to turn it off. He basically wants a macro so that<br><br></div><div class="gmail_extra">  runtime_assert(<expr>)<br><br></div><div class="gmail_extra">expands to<br><br></div><div class="gmail_extra">  if <controlling flag> and (<expr>):<br>      raise AssertionError<br clear="all"></div><div class="gmail_extra"><br></div><div class="gmail_extra">In Lisp this would be easy. :-)<br></div></div></div></blockquote><div><br></div></span><div><div>This idea requires the same sort of machinery in python that I was hoping for to implement the short circuit logging.</div><div><br></div><div>My logging example would be</div><div><br></div><div><span class="gmail-m_807210784696581653Apple-tab-span" style="white-space:pre-wrap">       </span>log( control_flag, msg_expr )</div><div><br></div><div>expanding to:</div><div><br></div><div><span class="gmail-m_807210784696581653Apple-tab-span" style="white-space:pre-wrap">   </span>if <control_flag>:</div><div><span class="gmail-m_807210784696581653Apple-tab-span" style="white-space:pre-wrap">              </span>log_function( <msg_expr> )</div></div></div></div></blockquote><div><br></div><div>Logging is the example that came to mind for me as well - <a href="https://docs.python.org/3/howto/logging.html#optimization">https://docs.python.org/3/howto/logging.html#optimization</a> discusses the "logging.isEnabledFor" API, and how it can be used to avoid the overhead of expensive state queries when the result log message would just be discarded anyway.<br><br></div><div>Generally speaking though, the spelling for that kind of lazy evaluation is to accept a zero-argument callable, which can then be used with "lambda: " at the call site:<br><br></div><div>    runtime_assert(lambda: <expr>)<br></div><br><div>Cheers,<br></div><div>Nick.<br></div></div><br>-- <br><div class="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>