【发布时间】:2019-02-13 19:04:10
【问题描述】:
背景
我在一个使用 Mypy 进行类型检查的大型 Python3 存储库中工作。按照PEP420我们不使用__init__.py文件。
Mypy 最近添加了对隐式命名空间包的支持,但现在的实现遵循来自给定入口点的import 语句链。在这个 repo 的情况下,(一个 Django 应用程序)有许多模块是动态导入的(如中间件)或根本不导入的(测试和一次性脚本)。
考虑这个例子:
my-py3-repo/
├── hello/
│ ├── services/
│ │ └── hello_service.py
│ └── hello.py
├── scripts/
│ ├── db/
│ │ └── migrate.py
│ └── manage.py
└── tests/
└── hello/
├── services/
│ └── hello_service_test.py
└── hello_test.py
假设hello.py 导入hello_service.py,hello 命名空间下的所有内容都将按预期使用mypy ./hello 进行类型检查。
问题
但是,pytest、nose、django 等的测试发现的工作方式不同,hello_test.py 通常不会导入 hello_service_test.py。 Mypy 目前无法通过mypy ./tests 发现hello_service_test.py(如果不使用__init__.py)。
同样,scripts 目录下的所有内容都会遇到同样的问题。
问题
如何配置 Mypy 以便始终对 scripts 和 tests 目录进行类型检查?
配置
# Pipfile
[dev-packages]
mypy = "==0.670"
[requires]
python_version = "3.7"
# setup.cfg
[mypy]
python_version = 3.7
ignore_missing_imports = True
namespace_packages = True
另请参阅我在 Mypy 存储库中创建的 this issue。
【问题讨论】:
标签: python django python-3.x mypy