Alan Gauld wrote: > "nibudh" <[EMAIL PROTECTED]> wrote > >> I looked over my code (all 41 lines!) and couldn't find anything, >> then on a >> hunch i moved the def statement _above_ the rest of my code and hey >> presto >> it worked. >> >> I vaguely understand why this is happening, but can someone explain >> it to >> me. > > Its pretty simple. > Python processes the file top to bottom. If it comes upon > a name that it doesn't recofgnise it generates an error.
A key concept to understand is that def (and class and import) are executable statements that have no effect until they are actually executed. The effect of executing a def is to create a function object and bind it to the name given in the def. Before the def is executed, the name is not bound to anything and can't be used. This is a shift from less-dynamic languages such as Java and C, where functions exist from the time a module is loaded. One consequence of executable def is that you can, for example, have conditional defs: if has_foo: def bar(): # Implementation of bar using foo else: def bar(): # Implementation of bar without using foo Similar techniques can be used with imports. This can be handy for writing code that is backwards compatible. For example here is some code that tries to import ElementTree from its Python 2.5 library package and from the effbot distribution: try: import xml.etree.ElementTree as ET # in python >=2.5 except ImportError: try: import elementtree.ElementTree as ET # effbot's pure Python module except ImportError: raise ImportError("Can't import ElementTree") If this code successfully executes, the ElementTree module will be available as ET. Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor