[Tutor] Which is better Practice and why

Steven D'Aprano steve at pearwood.info
Tue Oct 23 02:42:11 CEST 2012


On 22/10/12 22:54, Devin Jeanpierre wrote:
> On Mon, Oct 22, 2012 at 7:45 AM, Matthew Ngaha<chigga101 at gmail.com>  wrote:
>> the 2nd one usually includes a lot more code then i showed. can you please
>> tell me why different methods are used to access the main code? is it just
>> preference or is one way actually better coding practice?
>
> The second one is used if your importable modules are also scripts
> that can be executed.
>
> That's a bad idea,

I disagree. See below.


> because it results in the same source file being executed twice,

Not so. That only happens if your module is executed *and* imported
simultaneously. It is perfectly safe to write a module which can be run
as a script, or imported, so long as you don't do both at the same time
from within a single Python process.

Excluding test scripts, I find 145 modules in the Python 2.5 standard
library, and 127 in the Python 3.3 std lib, that use the "if __name__ =="
idiom to be both importable and runnable as a script.


> producing distinct classes that break typechecking. If
> you have "myprogram.py" containing the following source code, and
> execute it as a program, it will terminate with an uncaught MyError.
>
>      class MyError(Exception): pass
>
>      import myprogram
>      try: raise myprogram.MyError
>      except MyError: pass

Then don't do that.

There are very few reasons for importing a module from within itself, and
those reasons are relatively advanced, e.g.:

- circular imports
- some types of introspection

If you do that, and the module directly or indirectly imports itself
while it is running as a script, you may run into trouble. But writing
a dual-purpose module that is usable as an importable module or as a
stand-alone script is not problematic in itself.



> So, in any circumstance where you would use the second one, it's
> because you're in a situation where bad things are happening.

The bad situation is when you have circular imports, including the
case where your module imports itself.


> So use the first one always.

This is contrary to the advice given in the Fine Manual:

http://docs.python.org/library/__main__.html


More from Python's creator, GvR, and the Effbot:

http://www.artima.com/forums/flat.jsp?forum=106&thread=4829

http://effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm




-- 
Steven


More information about the Tutor mailing list