Требование для __init__.py только для удовлетворения pylint и mypy - PullRequest
1 голос
/ 10 июля 2020

У меня есть проект со следующей (частичной) структурой каталогов

.
├── mypy.ini
├── src
│   ├── preppy
│   │   ├── cli.py
│   │   ├── __main__.py
│   │   ├── model.py
│   │   └── tools.py
├── pyproject.toml
└── tests

В cli.py у меня есть следующий код (строки 13 и 14 в файле):

from .model import Problem
from .tools import get_abs_path, transcode

У меня также есть аналогичные стили относительного импорта в model.py и __main__.py Все похожие импорта вызывают ошибки как в pylint (2.5.3), так и mypy (0,761), когда инструменты автоматически запускаются в моей среде IDE ( Код - OSS), например:

Attempted relative import beyond top-level package pylint(relative-beyond-top-level) [13,1]
Cannot find implementation or library stub for module named '.model' mypy(error) [13,1]
Attempted relative import beyond top-level package pylint(relative-beyond-top-level) [14,1]
Cannot find implementation or library stub for module named '.tools' mypy(error) [14,1]
See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports mypy(note) [13,1]

Когда я добавляю в папку пустой файл __init__.py, ошибки исчезают.

Мне это не нужно __init__.py файл, чтобы пакет работал.

Я думал, что после PEP 420 он не должен требоваться, особенно если он нужен только для работы с линтерами.

Есть что-то иначе я делаю неправильно, или мне просто добавить __init__.py и преодолеть это :)?

Конфигурация для pylint находится в pyproject.toml:

[tool.pylint.'MESSAGES CONTROL']
# Pylint and black disagree on hanging indentation.
disable = "C0330"

[tool.pylint.MISCELLANEOUS]
# Note: By default, "TODO" is flagged, this is disabled by omitting it
#       from the list below.
notes = "FIXME,XXX"

Конфигурация для mypy находится в mypy.ini:

[mypy]
disallow_untyped_calls = True
disallow_untyped_defs = True
disallow_incomplete_defs = True
disallow_untyped_decorators = True
mypy_path = src
namespace_packages = True

[mypy-openpyxl]
ignore_missing_imports = True

[mypy-pulp]
ignore_missing_imports = True

[mypy-pytest]
ignore_missing_imports = True

Я бегу python 3.8.0.

1 Ответ

2 голосов
/ 10 июля 2020

PEP 420 не позволяет «создать пакет, пропустив __init__.py», он заставляет «создавать пространство имен пакет, опуская * 1008. * ". Это означает:

  • Если вам нужен пакет, добавьте __init__.py.
  • Если вы хотите пространство имен пакет, опустите __init__.py.

Хотя использование пакета пространства имен, как и обычный пакет, обычно работает, он может неожиданно дать сбой, если пакет именуется cla sh. В большинстве случаев пакет пространства имен нежелателен.

...