<div class="gmail_extra"><br><br><div class="gmail_quote">On 24 April 2012 20:23, Eric Snow <span dir="ltr"><<a href="mailto:ericsnowcurrently@gmail.com" target="_blank">ericsnowcurrently@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In a function you can use a return statement to break out of execution<br>
in the middle of the function.  With modules you have no recourse.<br>
This is akin to return statements being allowed only at the end of a<br>
function.<br>
<br>
There are a small number of ways you can work around this, but they<br>
aren't great.  This includes using wrapper modules or import hooks or<br>
sometimes from-import-*.  Otherwise, if your module's execution is<br>
conditional, you end up indenting everything inside an if/else<br>
statement.<br>
<br>
Proposal: introduce a non-error mechanism to break out of module<br>
execution.  This could be satisfied by a statement like break or<br>
return, though those specific ones could be confusing.  It could also<br>
involve raising a special subclass of ImportError that the import<br>
machinery simply handles as not-an-error.<br>
<br>
This came up last year on python-list with mixed results. [1]<br>
However, time has not dimmed the appeal for me so I'm rebooting here.<br>
<br></blockquote><div><br><br>For what it's worth I've wanted this a couple of times. There are always workarounds of course (but not particularly pretty sometimes).<br><br>Michael<br><br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

While the proposal seems relatively minor, the use cases are not<br>
extensive. <wink>  The three main ones I've encountered are these:<br>
<br>
1. C extension module with fallback to pure Python:<br>
<br>
  try:<br>
      from _extension_module import *<br>
  except ImportError:<br>
      pass<br>
  else:<br>
      break  # or whatever color the bikeshed is<br>
<br>
  # pure python implementation goes here<br>
<br>
2. module imported under different name:<br>
<br>
  if __name__ != "expected_name":<br>
      from expected_name import *<br>
      break<br>
<br>
  # business as usual<br>
<br>
3. module already imported under a different name:<br>
<br>
  if "other_module" in sys.modules:<br>
      exec("from other_module import *", globals())<br>
      break<br>
<br>
  # module code here<br>
<br>
Thoughts?<br>
<br>
-eric<br>
<br>
<br>
[1] <a href="http://mail.python.org/pipermail/python-list/2011-June/1274424.html" target="_blank">http://mail.python.org/pipermail/python-list/2011-June/1274424.html</a><br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><pre cols="72"><a href="http://www.voidspace.org.uk/" target="_blank">http://www.voidspace.org.uk/</a><br><br>May you do good and not evil<br>May you find forgiveness for yourself and forgive others<br>
May you share freely, never taking more than you give.<br>-- the sqlite blessing <a href="http://www.sqlite.org/different.html" target="_blank">http://www.sqlite.org/different.html</a></pre>
<br>
</div>