Can someone explain this behavior to me?

Albert Hopkins marduk at letterboxes.org
Thu Feb 26 18:58:18 EST 2009


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





More information about the Python-list mailing list