python / python/mypy

Can't check only submodules (except if installed with `pip install -e .`)

未关闭
#15,655 1 条评论 3 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

bug
主要语言
Python
星标
20.6k
派生
3.3k
PR 合并指标
PR 指标待抓取

描述

Bug Report

Checking a submodule only of a project seems impossible, when not installed using pip install -e .

Usecase:
I have project that contains auto-generated API code which is not correctly typed.
I only want to check the controllers that are located in a submodule.

To Reproduce

  1. Create a example project with the following structure
.
├── setup.py
└──src
    └── example_project
        ├── __init__.py
        ├── calc.py
        ├── py.typed
        └── sub
            ├── __init__.py
            └── foo.py

src/example_project/calc.py :

def int_add(a: int, b: int) -> int:
    """
    Simply add two numbers
    """
    return a + b


def float_diff(a: float, b: float) -> float:
    """
    Diff two numbers
    """
    return a / b


if __name__ == "__main__":
    int_add("a", "b")

src/ems_example_project/sub/foo.py:

import example_project.calc

example_project.calc.int_add("foo", "bar")

a: int = 1
a = "2"
  1. Install the package with pip install . OR do not install it at all.

  2. Run mypy for the given submodule

mypy src/example_project/sub

Expected Behavior

Only type errors for the submodule are found:

src/example_project/sub/foo.py:3: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]
Found 3 errors in 1 file (checked 2 source files)

This actually works, if I install the package with pip install -e ..
But I expect this to work no matter if I install the package normally or not installing it at all.

Actual Behavior

The type errors for the top level modules are also listed.

src/example_project/calc.py:21: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/calc.py:21: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 1 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:3: error: Argument 2 to "int_add" has incompatible type "str"; expected "int"  [arg-type]
src/example_project/sub/foo.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]
Found 5 errors in 2 files (checked 2 source files)

If I use the option -p example_project.sub instead of the path it works as expected. But in my environment I am only able to add specific files (think pre-commit or similar).
It also works if I install the package using pip install -e.
Still I would not expect a such a difference just depending on how I installed the package.

Your Environment

  • Mypy version used: 1.4.1
  • Mypy command-line flags: none besides the path to the file
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.9.16

This might be related to:

  • #10956
  • #10260
  • #6861
  • #10428

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从报告中的 setup.py 布局开始,复现 mypy src/example_project/sub-p example_project.sub 以及 editable 安装与普通安装之间的差异。比较 calc.py 和 sub/foo.py 的诊断结果,然后跟踪基于路径的模块发现行为。完成标准是:仅检查请求的子模块时产生预期的三个错误,同时不检查 calc.py。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
devtools
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。