Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Messing up with classes and their namespace

Reply
Thread Tools

Messing up with classes and their namespace

 
 
Jean-Michel Pichavant
Guest
Posts: n/a
 
      06-05-2009
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.

This is how I made it work:
>if __name__=='__main__':
> from lib import Foo # make sure Foo comes from lib
> print Foo.BOOM



I guess there is 2 different objects for the same class Foo. How I do I
make both Foo objects the same object ?

Jean-Michel
 
Reply With Quote
 
 
 
 
Jean-Michel Pichavant
Guest
Posts: n/a
 
      06-05-2009
Scott David Daniels wrote:
> 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
> http://www.velocityreviews.com/forums/(E-Mail Removed)


Thanks for the explanation. I'll have to give it a second thought, I'm
still missing something but I'll figure it out.

Jean-Michel
 
Reply With Quote
 
 
 
 
Terry Reedy
Guest
Posts: n/a
 
      06-05-2009
Jean-Michel Pichavant wrote:

> Thanks for the explanation. I'll have to give it a second thought, I'm
> still missing something but I'll figure it out.


Perhaps it is this:
1. When you run foo.py as a script, the interpreter creates module
'__main__' by executing the code in foo.py.
2. When that code does 'import lib', the interpreter looks for an
existing module named 'lib', does not find it, and creates module 'lib'
by executing the code in lib.py.
3. When that code does 'import foo', the interpreter looks for an
existing module named 'foo', does not find it, and creates module 'foo'
by executing (again) the code in foo.py.

Module 'foo' is slightly different from module '__main__', created from
the same code, because of the section conditioned by 'if __name__ ==
'__main__', that being the purpose of that incantation. But each of the
two modules have their own class Foo. You sort of guessed this ...

> I guess there is 2 different objects for the same class Foo.


They are the same in content, but not in identify, until you change one
of then.

> How I do I make both Foo objects the same object ?


As Scott hinted, by not making two of them, and you do that by not
making two modules from the same file.

Terry Jan Reedy

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Prophets are honored by everyone, except the people of their hometownand their own family. Eljee Digital Photography 8 09-21-2006 05:35 AM
how to link classes using pointers of their derived classes ivan.leben@gmail.com C++ 6 09-07-2006 07:00 AM
Since MSN CHAT went pay per use. Is their any other free ones out their Hugh Computer Support 8 05-19-2004 05:52 PM
What the pros use to power their flashes... and their digital cameras. Dan Sullivan Digital Photography 21 01-04-2004 04:40 PM
Stop Spammers by Hitting Their Servers - Not Their Email. Magic347 Computer Support 27 07-03-2003 04:36 PM



Advertisments