[Python-ideas] Packages and Import
Josiah Carlson
jcarlson at uci.edu
Fri Feb 9 20:04:41 CET 2007
"Brett Cannon" <brett at python.org> wrote:
>
> On 2/9/07, Ron Adam <rrr at ronadam.com> wrote:
> > Brett Cannon wrote:
> > > On 2/8/07, Ron Adam <rrr at ronadam.com> wrote:
>
> [SNIP]
>
> > >> If you remove the "__main__" name, then you will still need to have some
> > >> attribute for python to determine the same thing.
> > >
> > > Why? There is nothing saying we can't follow most other languages and
> > > just have a reserved function name that gets executed if the module is
> > > executed.
> >
> > Yes, but this is where python is different from other languages. In a way,
> > python's main *is* the whole module from the top to bottom. And so the
> > '__main__' name is referring to the whole module and not just a function in it.
> >
> > A more specific function would be needed to get the context right. Maybe
> > __script__(), or __run__().
> >
> >
> > Or if you want to be consistent with class's, how about adding __call__() to
> > modules? Then the main body of the module effectively works the same way as it
> > does in a class. =)
> >
> >
> > Hey, I think that has some cool possibilities, it makes modules callable in
> > general. So if I want to run a module's __call__(), AKA main() as you call it,
> > after importing I would just do...
> >
> > import module
> > module()
> >
> > And it would just work. ;-)
> >
>
> I like this idea. Makes it very obvious. You just say "when a
> specific module is specified at the command line it is called. Could
> even have it take possibly sys.argv[1:] (which I think was supposed to
> turn into sys.args or sys.arg or something at some point).
>
> What do other people think?
I don't like it. Much of my dislike comes from personal aesthetics, but
then there is a logical disconnect. When an instance of a class is
created, its __call__ method is not automatically called. By using the
semantic of 'the __call__ function in the module namespace is
automatically executed if the module is "run" from the command line', we
are introducing a different instance creation semantic (an imported
module is an instance of ModuleType).
I think we should just stick with what has been proposed for *years*, a
__main__ function that is automatically executed after the module has
been imported if its __name__ == '__main__'. Even better, anyone who
wants to write code compatible with the updated syntax can include the
following literal block at the end of their files...
if __name__ == '__main__':
try:
__main__
except NameError:
pass
else:
try:
__main__()
finally:
try:
from __future__ import disable_run
except SyntaxError:
#we are using an older Python
pass
else:
#we are using a new Python, and
#disabling automatic running succeeded
pass
With such a semantic, current users of Python could include the above
literal block and it would *just work*...then again, the new semantic
wouldn't really be useful if people started using the above literal
block.
- Josiah
More information about the Python-ideas
mailing list