Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relax TypeVar default ordering constraints #118772

Closed
JelleZijlstra opened this issue May 8, 2024 · 5 comments
Closed

Relax TypeVar default ordering constraints #118772

JelleZijlstra opened this issue May 8, 2024 · 5 comments
Labels
3.13 bugs and security fixes 3.14 new features, bugs and security fixes topic-typing type-bug An unexpected behavior, bug, or error

Comments

@JelleZijlstra
Copy link
Member

JelleZijlstra commented May 8, 2024

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

@JelleZijlstra JelleZijlstra added type-bug An unexpected behavior, bug, or error topic-typing 3.13 bugs and security fixes 3.14 new features, bugs and security fixes labels May 8, 2024
@JelleZijlstra
Copy link
Member Author

https://github.com/python/cpython/actions/runs/9004596703/job/24737976172?pr=118766 for reference. This is currently breaking our Hypothesis tests on the main branch.

@Gobot1234
Copy link
Contributor

I think that first example should raise but I agree that the second raising is buggy

@JelleZijlstra
Copy link
Member Author

I think that first example should raise but I agree that the second raising is buggy

They're the same example though, in the sense that the code for Callable sees the same thing; the first one just writes it out more explicitly.

@Gobot1234
Copy link
Contributor

Gobot1234 commented May 8, 2024

It's different as described by the binding rules. The class typevar is bound on the attribute access then the default disappears. I don't feasibly see a way to implement this at runtime however so the changes are still fine.

JelleZijlstra added a commit that referenced this issue May 8, 2024
JelleZijlstra added a commit that referenced this issue May 8, 2024
…th a default when constructing aliases (GH-118774) (#118776)

(cherry picked from commit aac6b01)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
@AlexWaygood
Copy link
Member

I think this is complete now, but please reopen if I'm mistaken!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.13 bugs and security fixes 3.14 new features, bugs and security fixes topic-typing type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

3 participants