Class is not generic if it extends `type[X]`

Open
#100,246 9 comments 0 reactions 1 assignee View on GitHub

@sobolevn is already working on this.

Since Dec 14, 2022.

Assessment

This issue has not been assessed yet.

Description

topic-typing type-bug

Code sample:

>>> from typing import TypeVar
>>> X = TypeVar('X')

>>> class Subtype(type[X]): ...
... 
>>> Subtype[int]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type 'Subtype' is not subscriptable

This is quite strange. To make it generic, you must have explicit Generic base class:

>>> from typing import Generic
>>> class Subtype(type[X], Generic[X]): ...
... 
>>> Subtype[int]
__main__.Subtype[int]

It looks like a bug to me because of two reasons:

  1. Because other stdlib generics work differently:
>>> class Sublist(list[X]): ...
... 
>>> Sublist[int]
  1. Because typing.Type works as it should:
>>> from typing import Type
>>> class Subtype(Type[X]): ...
... 
>>> Subtype[int]
__main__.Subtype[int]

But, I think that type is special enough to be handled extra carefully:

  • class S(type): ... is not generic and does not have __class_getitem__, has type in mro
  • class S(type[X]): ... is generic and has __class_getitem__, has type in mro

I can work on a fix if others agree that this is a bug 😊

Dominant language
Python
Stars
77.2k
Forks
36k
Avg merge
1d 9h
Merged PRs (30d)
558

Contributor guide

Open the contributing guide

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.

More from python/cpython

All issues in python/cpython

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.