Python Importing object that originates in one module from a different module into a third module
import, python
Solution
If module `a` does a `from b import Foo`, then `Foo` is a member of `a` afterwards and accessible as `a.Foo`. It's only consequent that you can now import it too using `from a import Foo`.
This is commonly used if you have a large library distributed across multiple files and you want them to be accessible from a single location. Let's say you have a package `foo` with the following layout:
foo/
a.py
b.py
c.py
__init__.py
`a.py`, `b.py`, `c.py`, define the classes `A`, `B` and `C`, respectively.
If you wanted to use those classes, you'd normally have to write
from foo.a import A
from foo.b import B
from foo.c import C
This has at least two problems:
- Much code (three lines) is needed for this simple import
- The library author can now no longer change the file/class association afterwards, because that would break existing code.
So normally you just put the following in the `__init__.py`:
from a import A
from b import B
from c import C
Now you put all the pieces together in a single place and all of the classes are accessible with one import:
from foo import A,B,C
Problem
I was reading the sourcode for a python project and came across the following line: ``` from couchexport.export import Format ``` (source: https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1 ) I went over to `couchexport/export.py` to see what `Format` was (Class? Dict? something else?). Unfortunately `Format` isn't in that file. `export.py` does however import a `Format` from couchexport.models where there is a `Format` class (source: https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11). When I open up the original file in my IDE and have it look up the declaration, in line I mentioned at the start of this question, it leads directly to models.py. What's going on? How can an import from one file (`export.py`) actually be an import from another file (`models.py`) without being explicitly stated?