python / mypy

Optional static typing for Python
https://www.mypy-lang.org/
Other
18.55k stars 2.84k forks source link

`--untyped-calls-exclude` does not exclude some packages/libraries #17699

Open schuylermartin45 opened 3 months ago

schuylermartin45 commented 3 months ago

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:

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

schuylermartin45 commented 3 months ago

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