Skip to content

Unpacking TypeAliasType to tuple of types using * errors at runtime, Unpack doesn't #126085

@alwaysmpe

Description

@alwaysmpe

Bug report

Bug description:

Discussed in microsoft/pyright#9343 @JelleZijlstra asked me to open this issue.

I'm writing classes using variadic generic code and as a minimal example I have the below code which raises no type errors on pyright playground and is crashing at runtime which I believe is a bug in cpython. The code:

from __future__ import annotations
from typing import Unpack, assert_type, TypeAlias
type FooArgT = tuple[str, str]
# deprecated but works at runtime
FooArgAliasT: TypeAlias = tuple[str, str]

class Foo[*Arg]:
    pass

type FooT = Foo[str, *FooArgT]
type FooUT = Foo[str, Unpack[FooArgT]]

class BarAU(Foo[str, *FooArgAliasT]):
    pass

class BarU(Foo[str, Unpack[FooArgT]]):
    pass

def foo_fn(t_arg: FooT, ut_arg: FooUT):
    assert_type(t_arg, FooT)
    assert_type(t_arg, FooUT)
    assert_type(t_arg, Foo[str, Unpack[FooArgT]])
    assert_type(t_arg, Foo[str, *FooArgT])
    assert_type(ut_arg, FooT)
    assert_type(ut_arg, FooUT)
    assert_type(ut_arg, Foo[str, Unpack[FooArgT]])
    assert_type(ut_arg, Foo[str, *FooArgT])

class Bar(Foo[str, *FooArgT]):
    pass

When I run this locally I get

Traceback (most recent call last):
  File "...", line 31, in <module>
    class Bar(Foo[str, *FooArgT]):
                  ^^^^^^^^^^^^^
TypeError: Value after * must be an iterable, not typing.TypeAliasType

By my understanding, the 3 class declarations are equivalent, pyright checks pass and from my understanding of the documentation cpython should allow unpacking of the aliased TypeVarTuple.

I'm running python3.13.0 in wsl installed using pyenv, output of python -V -V

Python 3.13.0 (main, Oct 24 2024, 00:12:39) [GCC 11.4.0]

CPython versions tested on:

3.13
3.14

Operating systems tested on:

Linux

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions