`--untyped-calls-exclude` does not exclude some packages/libraries
Bug Report I have not been able to find any issues discussing a similar situation, so I'm filing this bug. I apologize in advanced if this is just a configuration issue. As best as I can currently tell, this appears to be a bug.
I have an experimental branch on conda-recipe-manager that uses conda's MatchSpec module and the networkx library. I can use --untyped-calls-exclude to prevent type checking on any use of the MatchSpec class, but I cannot do the same for anything in the networkx library. I have tried just excluding networkx in our mypy.ini file and that does not resolve my issue.
This is speculation at this point, but conda is packaged with a py.typed file, even though not every module has type annotations. networkx does not announce or include any typing. I think that might be causing a rule to fire before the exclusion rule takes effect. I say this because everything I've tried causes the following error messages to be emitted, and I do not get these errors when I exclude MatchSpec:
error: Skipping analyzing "networkx": module is installed, but missing library stubs or
py.typed marker [import-untyped]
import networkx as nx
^
error: Skipping analyzing "networkx.drawing.nx_agraph": module is installed, but
missing library stubs or py.typed marker [import-untyped]
from networkx.drawing.nx_agraph import graphviz_layout
I have run into this issue on mypy versions 1.10 and 1.11.
Things I have tried but have not gotten to work:
- Only excluding
networkx(either by.mypy.inior through the command line - Setting
disallow_any_unimportedtoFalse - Using
import networkxwithout aliasing tonx - Specifically excluding
networkx.drawing.nx_agraphin addition and without excludingnetworkxdirectly
If I do not exclude MatchSpec, I receive this error upon invoking the constructor:
error: Call to untyped function "MatchSpec" in typed context [no-untyped-call]
And then a error: Expression has type "Any" [misc] on any line referencing the instantiated MatchSpec object.
To Reproduce
import networkx as nx
foo0 = nx.DiGraph() # error: Expression has type "Any" [misc]
from conda.models.MatchSpec:
foo1 = MatchSpec("") # Works fine when excluded. If not excluded, generates: error: Call to untyped function "MatchSpec" in typed context [no-untyped-call]
print(foo1.name) # Works fine when excluded. If not exclude, generates: error: Expression has type "Any" [misc]
Here is our .mypy.ini
[mypy]
# Adapted from this StackOverflow post:
# https://stackoverflow.com/questions/55944201/python-type-hinting-how-do-i-enforce-that-project-wide
python_version = 3.11
# This flag enhances the user feedback for error messages
pretty = True
# Disallow dynamic typing
disallow_any_unimported = True
disallow_any_expr = True
disallow_any_decorated = True
disallow_any_generics = True
disallow_any_explicit = True
disallow_subclassing_any = True
# Disallow untyped definitions and calls
disallow_untyped_calls = True
# Exceptions for untyped external modules
untyped_calls_exclude = conda.models.match_spec, networkx
disallow_untyped_defs = True
disallow_incomplete_defs = True
check_untyped_defs = True
disallow_untyped_decorators = True
# None and optional handling
no_implicit_optional = True
# Configuring warnings
warn_unused_ignores = True
warn_no_return = True
warn_return_any = True
warn_redundant_casts = True
warn_unreachable = True
# Misc things
strict_equality = True
# Config file
warn_unused_configs = True
Expected Behavior
I would expect that any module used from networkx would skip type-evaluation. In other words, I would expect using --untyped-calls-exclude to ignore all usage from networkx. This appears to be what happens when MatchSpec is used with the --untyped-calls-excluded option.
Actual Behavior
mypy produces many errors when networkx is used in our project because it does not ship with any type annotations.
Your Environment
- Mypy version used: 1.10.0 and 1.11.1
- Mypy command-line flags:
mypy --config-file=.mypy.ini --cache-dir=/dev/null conda_recipe_manager/ tests/ scripts/ - Mypy configuration options from
mypy.ini(and other config files): (See above.mypy.ini) - Python version used: 3.12.4
I decided to put-up a draft PR of that experimental branch I mentioned earlier. Here it is: https://github.com/conda-incubator/conda-recipe-manager/pull/103