Name space quirk?

Alex new_name at mit.edu
Sun Jul 22 15:28:38 EDT 2001


Hi, Gangadhar.  I hope I'm addressing you appropriately. :)

The issue there is that the "if __name__ == '__main__':" block is not
executed when the module is imported, because in that case, "__name__"
is bound to the name of the module, in this case, "nspace".  As a
result, in the "nspace" namespace, nothing is bound to "myfile", so the
"myfile.write" command raises a NameError.  The "global" keyword only
means "global to the module" not "global to the entire program."  The
"myfile" you bound in the interpreter is in the "__main__" namespace.

Try this version:

#!/usr/bin/env python

from os import sys
 
def hello (outfile = sys.stdout):
        # We are writing to what should be an
        # unknown file descriptor:
        global myfile                         # <------- Added
        myfile.write ("Hello, world!\n")

print "Value of __name__ is", __name__
 
if __name__ == '__main__':
        f = sys.argv[0] + ".out"
        print "This line doesn't get executed"
        myfile = open (f, 'w')
        hello (myfile)

I'll leave it to the more erudite people on the list to debate the
merits of this arrangement.  I've been using it for years, and I'm too
familiar with it to really think critically about it, anymore,
anyway. :)

Alex.



More information about the Python-list mailing list