[Python-ideas] PEP for executing a module in a package containing relative imports
Neil Toronto
ntoronto at cs.byu.edu
Mon Apr 23 01:51:26 CEST 2007
Steven Bethard wrote:
> On 4/22/07, Jim Jewett <jimjjewett at gmail.com> wrote:
>
>> # Equivalent to today
>> if __name__ == sys.modules["__main__"].__name__:
>>
>> # Better than today
>> if __name__ is sys.modules["__main__"].__name__:
>>
>> # What I would like (pending PEP I hope to write tonight)
>> if __this_module__ is sys.modules["__main__"]:
>>
>
> Is it just me, or are the proposals starting to look more and more like::
>
> public static void main(String args[])
>
> I think this PEP now needs to explicitly state that keeping the "am I
> the main module?" idiom as simple as possible is *not* a goal. Because
> everything I've seen (except for the original proposals in the PEP)
> are substantially more complicated than the current::
>
> if __name__ == '__main__':
>
> I guess I don't understand why we wouldn't be willing to put up with a
> new module attribute or builtin to minimize the boilerplate in pretty
> much every Python application out there.
>
Agreed - it's getting horrid. As Pythonic as they think this is, they're
completely forgetting the newb.
So let's look at it from his point of view. Say I'm a Python newb. I've
written some modules and some executable Python scripts and I'm somewhat
comfy with the language. (Of course, it only took me about two hours to
get comfy - this is Python, after all.) I now want to write either:
1) A module that runs unit tests when it is run as a script, but not
when it's just imported; or
2) A script that can be imported as a module when I need a few of its
functions. (I should really split them into another module, but this is
a use case.)
Now I have to import sys? Never seen that one... okay. Imported. Now,
what's this Greek I have to write to test whether the script is the main
script? How am I supposed to remember this? This is worse than fork()!
On the other hand, IMNSHO, either of the following two are just about
perfect in terms of understandability, and parsimony:
def __main__(): # we really don't need args here
# stuff
if __main__:
# stuff
Chances are, the first will be very familiar, but refreshing that it's
just a plain old, gibberish-free function. Both are easier than what
we've got currently. (IMO, the first is better, because 1) the code can
be put anywhere in the module; 2) it automatically doesn't pollute the
global namespace; and 3) it's less boilerplate for complex modules and
no more boilerplate for simple ones.)
FWIW, I don't see a problem with a sys.modules['__main__'] - it would
even occasionally be useful - but nobody should be *required* to use an
abomination like that for what's clearly a newbie task: determining
whether a module is run as a script.
Neil
More information about the Python-ideas
mailing list