mypy icon indicating copy to clipboard operation
mypy copied to clipboard

stubtest: Fix `TypeType` subtyping problem

Open sobolevn opened this issue 3 years ago • 8 comments

Now this passes:

# STUB
class Meta(type): ...
class Y(metaclass=Meta): ...
class Z:
    foo: type[Y]

# RUNTIME:
class Meta(type): ...
class Y(metaclass=Meta): ...
class Z:
    foo = Y

Closes #13316

sobolevn avatar Aug 09 '22 09:08 sobolevn

I will also add type/instance mismatch tests in a moment 🤔

sobolevn avatar Aug 09 '22 09:08 sobolevn

I will also add type/instance mismatch tests in a moment 🤔

Would be good to test ABCMeta specifically, as well, given how much it's special-cased by mypy!

AlexWaygood avatar Aug 09 '22 09:08 AlexWaygood

@AlexWaygood any specific case that you have in mind?

sobolevn avatar Aug 09 '22 10:08 sobolevn

@AlexWaygood any specific case that you have in mind?

The ones you added look good!

AlexWaygood avatar Aug 09 '22 10:08 AlexWaygood

It seems like this would be very disruptive for typeshed:

New hits from running typeshed's `stubtest_stdlib.py`, with this PR checked out, relative to mypy master
diff --git a/old_hits.txt b/new_hits.txt
index 419ea740..3e52a198 100644
--- a/old_hits.txt
+++ b/new_hits.txt
@@ -1,11 +1,372 @@
+error: argparse.ArgumentParser.__init__ is inconsistent, runtime argument "formatter_class" has a default value of type Type[argparse.HelpFormatter], which is incompatible with stub argument type argparse._FormatterClass
+Stub: at line 131 in file stdlib\argparse.pyi
+def (self: argparse.ArgumentParser, prog: Union[builtins.str, None] =, usage: Union[builtins.str, None] =, description: Union[builtins.str, None] =, epilog: Union[builtins.str, None] =, parents: typing.Sequence[argparse.ArgumentParser] =, formatter_class: argparse._FormatterClass =, prefix_chars: builtins.str =, fromfile_prefix_chars: Union[builtins.str, None] =, argument_default: Any =, conflict_handler: builtins.str =, add_help: builtins.bool =, allow_abbrev: builtins.bool =, exit_on_error: builtins.bool =)
+Runtime: at line 1694 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\argparse.py
+def (self, prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=<class 'argparse.HelpFormatter'>, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)
+
+error: asyncio.DefaultEventLoopPolicy._loop_factory variable differs from runtime type Type[asyncio.windows_events.ProactorEventLoop]
+Stub: at line 62 in file stdlib\asyncio\__init__.pyi
+Type[asyncio.windows_events._WindowsSelectorEventLoop]
+Runtime: at line 309 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py
+<class 'asyncio.windows_events.ProactorEventLoop'>
+
+error: asyncio.windows_events.DefaultEventLoopPolicy._loop_factory variable differs from runtime type Type[asyncio.windows_events.ProactorEventLoop]
+Stub: at line 62 in file stdlib\asyncio\windows_events.pyi
+Type[asyncio.windows_events._WindowsSelectorEventLoop]
+Runtime: at line 309 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py
+<class 'asyncio.windows_events.ProactorEventLoop'>
+
+error: ctypes.CDLL._func_restype_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 21 in file stdlib\ctypes\__init__.pyi
+ctypes._CData
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.LPBOOL._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.LPBYTE._type_ variable differs from runtime type Type[ctypes.c_byte]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 228 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_byte'>
+
+error: ctypes.wintypes.LPCOLORREF._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.LPDWORD._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.LPFILETIME._type_ variable differs from runtime type Type[ctypes.wintypes.FILETIME]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 128 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.FILETIME'>
+
+error: ctypes.wintypes.LPHANDLE._type_ variable differs from runtime type Type[ctypes.c_void_p]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 244 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_void_p'>
+
+error: ctypes.wintypes.LPHKL._type_ variable differs from runtime type Type[ctypes.c_void_p]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 244 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_void_p'>
+
+error: ctypes.wintypes.LPINT._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.LPLONG._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.LPMSG._type_ variable differs from runtime type Type[ctypes.wintypes.MSG]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 133 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.MSG'>
+
+error: ctypes.wintypes.LPPOINT._type_ variable differs from runtime type Type[ctypes.wintypes.POINT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 115 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.POINT'>
+
+error: ctypes.wintypes.LPRECT._type_ variable differs from runtime type Type[ctypes.wintypes.RECT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 97 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.RECT'>
+
+error: ctypes.wintypes.LPRECTL._type_ variable differs from runtime type Type[ctypes.wintypes.RECT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 97 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.RECT'>
+
+error: ctypes.wintypes.LPSC_HANDLE._type_ variable differs from runtime type Type[ctypes.c_void_p]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 244 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_void_p'>
+
+error: ctypes.wintypes.LPSIZE._type_ variable differs from runtime type Type[ctypes.wintypes.SIZE]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 120 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.SIZE'>
+
+error: ctypes.wintypes.LPSIZEL._type_ variable differs from runtime type Type[ctypes.wintypes.SIZE]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 120 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.SIZE'>
+
+error: ctypes.wintypes.LPUINT._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.LPWIN32_FIND_DATAA._type_ variable differs from runtime type Type[ctypes.wintypes.WIN32_FIND_DATAA]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 143 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.WIN32_FIND_DATAA'>
+
+error: ctypes.wintypes.LPWIN32_FIND_DATAW._type_ variable differs from runtime type Type[ctypes.wintypes.WIN32_FIND_DATAW]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 155 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.WIN32_FIND_DATAW'>
+
+error: ctypes.wintypes.LPWORD._type_ variable differs from runtime type Type[ctypes.c_ushort]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 167 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ushort'>
+
+error: ctypes.wintypes.PBOOL._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.PBOOLEAN._type_ variable differs from runtime type Type[ctypes.c_byte]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 228 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_byte'>
+
+error: ctypes.wintypes.PBYTE._type_ variable differs from runtime type Type[ctypes.c_byte]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 228 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_byte'>
+
+error: ctypes.wintypes.PCHAR._type_ variable differs from runtime type Type[ctypes.c_char]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 233 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_char'>
+
+error: ctypes.wintypes.PDWORD._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.PFILETIME._type_ variable differs from runtime type Type[ctypes.wintypes.FILETIME]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 128 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.FILETIME'>
+
+error: ctypes.wintypes.PFLOAT._type_ variable differs from runtime type Type[ctypes.c_float]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 192 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_float'>
+
+error: ctypes.wintypes.PHANDLE._type_ variable differs from runtime type Type[ctypes.c_void_p]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 244 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_void_p'>
+
+error: ctypes.wintypes.PHKEY._type_ variable differs from runtime type Type[ctypes.c_void_p]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 244 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_void_p'>
+
+error: ctypes.wintypes.PINT._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.PLARGE_INTEGER._type_ variable differs from runtime type Type[ctypes.c_longlong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 210 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_longlong'>
+
+error: ctypes.wintypes.PLCID._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.PLONG._type_ variable differs from runtime type Type[ctypes.c_long]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 171 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_long'>
+
+error: ctypes.wintypes.PMSG._type_ variable differs from runtime type Type[ctypes.wintypes.MSG]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 133 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.MSG'>
+
+error: ctypes.wintypes.PPOINT._type_ variable differs from runtime type Type[ctypes.wintypes.POINT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 115 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.POINT'>
+
+error: ctypes.wintypes.PPOINTL._type_ variable differs from runtime type Type[ctypes.wintypes.POINT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 115 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.POINT'>
+
+error: ctypes.wintypes.PRECT._type_ variable differs from runtime type Type[ctypes.wintypes.RECT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 97 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.RECT'>
+
+error: ctypes.wintypes.PRECTL._type_ variable differs from runtime type Type[ctypes.wintypes.RECT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 97 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.RECT'>
+
+error: ctypes.wintypes.PSHORT._type_ variable differs from runtime type Type[ctypes.c_short]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 163 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_short'>
+
+error: ctypes.wintypes.PSIZE._type_ variable differs from runtime type Type[ctypes.wintypes.SIZE]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 120 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.SIZE'>
+
+error: ctypes.wintypes.PSIZEL._type_ variable differs from runtime type Type[ctypes.wintypes.SIZE]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 120 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.SIZE'>
+
+error: ctypes.wintypes.PSMALL_RECT._type_ variable differs from runtime type Type[ctypes.wintypes._SMALL_RECT]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 104 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes._SMALL_RECT'>
+
+error: ctypes.wintypes.PUINT._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.PULARGE_INTEGER._type_ variable differs from runtime type Type[ctypes.c_ulonglong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 214 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulonglong'>
+
+error: ctypes.wintypes.PULONG._type_ variable differs from runtime type Type[ctypes.c_ulong]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 175 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ulong'>
+
+error: ctypes.wintypes.PUSHORT._type_ variable differs from runtime type Type[ctypes.c_ushort]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 167 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ushort'>
+
+error: ctypes.wintypes.PWCHAR._type_ variable differs from runtime type Type[ctypes.c_wchar]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 259 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_wchar'>
+
+error: ctypes.wintypes.PWIN32_FIND_DATAA._type_ variable differs from runtime type Type[ctypes.wintypes.WIN32_FIND_DATAA]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 143 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.WIN32_FIND_DATAA'>
+
+error: ctypes.wintypes.PWIN32_FIND_DATAW._type_ variable differs from runtime type Type[ctypes.wintypes.WIN32_FIND_DATAW]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 155 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
+<class 'ctypes.wintypes.WIN32_FIND_DATAW'>
+
+error: ctypes.wintypes.PWORD._type_ variable differs from runtime type Type[ctypes.c_ushort]
+Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
+Type[_CT`1]
+Runtime: at line 167 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\__init__.py
+<class 'ctypes.c_ushort'>
+
+error: dataclasses.asdict is inconsistent, runtime argument "dict_factory" has a default value of type Type[builtins.dict[Any, Any]], which is incompatible with stub argument type def (builtins.list[Tuple[builtins.str, Any]]) -> _T`-1. This is often caused by overloads failing to account for explicitly passing in the default value.
+Stub: at line 46 in file stdlib\dataclasses.pyi
+Overload(def (obj: Any) -> builtins.dict[builtins.str, Any], def [_T] (obj: Any, *, dict_factory: def (builtins.list[Tuple[builtins.str, Any]]) -> _T`-1) -> _T`-1)
+Inferred signature: def (obj: Any, *, dict_factory: def (builtins.list[Tuple[builtins.str, Any]]) -> _T`-1 = ...)
+Runtime: at line 1218 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\dataclasses.py
+def (obj, *, dict_factory=<class 'dict'>)
+
+error: dataclasses.astuple is inconsistent, runtime argument "tuple_factory" has a default value of type Type[builtins.tuple[Any, ...]], which is incompatible with stub argument type def (builtins.list[Any]) -> _T`-1. This is often caused by overloads failing to account for explicitly passing in the default value.
+Stub: at line 50 in file stdlib\dataclasses.pyi
+Overload(def (obj: Any) -> builtins.tuple[Any, ...], def [_T] (obj: Any, *, tuple_factory: def (builtins.list[Any]) -> _T`-1) -> _T`-1)
+Inferred signature: def (obj: Any, *, tuple_factory: def (builtins.list[Any]) -> _T`-1 = ...)
+Runtime: at line 1283 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\dataclasses.py
+def (obj, *, tuple_factory=<class 'tuple'>)
+
+error: dbm.error variable differs from runtime type Tuple[Tuple[Type[dbm._error], Type[builtins.OSError]], Type[builtins.OSError]]
+Stub: at line 92 in file stdlib\dbm\__init__.pyi
+Tuple[Type[dbm._error], Type[builtins.OSError]]
+Runtime:
+(<class 'dbm.error'>, <class 'OSError'>)
+
+error: email.headerregistry.HeaderRegistry.__init__ is inconsistent, runtime argument "default_class" has a default value of type Type[email.headerregistry.UnstructuredHeader], which is incompatible with stub argument type Type[email.headerregistry.BaseHeader]
+Stub: at line 145 in file stdlib\email\headerregistry.pyi
+def (self: email.headerregistry.HeaderRegistry, base_class: Type[email.headerregistry.BaseHeader] =, default_class: Type[email.headerregistry.BaseHeader] =, use_default_map: builtins.bool =)
+Runtime: at line 566 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\email\headerregistry.py
+def (self, base_class=<class 'email.headerregistry.BaseHeader'>, default_class=<class 'email.headerregistry.UnstructuredHeader'>, use_default_map=True)
+
 error: locale names exported from the stub do not correspond to the names exported at runtime. This is probably due to an inaccurate `__all__` in the stub or things being missing from the stub.
 Stub: in file stdlib\locale.pyi
 Names exported in the stub but not at runtime: ['LC_MESSAGES']
 Runtime:
 Names exported at runtime but not in the stub: []
 
+error: wsgiref.simple_server.make_server is inconsistent, runtime argument "server_class" has a default value of type Type[wsgiref.simple_server.WSGIServer], which is incompatible with stub argument type Type[_S`-1]. This is often caused by overloads failing to account for explicitly passing in the default value.
+Stub: at line 34 in file stdlib\wsgiref\simple_server.pyi
+Overload(def (host: builtins.str, port: builtins.int, app: def (builtins.dict[builtins.str, Any], _typeshed.wsgi.StartResponse) -> typing.Iterable[builtins.bytes], *, handler_class: Type[wsgiref.simple_server.WSGIRequestHandler] =) -> wsgiref.simple_server.WSGIServer, def [_S <: wsgiref.simple_server.WSGIServer] (host: builtins.str, port: builtins.int, app: def (builtins.dict[builtins.str, Any], _typeshed.wsgi.StartResponse) -> typing.Iterable[builtins.bytes], server_class: Type[_S`-1], handler_class: Type[wsgiref.simple_server.WSGIRequestHandler] =) -> _S`-1)
+Inferred signature: def (host: builtins.str, port: builtins.int, app: def (builtins.dict[builtins.str, Any], _typeshed.wsgi.StartResponse) -> typing.Iterable[builtins.bytes], server_class: Type[_S`-1] = ..., handler_class: Type[wsgiref.simple_server.WSGIRequestHandler] = ...)
+Runtime: at line 150 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\wsgiref\simple_server.py
+def (host, port, app, server_class=<class 'wsgiref.simple_server.WSGIServer'>, handler_class=<class 'wsgiref.simple_server.WSGIRequestHandler'>)
+
 note: unused allowlist entry sqlite3.dbapi2.Binary.__contains__
 note: unused allowlist entry sqlite3.Binary.__contains__
+note: unused allowlist entry http.client.HTTPConnection.response_class
+note: unused allowlist entry inspect.Parameter.empty
+note: unused allowlist entry inspect.Signature.empty
+note: unused allowlist entry multiprocessing.reduction.AbstractReducer.ForkingPickler
 note: unused allowlist entry enum.Enum.name
 note: unused allowlist entry enum.Enum.value
 note: unused allowlist entry enum.Flag.name
@@ -18,6 +379,7 @@ note: unused allowlist entry dbm.dumb.error.characters_written
 note: unused allowlist entry os.error.characters_written
 note: unused allowlist entry select.error.characters_written
 note: unused allowlist entry socket.error.characters_written
+note: unused allowlist entry _collections_abc.Callable
 note: unused allowlist entry importlib.metadata._meta.SimplePath.__div__
 note: unused allowlist entry importlib.abc.Traversable.__init__
 note: unused allowlist entry importlib.metadata.PackageMetadata.__init__
@@ -30,6 +392,7 @@ note: unused allowlist entry typing.SupportsFloat.__init__
 note: unused allowlist entry typing.SupportsIndex.__init__
 note: unused allowlist entry typing.SupportsInt.__init__
 note: unused allowlist entry typing.SupportsRound.__init__
+note: unused allowlist entry multiprocessing.reduction.AbstractReducer.DupHandle
 note: unused allowlist entry builtins.WindowsError.characters_written
 note: unused allowlist entry winreg.error.characters_written
-Found 29 errors (checked 481 modules)
+Found 94 errors (checked 481 modules)

If these are all true positives, we should fix them over at typeshed before merging this PR.

AlexWaygood avatar Aug 09 '22 10:08 AlexWaygood

Another test that it might be useful to add:

diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py
index d6b7affb7..3a5bef614 100644
--- a/mypy/test/teststubtest.py
+++ b/mypy/test/teststubtest.py
@@ -885,6 +885,33 @@ class StubtestUnit(unittest.TestCase):
             error="B2.a",
         )

+    @collect_cases
+    def test_generic_classvar(self) -> Iterator[Case]:
+        yield Case(
+            stub="""
+            from typing import Generic, TypeVar
+            _T = TypeVar("_T")
+            class Meta(type): ...
+            class Foo(Generic[_T], metaclass=Meta): ...
+            """,
+            runtime="""
+            class Meta(type): ...
+            class Foo(metaclass=Meta): ...
+            """,
+            error=None,
+        )
+        yield Case(
+            stub="""
+            class A:
+                x: type[Foo[int]]
+            """,
+            runtime="""
+            class A:
+                x = Foo
+            """,
+            error=None,
+        )
+
     @collect_cases
     def test_type_alias(self) -> Iterator[Case]:
         yield Case(

AlexWaygood avatar Aug 09 '22 11:08 AlexWaygood

I am thinking about possible solutions 🤔 Typeshed output has many false-positives. I will first concentrate on reproducing them with tests, then fixing problems. By the way, thank you for the extra test sample!

sobolevn avatar Aug 09 '22 14:08 sobolevn

My thoughts:

  1. Type vs Protocol
error: argparse.ArgumentParser.__init__ is inconsistent, runtime argument "formatter_class" has a default value of type Type[argparse.HelpFormatter], which is incompatible with stub argument type argparse._FormatterClass
Stub: at line 131 in file stdlib\argparse.pyi

This happens because _FormatterClass is a protocol:

  • Runtime: https://github.com/python/cpython/blob/325ae93b6b7113cd4a4c2ce441615ae7def779e2/Lib/argparse.py#L1198
  • Stub: https://github.com/python/typeshed/blob/c68bcc7e69249956f358da7f47028d8fd1f7443e/stdlib/argparse.pyi#L113-L120

Looks like right now TypeType has problems matching a protocol 🤔

  1. There are multiple errors where TypeVar is used, like:
error: ctypes.wintypes.PWIN32_FIND_DATAW._type_ variable differs from runtime type Type[ctypes.wintypes.WIN32_FIND_DATAW]
Stub: at line 162 in file stdlib\ctypes\wintypes.pyi
Type[_CT`1]
Runtime: at line 155 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\ctypes\wintypes.py
<class 'ctypes.wintypes.WIN32_FIND_DATAW'>
  1. There are cases that look real, for example:
error: email.headerregistry.HeaderRegistry.__init__ is inconsistent, runtime argument "default_class" has a default value of type Type[email.headerregistry.UnstructuredHeader], which is incompatible with stub argument type Type[email.headerregistry.BaseHeader]
Stub: at line 145 in file stdlib\email\headerregistry.pyi
def (self: email.headerregistry.HeaderRegistry, base_class: Type[email.headerregistry.BaseHeader] =, default_class: Type[email.headerregistry.BaseHeader] =, use_default_map: builtins.bool =)
Runtime: at line 566 in file C:\Users\alexw\AppData\Local\Programs\Python\Python310\lib\email\headerregistry.py
def (self, base_class=<class 'email.headerregistry.BaseHeader'>, default_class=<class 'email.headerregistry.UnstructuredHeader'>, use_default_map=True)
  • Runtime: https://github.com/python/cpython/blob/325ae93b6b7113cd4a4c2ce441615ae7def779e2/Lib/email/headerregistry.py#L566
  • Stub: https://github.com/python/typeshed/blob/c68bcc7e69249956f358da7f47028d8fd1f7443e/stdlib/email/headerregistry.pyi#L146

Note that UnstructuredHeader is not a subclass of BaseHeader.

One more:

error: dbm.error variable differs from runtime type Tuple[Tuple[Type[dbm._error], Type[builtins.OSError]], Type[builtins.OSError]]
Stub: at line 92 in file stdlib\dbm\__init__.pyi
Tuple[Type[dbm._error], Type[builtins.OSError]]
Runtime:
+(<class 'dbm.error'>, <class 'OSError'>)

The problem here is:

  • Runtime: https://github.com/python/cpython/blob/325ae93b6b7113cd4a4c2ce441615ae7def779e2/Lib/dbm/init.py#L38-L45
  • Stub: https://github.com/python/typeshed/blob/c68bcc7e69249956f358da7f47028d8fd1f7443e/stdlib/dbm/init.pyi#L90-L92

Notice _error and error class names (because name erorr is later re-defined), I think that this is a good allowlist candidate.

I will collect all real errors and send a PR to typeshed. There are too many cases to process them fastly!

sobolevn avatar Aug 10 '22 08:08 sobolevn