Jean-Michel Pichavant wrote:
Hello world,
I had recently a very nasty bug in my python application. The context is
quite complex, but in the end the problem can be resume as follow:
2 files in the same directory :
lib.py:
>import foo
>foo.Foo.BOOM='lib'
foo.py:
>class Foo:
> BOOM = 'Foooo'
>
>if __name__=='__main__':
> import lib # I'm expecting BOOM to be set to 'lib'
> print Foo.BOOM
I was expecting 'lib' as output, but I got 'Fooo'. I don't really
understand what python mechanism I'm messing with but I have the feeling
I've misunderstood a very basic concept about class, namespace or
whatever import notion.
I guess there is 2 different objects for the same class Foo. How I do I
make both Foo objects the same object ?
OK, here is one solution (from which you may infer the problem):
lib.py:
import __main__
__main__.Foo.BOOM = 'lib'
foo.py:
class Foo:
BOOM = 'Foooo'
if __name__ == '__main__':
import lib # I'm expecting BOOM to be set to 'lib'
print(Foo.BOOM)
Here is another solution:
lib.py:
import foo
foo.Foo.BOOM = 'lib'
foo.py:
class Foo:
BOOM = 'Foooo'
if __name__ == '__main__':
import sys
sys.modules['foo'] = sys.modules['__main__']
import lib # I'm expecting BOOM to be set to 'lib'
print(Foo.BOOM)
Here is a demo of what is actually going wrong:
foo.py:
class Foo:
inside = __name__
import foo
if __name__ == '__main__':
print(Foo is foo.Foo)
print(Foo.inside, foo.Foo.inside)
And here is a fix
foo.py:
if __name__ == '__main__':
import sys
sys.modules['foo'] = sys.modules['__main__']
class Foo:
inside = __name__
import foo
if __name__ == '__main__':
print(Foo is foo.Foo)
print(Foo.inside, foo.Foo.inside)
--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list