A flake8 plugin to ban PEP-420 implicit namespace packages.
Linting a Django project? Check out my book Boost Your Django DX which covers Flake8 and many other code quality tools.
Python 3.10 to 3.14 supported.
First, install with pip:
python -m pip install flake8-no-pep420Second, if you define Flake8’s select setting, add the INP prefix to it.
Otherwise, the plugin should be active by default.
Implicit namespace packages are directories of Python files without an __init__.py.
They’re valid and importable, but they break some tools:
- unittest test discovery, unless
-s(--start-directory) points to the namespace package. By extension, this affects Django’s test runner too. - Coverage.py, unless
report.include_namespace_packagesis enabled. - pytest (Issue #5147)
In most cases, tools fail silently, which can lead to a false sense of security:
- Tests may look legitimate but never run
- Code may be untested but not appear in coverage statistics
PEP-420’s algorithm is non-trivial which is probably why such tools haven’t (yet) implemented it.
flake8-no-pep420 will trigger this on the first line of any file that sits in a directory without an __init__.py file.
Often projects have a few root files not in packages, for which an __init__.py file should not be added.
For example, Django projects normally have a manage.py file in the root of their repository.
In these cases you can ignore the INP001 error.
It’s possible to use # noqa: INP001 to ignore the error in-line, but this isn’t possible if the first line is a shebang, such as in Django’s manage.py.
In such cases it’s preferable to use Flake8’s per-file-ignores option, for example in setup.cfg:
[flake8]
# ...
per-file-ignores =
manage.py:INP001