Consider the following hierarchy of three regular packages and their contents:
quick
├── brown
│ ├── fox.py
│ └── __init__.py
├── lazy
│ ├── dog.py
│ └── __init__.py
└── __init__.py
Now suppose there is a function jump in module dog and it is needed in module fox. How should I proceed?
Having recently seen Raymond Hettinger's talk at Pycon
2015 I would the like
the function to be directly importable from the root of package lazy,
like this:
from lazy import jump
Also, it seems to me that writing relative imports is more concise and
makes the intra-package connections easily visible. Hence, I'd write
this into lazy/__init__.py:
from .dog import jump
And this into fox.py:
from ..lazy import jump
But I wonder, is this the right way?
First, importing the name jump in lazy/__init__.py does nothing to
prevent it from being imported directly from dog. Can it cause problems if a function is potentially imported from many places? For instance, in unit testing, can we possibly monkey patch the name from a wrong location?
Moreover, IDEs with their auto-import routines seem to prefer importing from the module where the function is defined. I could perhaps override this by putting character _ in front of all module names, but this seems a bit impractical.
Is it otherwise dangerous to bring all names that are needed outside a
package to __init__.py? Probably this at least increases the
possibility of circular imports. But I guess that if a circular
import is encountered there is something fundamentally wrong with the
package structure anyway.
What about the relative imports? PEP 8 says that absolute imports are recommended: what does it mean when it says that absolute imports behave better than the relative ones? Can you give me an example?