On Thu, 2009-02-26 at 13:48 -0800, Jesse Aldridge wrote: > I have one module called foo.py > --------------------- > class Foo: > foo = None > > def get_foo(): > return Foo.foo > > if __name__ == "__main__": > import bar > Foo.foo = "foo" > bar.go() > --------------------- > And another one called bar.py > --------------------- > import foo > > def go(): > assert foo.get_foo() == "foo" > ---------------------- > When I run foo.py, the assertion in bar.py fails. Why?
AFAICT you have 2 different "foo" modules here. The first foo is when foo.py is called as a script, but it's not called "foo" it's called "__main__" because it's called as a script. When "bar" is imported, it imports "foo", but this is different. Technically this is the first time you are *importing* foo. It's actually loaded a second time with the name "foo". A more simplified version of it is this: $ cat foo.py cat = 6 import bar print '%s: %s.cat = %s' % (__file__, __name__, cat) $ cat bar.py import foo foo.cat = 7 print '%s: %s.cat = %s' % (__file__, foo.__name__, foo.cat) $ python foo.py /home/marduk/test/foo.py: foo.cat = 6 /home/marduk/test/bar.py: foo.cat = 7 foo.py: __main__.cat = 6 OTOH: $ python -c "import foo" bar.py: foo.cat = 7 foo.py: foo.cat = 7 But, as others have said, this is confusing and should be avoided. -a -- http://mail.python.org/mailman/listinfo/python-list