[Python-ideas] breaking out of module execution

Georg Brandl g.brandl at gmx.net
Tue Apr 24 22:11:53 CEST 2012


On 24.04.2012 21:58, M.-A. Lemburg wrote:
> Antoine Pitrou wrote:
>> On Tue, 24 Apr 2012 13:23:53 -0600
>> Eric Snow <ericsnowcurrently at gmail.com>
>> wrote:
>>> In a function you can use a return statement to break out of execution
>>> in the middle of the function.  With modules you have no recourse.
>>> This is akin to return statements being allowed only at the end of a
>>> function.
>>>
>>> There are a small number of ways you can work around this, but they
>>> aren't great.  This includes using wrapper modules or import hooks or
>>> sometimes from-import-*.  Otherwise, if your module's execution is
>>> conditional, you end up indenting everything inside an if/else
>>> statement.
>> 
>> I think good practice should lead you to put your initialization code
>> in a dedicated function that you call from your module toplevel. In
>> this case, breaking out of execution is a matter of adding a return
>> statement.
> 
> True, but that doesn't prevent import from being run, functions and
> classes from being defined and resources being bound which are not
> going to get used.

What's wrong with an if statement on module level, if you even care
about this?

> Think of code like this (let's assume the "break" statement is used
> for stopping module execution):
> 
> """
> #
> # MyModule
> #
> 
> ### Try using the fast variant
> 
> try:
>     from MyModule_C_Extension import *
> except ImportError:
>     pass
> else:
>     # Stop execution of the module code object right here
>     break
> 
> ### Ah, well, so go ahead with the slow version
> 
> import os, sys
> from MyOtherPackage import foo, bar, baz
> 
> class MyClass:
>     ...
> 
> def MyFunc(a,b,c):
>     ...
> 
> def main():
>     ...
> 
> if __name__ == '__main__':
>     main()
> """

There's a subtle bug here that shows that the proposed feature has its
awkward points:  you probably want to execute the "if __name__ == '__main__'"
block in the C extension case as well.

Georg




More information about the Python-ideas mailing list