python / mypy

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

mypy assumes `importlib.metadata` is implicitly imported via `importlib`? #18153

Open asottile-sentry opened 1 week ago

asottile-sentry commented 1 week ago

Bug Report

mypy seems to assume that import importlib brings in the relevant submodules (though I can't see anything in typeshed that would indicate this?) even though it does not

importlib.metadata is not implicitly brought in by importlib:

$ python3 -c 'import importlib; importlib.metadata'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'metadata'

To Reproduce

import importlib

reveal_type(importlib.metadata)  # expected error but none?

import urllib

reveal_type(urllib.parse)  # similar situation but properly errors!

Expected Behavior

I expect two errors, but I only get one

Actual Behavior

$ mypy t.py
t.py:3: note: Revealed type is "types.ModuleType"
t.py:7: error: Module has no attribute "parse"  [attr-defined]
t.py:7: note: Revealed type is "Any"
Found 1 error in 1 file (checked 1 source file)

Your Environment

brianschubert commented 1 week ago

It looks like this happens because importlib indirectly imports importlib.metadata in typeshed (importlib imports importlib.abc which imports importlib._bootstrap_external which imports _frozen_importlib_external which finally imports importlib.metadata), so mypy considers importlib.metadata to exist, despite this not being the case at runtime.