<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace"><span style="font-family:arial,sans-serif">On Sun, Oct 8, 2017 at 2:44 PM, Chris Angelico </span><span dir="ltr" style="font-family:arial,sans-serif"><<a href="mailto:rosuav@gmail.com" target="_blank">rosuav@gmail.com</a>></span><span style="font-family:arial,sans-serif"> wrote:</span><br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sun, Oct 8, 2017 at 7:02 PM, David Cournapeau <<a href="mailto:cournape@gmail.com">cournape@gmail.com</a>> wrote:<br>
> It is certainly true that for a CLI tool that actually makes any network<br>
> I/O, especially SSL, import times will quickly be negligible. It becomes<br>
> tricky for complex tools, because of error management. For example, a common<br>
> pattern I have used in the past is to have a high level "catch all<br>
> exceptions" function that dispatch the CLI command:<br>
><br>
> try:<br>
>     main_function(...)<br>
> except ErrorKind1:<br>
>     ....<br>
> except requests.exceptions.SSLError:<br>
>     # gives complete message about options when receiving SSL errors, e.g.<br>
> invalid certificate<br>
><br>
> This pattern requires importing requests every time the command is run, even<br>
> if no network IO is actually done. For complex CLI tools, maybe most command<br>
> don't use network IO (the tool in question was a complete packages manager),<br>
> but you pay ~100 ms because of requests import for every command. It is<br>
> particularly visible because commands latency starts to be felt around<br>
> 100-150 ms, and while you can do a lot in python in 100-150 ms, you can't do<br>
> much in 0-50 ms.<br>
<br>
</span>This would be a perfect use-case for lazy importing, then. You'd pay<br>
the price of the import only if you get an error that isn't caught by<br>
one of the preceding except blocks.<br></blockquote><div><br></div><div><br></div><div class="gmail_default" style="font-family:monospace,monospace">​I suppose it might be convenient to be able to do something like:</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">with autoimport:</div><div class="gmail_default" style="font-family:monospace,monospace">    try:</div><div class="gmail_default" style="font-family:monospace,monospace">        main_function(...)</div><div class="gmail_default" style="font-family:monospace,monospace">   ​ except ErrorKind1:</div><div class="gmail_default" style="font-family:monospace,monospace">        ...</div><div class="gmail_default" style="font-family:monospace,monospace">    except requests.exceptions.SLLError:</div><div class="gmail_default" style="font-family:monospace,monospace">        ...</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">The easiest workaround at the moment is still pretty clumsy:</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">def import_SLLError():</div><div class="gmail_default" style="font-family:monospace,monospace">    from requests.exceptions import SLLError</div><div class="gmail_default" style="font-family:monospace,monospace">    return SLLError</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">...</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">    except import_SLLError():</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">But what happens if that gives you an ImportError?</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">––Koos</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">+ Koos Zevenhoven + <a href="http://twitter.com/k7hoven" target="_blank">http://twitter.com/k7hoven</a> +</div>
</div></div>