Skip to content

Relax TypeVar default ordering constraints #118772

Closed
@JelleZijlstra

Description

@JelleZijlstra

Bug report

Bug description:

% ./python.exe                     
Python 3.14.0a0 (heads/main-dirty:891fd12e52, May  8 2024, 09:02:37) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from typing import *
>>> T = TypeVar("T")
>>> T_dflt = TypeVar("T_dflt", default=int)
>>> Callable[[T_dflt], T]
Traceback (most recent call last):
  File "<python-input-3>", line 1, in <module>
    Callable[[T_dflt], T]
    ~~~~~~~~^^^^^^^^^^^^^
  File "/Users/jelle/py/cpython/Lib/typing.py", line 1717, in __getitem__
    return self.__getitem_inner__(params)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/Users/jelle/py/cpython/Lib/typing.py", line 431, in inner
    return func(*args, **kwds)
  File "/Users/jelle/py/cpython/Lib/typing.py", line 1730, in __getitem_inner__
    return self.copy_with(params)
           ~~~~~~~~~~~~~~^^^^^^^^
  File "/Users/jelle/py/cpython/Lib/typing.py", line 1702, in copy_with
    return _CallableGenericAlias(self.__origin__, params,
                                 name=self._name, inst=self._inst)
  File "/Users/jelle/py/cpython/Lib/typing.py", line 1419, in __init__
    self.__parameters__ = _collect_parameters(args)
                          ~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/Users/jelle/py/cpython/Lib/typing.py", line 296, in _collect_parameters
    raise TypeError(f'Type parameter {t!r} without a default'
                    ' follows type parameter with a default')
TypeError: Type parameter ~T without a default follows type parameter with a default

This can reasonably happen if you have a generic class generic over a TypeVar with a default, and that TypeVar appears in a Callable parameter type annotation:

class X[T1=int]:
    def meth[T](self, x: Callable[[T1], T]): pass

We encountered this in Hypothesis.

cc @Gobot1234

CPython versions tested on:

CPython main branch

Operating systems tested on:

macOS

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.13bugs and security fixes3.14new features, bugs and security fixestopic-typingtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions