A flake8 plugin to ban PEP-420 implicit namespace packages.
Project description
A flake8 plugin to ban PEP-420 implicit namespace packages.
Requirements
Python 3.7 to 3.10 supported.
Installation
First, install with pip:
python -m pip install flake8-no-pep420
Second, if you define Flake8’s select setting, add the INP prefix to it. Otherwise, the plugin should be active by default.
Linting a Django project? Check out my book Boost Your Django DX which covers Flake8 and many other code quality tools.
Rationale
Implicit namespace packages are directories of Python files without an __init__.py. They’re valid and importable, but unfortunately they’re silently ignored by many tools, like:
unittest test discovery (and by extension, Django’s test runner)
Mypy without its –namespace-packages option
Such silent failure leads to a false sense of security:
Tests may look legitimate but never run
Code may be untested but not affect coverage statistics
Types may never be checked
PEP-420’s algorithm is non-trivial which is probably why such tools haven’t (yet) implemented it.
Rules
INP001: File is part of an implicit namespace package. Add __init__.py?
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flake8_no_pep420-2.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a1622f03be67609b81a9e6790e7e69c310eb6fbd7bb81817f7fb91902312bc76 |
|
MD5 | 7b02293399b04ce10870e875120dc441 |
|
BLAKE2b-256 | e158ed4ea9da6b492a598135a2a6f8f4a78743245c9bad47fe58efecca874cef |