ITADN

`generics_defaults.py` mandates that type checkers should allow a class that raises `TypeError` at runtime

#2211OpenAlexWaygood 创建于 2026-03-08
topic: conformance tests
A
AlexWaygoodcommented
This test mandates that type checkers should allow classes that have `ParamSpec`s-with-defaults following `TypeVarTuple`s: https://github.com/python/typing/blob/22d9392a5ead302cc02c47ecbbcf3aa40106fd9f/conformance/tests/generics_defaults.py#L191-L200 But these fail at runtime. Using Python 3.11 syntax: ```pytb % uvx python3.14 Python 3.14.0 (main, Oct 10 2025, 12:54:13) [Clang 20.1.4 ] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from typing import * >>> Ts = TypeVarTuple("Ts") >>> P = ParamSpec("P", default=[int, str]) >>> class A(Generic[*Ts, P]): ... ... Traceback (most recent call last): File "<python-input-3>", line 1, in <module> class A(Generic[*Ts, P]): ... ~~~~~~~^^^^^^^^ File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 402, in inner return func(*args, **kwds) File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 1157, in _generic_class_getitem return _GenericAlias(cls, args) File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 1334, in __init__ self.__parameters__ = _collect_type_parameters( ~~~~~~~~~~~~~~~~~~~~~~~~^ args, ^^^^^ enforce_default_ordering=enforce_default_ordering, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 291, in _collect_type_parameters raise TypeError('Type parameter with a default' ' follows TypeVarTuple') TypeError: Type parameter with a default follows TypeVarTuple ``` Using Python <=3.10 syntax: ```pytb >>> class B(Generic[Unpack[Ts], P]): ... ... Traceback (most recent call last): File "<python-input-4>", line 1, in <module> class B(Generic[Unpack[Ts], P]): ... ~~~~~~~^^^^^^^^^^^^^^^ File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 402, in inner return func(*args, **kwds) File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 1157, in _generic_class_getitem return _GenericAlias(cls, args) File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 1334, in __init__ self.__parameters__ = _collect_type_parameters( ~~~~~~~~~~~~~~~~~~~~~~~~^ args, ^^^^^ enforce_default_ordering=enforce_default_ordering, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 291, in _collect_type_parameters raise TypeError('Type parameter with a default' ' follows TypeVarTuple') TypeError: Type parameter with a default follows TypeVarTuple ``` And using Python 3.13+ syntax: ```pytb >>> class C[*Ts, **P = [int, str]]: ... ... Traceback (most recent call last): File "<python-input-5>", line 1, in <module> class C[*Ts, **P = [int, str]]: ... File "<python-input-5>", line 1, in <generic parameters of C> class C[*Ts, **P = [int, str]]: ... File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 1334, in __init__ self.__parameters__ = _collect_type_parameters( ~~~~~~~~~~~~~~~~~~~~~~~~^ args, ^^^^^ enforce_default_ordering=enforce_default_ordering, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/Users/alexw/Library/Application Support/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/typing.py", line 291, in _collect_type_parameters raise TypeError('Type parameter with a default' ' follows TypeVarTuple') TypeError: Type parameter with a default follows TypeVarTuple ``` Since it seems that the tests are quoting the spec here, is this a bug in the runtime implementation of the typing module? Or should we update the spec and the conformance suite to allow type checkers to catch this runtime error?
2 条评论