From 1a9cab3960664d29b22a23b817b2f2fe1b7b7ae2 Mon Sep 17 00:00:00 2001 From: dnwpark Date: Thu, 8 Jan 2026 18:04:52 -0800 Subject: [PATCH 1/2] Fix type eval if params are not in alphabetical order. --- tests/test_type_eval.py | 13 ++++++++++++- typemap/type_eval/_eval_typing.py | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/tests/test_type_eval.py b/tests/test_type_eval.py index 77829f4..f79031a 100644 --- a/tests/test_type_eval.py +++ b/tests/test_type_eval.py @@ -134,6 +134,17 @@ class TB: y: list[object] +type GetA1[A, B] = A +type GetA2[B, A] = A + + +def test_eval_arg_order(): + d = eval_typing(GetA1[int, str]) + assert d is int + d = eval_typing(GetA2[str, int]) + assert d is int + + def test_type_getattr_union_1(): d = eval_typing(GetAttr[TA | TB, Literal["x"]]) assert d == int | str @@ -640,7 +651,7 @@ def test_never_is(): assert d is True -def test_eval_iter(): +def test_eval_iter_01(): d = eval_typing(Iter[tuple[int, str]]) assert tuple(d) == (int, str) diff --git a/typemap/type_eval/_eval_typing.py b/typemap/type_eval/_eval_typing.py index bab4cce..f796e5f 100644 --- a/typemap/type_eval/_eval_typing.py +++ b/typemap/type_eval/_eval_typing.py @@ -298,7 +298,20 @@ def _eval_applied_type_alias(obj: types.GenericAlias, ctx: EvalContext): func = obj.evaluate_value - args = tuple(types.CellType(_eval_types(arg, ctx)) for arg in obj.__args__) + # obj.__args__ matches the declared parameter order, but args are expected + # to be in alphabetical order. + args_by_name = dict( + zip( + (p.__name__ for p in obj.__origin__.__type_params__), + obj.__args__, + strict=False, + ) + ) + + args = tuple( + types.CellType(_eval_types(args_by_name[name], ctx)) + for name in func.__code__.co_freevars + ) mod = sys.modules[obj.__module__] with _child_context() as child_ctx: From 60d87adea3e88d35846fa3b6f5aa533ed5f7ae1c Mon Sep 17 00:00:00 2001 From: dnwpark Date: Fri, 9 Jan 2026 10:28:00 -0800 Subject: [PATCH 2/2] update comment --- typemap/type_eval/_eval_typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typemap/type_eval/_eval_typing.py b/typemap/type_eval/_eval_typing.py index f796e5f..8fe0f5a 100644 --- a/typemap/type_eval/_eval_typing.py +++ b/typemap/type_eval/_eval_typing.py @@ -299,7 +299,7 @@ def _eval_applied_type_alias(obj: types.GenericAlias, ctx: EvalContext): func = obj.evaluate_value # obj.__args__ matches the declared parameter order, but args are expected - # to be in alphabetical order. + # to be in the same order as func.__code__.co_freevars. args_by_name = dict( zip( (p.__name__ for p in obj.__origin__.__type_params__),