__init__.py, __path__ and packaging
Sandro Dentella
sandro at e-den.it
Thu May 4 19:04:47 EDT 2006
In comp.lang.python, hai scritto:
> Sandro Dentella wrote:
>> The structure of my package:
>>
>> python/
>> `-- dbg/
>> |-- __init__.py
>> `-- lib
>> |-- __init__.py
>> |-- debug.py
>> `-- gtk_dbg.py
>>
>> my sys.path includes 'python' and I wanted that the content of debug.py was
>> simply included by: 'import dbg', so I wrote dbg/__init__.py as follows:
>>
>> import os
>> Dir = os.path.dirname(__file__)
>> __path__ = [os.path.join(Dir, 'lib')]
>> from debug import *
>
> What you probably want in python/dbg/__init__.py to get values is:
>
> from dbg.lib.debug import *
This does not work:
Traceback (most recent call last):
File "<string>", line 1, in ?
File "dbg/__init__.py", line 8, in ?
from dbg.lib.debug import *
ImportError: No module named lib.debug
>
>> BUT, if I set some variables they are not correctly seen:
>> import dbg
>> dbg.DBG = 1
>> function test included in debug.py raises NameError:
>> def test():
>> print DBG
>> NameError: global name 'DBG' is not defined`
>>
>> What's happening? DBG seems to be set, as shown by dir(dbg)... any hints?
> You misunderstand modules and python variables. Each module has a
> dictionary associating the names of its globals and their current
> values. After:
> import dbg.lib.debug, dbg.lib.gtk_dbg
> you have four modules:
> dbg # Corresponds to python/dbg/__init__.py
> dbg.lib # Corresponds to python/dbg/lib/__init__.py
> dbg.lib.debug # Corresponds to python/dbg/lib/debug.py
> dbg.lib.gtk_dbg # Corresponds to python/dbg/lib/gtk_dbg.py
> Each has its own globals.
> after:
> dbg.DBG = 1
> the dbg module's global dictionary contains an entry mapping 'DBG' to 1
> after:
> dbg.DBG = 1+2
> the dbg module's global dictionary contains an entry mapping 'DBG' to 3
>
> In no case will an assignment to a global in dbg cause an assignment to
> anything in dbg.lib.debug. The "from dbg.lib.debug import *" statement
> can be seen as a module import followed by a fancy multiple assignment,
> where module dbg.lib.debug is first imported, then its globals are
> assigned to globals of the same names in module dbg.
This confirms to me that I'm seriously confused... so I started with a very
simple setup:
$ cat dbg.py
DBG = 1
def test():
global DBG
print DBG
def set():
global DBG
DBG = 3
$ cat m.py
from dbg import *
test()
#dbg.DBG = 2 ## does not work, no way to assign in module dbg
set() # this acts in dbg module and sets 'DBG = 3'
test() # test the value of DBG
print DBG
$ python m.py
1
3 # changed by 'set' that was 'imported'
1 # value of local DBG
isn't this contraddicting you words:
> can be seen as a module import followed by a fancy multiple assignment,
> where module dbg.lib.debug is first imported, then its globals are
> assigned to globals of the same names in module dbg.
So: which is the way I can change a value of a package 'imported', only with
a function that sets it? is there a way to assign the value directly?
is there any way to make some introspection of what is really there (in
dbg)?
Thanks angain for any possible hint.
sandro
*:-)
--
Sandro Dentella *:-)
http://www.tksql.org TkSQL Home page - My GPL work
More information about the Python-list
mailing list