Can't check only submodules (except if installed with `pip install -e .`)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
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
- 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"
-
Install the package with
pip install .OR do not install it at all. -
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the reported setup.py layout and reproduce the difference between mypy src/example_project/sub, -p example_project.sub, and an editable versus normal install. Compare diagnostics from calc.py and sub/foo.py, then trace the path-based module discovery behavior. Done means checking only the requested submodule produces the three expected errors without also checking calc.py.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100