[Python-ideas] Replacing the if __name__ == "__main__" idiom (was Re: making a module callable)

Ron Adam ron3200 at gmail.com
Mon Nov 25 05:14:31 CET 2013



On 11/24/2013 05:11 PM, Guido van Rossum wrote:
>      > Why not make it so that a module function named __main__, if it exists,
>      > gets executed when the module is run as a script?
>
>     I consider the fact that the semantics of __main__ execution are
>     largely the same as those of any other module import to be a feature
>     rather than a bug.
>
> Right!
>
>     Keep in mind that we *can't* stop the current idiom from working (since
>     we have to run the top level code to build the module in the first
>     place), and that "run this script from disk" is just one way of
>     executing __main__. For example, the REPL loop is a
>     statement-by-statement interactive rendition of __main__, while
>     __main__.py files in zipfiles, directories and packages don't bother
>     with the "if __name__ == '__main__'" guard at all.

Right, it prevents that section from running in the case where it's not the 
main module.  But spelling that explicitly isn't as nice.

      if not __name__ != "__main__":
           # Don't do this if this module isn't named "__main__".


Regarding the is_main()...  seems like it should take an argument.  Most 
is_something() functions do.  Is there a way to make something like the 
following work?

    def is_main(name=None):
        if name == None:
            name = get_attr_from_caller()  # dynamic lookup
        return (name == "__main__")


And how about just a global name __main__ that is always set to "__main__"?

    if __name__ is __main__:
          ...

Not a big change, but it reads nice and maybe users will like it well 
enough not to keep suggesting changing it. ;-)

Down the road (python6) you could change both of those to the real main 
modules name and they would still work.

Just a few thoughts,
    Ron












More information about the Python-ideas mailing list