I have the following directory structure:
funniest/
setup.py
funniest/
__init__.py
ModuleA.py
ModuleB.py
# __init__.py
from numba import jit
from .ModuleA import ClassA
# ModuleA.py
import funniest.ModuleB
class ClassA():
pass
# ModuleB.py
@jit
def f():
pass
However, when importing the module, I get the error message:
>>> import funniest
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest /__init__.py", line 2, in <module>
from .ModuleA import ClassA
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest /ModuleA.py", line 1, in <module>
import funniest.ModuleB
File "/home/domi89/Dropbox/Python_Projects/funniest/funniest/ModuleB.py", line 1, in <module>
@jit
NameError: name 'jit' is not defined
I cannot understand why this happends, because when __init__.py
get executed first, the first thing it does is importing from numba import jit
. So why is jit
not defined when it comes to function f
in ModuleB
?
The imports you put in funniest/__init__.py
are only imported when you do import funniest
, not automatically inside submodules. So ModuleB
doesn't know about jit
.
What you need to do here is to move from numba import jit
from __init__.py
to ModuleB.py
.
The name jit
is not known inside ModuleB
. Python imports doesn't work like C/C++ includes that roll-out the code in place of the import
. A new module creates a new namespace with a map inside - a map with functions, classes, etc.
So when you did import funniest
, you created new map entry in the current namespace, like: {..., funniest: {}, ...}
. By importing funniest
, you imported jit
and ClassA
, so from the place when you imported the funniest
module, you have access to such map: funniest: {jit: {..}, ClassA: {...}}
.
In ModuleA
you imported ModuleB
, so in ModuleA
you have new variable ModuleB:{...}
with content of ModuleB
. But here you don't see the funniest
map - it is in other level in hierarchy.
And in ModuleB
, you don't see funniest
and ClassA
maps (namespaces - and whatever you like to call it;)).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With