access to submodules

T

TG

hi.

This is my first try on modules.

I've got :

tom/
__init__.py
core.py
ui.py
data.py

then, when I'm in my ipython shell :

?> from tom import *


this works, it loads core, ui and data
but when I do this :


?> import tom

?> tom.core
AttributeError: 'module' object has no attribute 'core'


Well, i guess I missed something, but I don't see what ...
 
T

TG

I've just found this :

If I add :

"import core, data, ui" inside my "tom/__init__.py" file, it will
work. But this line does not seems to exist in other files (after
having a look at several files inside /usr/lib/python2.4).
 
B

BartlebyScrivener

from tom import *

You CAN do this, but it's a bad habit.

Try:

Then call by tom.function()

rd
 
T

TG

I know this is a bad habit ... I was just doing it to show what is
disturbing me.

Obviously the "star" syntax finds the submodules because they are
loaded, but when I properly load the module alone with "import tom",
the "dot" syntax does not find "tom.core".
 
T

TG

BartlebyScrivener said:
then you no longer need tom, you imported all of his FUNCTIONS (never
heard of submodule).

my mistake, I was using the wrong name

tom/ <-- package
__init__.py
core.py <
data.py < these are modules contained in tom/
ui.py <


if I import tom, it is supposed to load functions defined in
tom/__init__.py and make all the modules inside accessible through the
"dot" syntax.

Therefore, this is supposed to work :

?> import tom
?> help(tom.core)

AttributeError: 'module' object has no attribute 'core'

But if I use the baaaaad star syntax

?> from tom import *
?> help(core)

this will work. So that means star loaded functions of __init__.py AND
modules contained, whereas dot syntax does not give me access to
modules inside. The issue is not about using or not using the import *
....
 
P

Peter Otten

TG said:
if I import tom, it is supposed to load functions defined in
tom/__init__.py and make all the modules inside accessible through the
"dot" syntax.

Therefore, this is supposed to work :

?> import tom
?> help(tom.core)

AttributeError: 'module' object has no attribute 'core'

But if I use the baaaaad star syntax

?> from tom import *
?> help(core)

this will work.

No, it won't. Try again with a fresh interpreter (no prior imports)
Traceback (most recent call last):
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'core'

Only after an explicit import of tom.core...
<module 'tom.core' from 'tom/core.py'>

is core added as an attribute to tom and will therefore be copied into the
namespace of a module doing a star-import.

Peter
 
T

TG

okay,

so only when I have inside __init__.py

__all__ = ["core"]

this works

?> from tom import *
?> help(core)

but (in a brand new interpretor)

?> import tom
?> help(tom.core)

AttributeError: 'module' object has no attribute 'core'

got it. But ...

?> import numpy
?> help(numpy.core)

this will work, even if core is a subpackage of numpy. and i don't have
to explicitly import numpy.core.

I must be missing something ... :-/
 
P

Peter Otten

TG said:
okay,

so only when I have inside __init__.py

__all__ = ["core"]

this works

?> from tom import *
?> help(core)

but (in a brand new interpretor)

?> import tom
?> help(tom.core)

AttributeError: 'module' object has no attribute 'core'

got it. But ...

?> import numpy
?> help(numpy.core)

this will work, even if core is a subpackage of numpy. and i don't have
to explicitly import numpy.core.

I must be missing something ... :-/

numpy does the equivalent of

import core

in its __init__.py

"""
Help on method __call__ in module numpy._import_tools:

__call__(self, *packages, **options) unbound
numpy._import_tools.PackageLoader method
Load one or more packages into parent package top-level namespace.

Usage:

This function is intended to shorten the need to import many of
subpackages, say of scipy, constantly with statements such as

import scipy.linalg, scipy.fftpack, scipy.etc...

Instead, you can say:

import scipy
scipy.pkgload('linalg','fftpack',...)
"""

Peter
 
D

Dennis Lee Bieber

I must be missing something ... :-/

Like... maybe the fact that the numpy __init__.py file has lots of
executable code to explicitly load the packages?

from _import_tools import PackageLoader
pkgload = PackageLoader()
pkgload('testing','core','lib','linalg','dft','random','f2py',
verbose=NUMPY_IMPORT_VERBOSE,postpone=False)
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top