From 551034d55a132fd011c4ef94a7252168e33f60f3 Mon Sep 17 00:00:00 2001 From: daleselaji-dev <265319989+daleselaji-dev@users.noreply.github.com> Date: Sat, 29 Aug 2026 10:56:32 +0800 Subject: [PATCH] Preserve nested Final types in ClassVar Fixes #21906. --- mypy/typeanal.py | 2 ++ test-data/unit/check-final.test | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/mypy/typeanal.py b/mypy/typeanal.py index 3e493502d0dad..d3f43ebd0bbed 100644 --- a/mypy/typeanal.py +++ b/mypy/typeanal.py @@ -646,6 +646,8 @@ def try_analyze_special_unbound_type(self, t: UnboundType, fullname: str) -> Typ t, code=codes.VALID_TYPE, ) + elif t.args: + return self.anal_type(t.args[0]) return AnyType(TypeOfAny.from_error) elif fullname in TUPLE_NAMES: # Tuple is special because it is involved in builtin import cycle diff --git a/test-data/unit/check-final.test b/test-data/unit/check-final.test index 8608962e00a42..2d4ecc6fe8e63 100644 --- a/test-data/unit/check-final.test +++ b/test-data/unit/check-final.test @@ -1134,6 +1134,16 @@ class A: b: ClassVar[Final[int]] = 1 c: ClassVar[Final] = 1 +[case testNestedFinalClassVarPreservesType] +# flags: --python-version 3.13 +from typing import ClassVar, Final, reveal_type + +class A: + value: ClassVar[Final[dict[str, int]]] = {} + +reveal_type(A.value) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" +[builtins fixtures/dict.pyi] + [case testFinalClassWithAbstractMethod] from typing import final from abc import ABC, abstractmethod