python / python/typing

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

Open
#2,211 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

topic: conformance tests
Dominant language
Python
Stars
1.8k
Forks
302
Avg merge
23h
Merged PRs (30d)
8

Description

This test mandates that type checkers should allow classes that have ParamSpecs-with-defaults following TypeVarTuples: https://github.com/python/typing/blob/22d9392a5ead302cc02c47ecbbcf3aa40106fd9f/conformance/tests/generics_defaults.py#L191-L200

But these fail at runtime. Using Python 3.11 syntax:

% 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:

>>> 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:

>>> 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?

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with conformance/tests/generics_defaults.py at lines 191-200 and compare its requirement with the typing specification. Then inspect typing.py in _collect_type_parameters and reproduce the examples across the cited Python syntax versions. Done means deciding whether the runtime or the specification and conformance test are inconsistent, with regression coverage for the chosen correction.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
documentation, testing
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.