duncan.booth at invalid.invalid
Wed Mar 15 17:39:33 CET 2006
> 4. Really basic question, and I'm sure I will learn this very quickly
> with more reading, but I'm confused by the lack of an entry point in a
> Python app, i.e. int main().
Keir's answer about testing for __main__ is good, but it might also help
you to think a bit about what it actually means to run a Python program.
Python executes code line by line from top to bottom. Almost every
statement in Python is executed.
This is quite different from a language like C where executable statements
are safely tucked inside functions and execution starts at an arbitrary
point (the 'main' function), or even C++ where global and static variable
initialisations are also executable. In Python everything except the
'global' statement is executed at runtime (also comments and docstrings
don't execute). That includes 'import', 'class' and 'def'.
So, when you run a Python script it starts on the first line of the script.
Usually that will be an 'import', so the interpreter will go off and find
the referenced module, compile it if required, and then execute the module
from top to bottom. If a module is imported more than once, it only starts
executing the code in that module on the first import, and if you have
circular imports you can end up accessing a module which has only partly
When it sees a class definition the interpreter executes its body in a new
namespace and uses the result to create the class. When it sees a function
definition it doesn't execute the body, but it does execute any default
arguments and then it creates the function.
What does this mean in practice? You cannot reference a class or function
until after you have executed the relevant definition. You can stick a
function definition inside a loop if you want: the name just gets rebound
to a new object each time it is executed. The behaviour can be quite
suprising at times for people who think of declaring functions, but it is
extremely logical if you remember that everything has to execute.
The __name__=='__main__' convention works because the main script executes
in the module called '__main__', whereas every other module executes under
its own name. But it isn't really the start of the program: rather it is
the very last thing executed after all the modules have imported and done
whatever initialisation they want, and after all the classes and functions
have been defined.
More information about the Python-list