Skip to content

Commit 926b4e8

Browse files
committed
WIP 2
1 parent 612ef34 commit 926b4e8

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

mypy/expandtype.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,14 @@ def visit_type_var(self, t: TypeVarType) -> Type:
240240
def visit_param_spec(self, t: ParamSpecType) -> Type:
241241
# Set prefix to something empty, so we don't duplicate it below.
242242
repl = self.variables.get(t.id, t.copy_modified(prefix=Parameters([], [], [])))
243+
if isinstance(repl, ParamSpecType):
244+
if (tvar_id := repl.id) in self.recursive_tvar_guard:
245+
return self.recursive_tvar_guard[tvar_id] or repl
246+
self.recursive_tvar_guard[tvar_id] = None
247+
repl = repl.accept(self)
248+
if isinstance(repl, ParamSpecType):
249+
repl.default = repl.default.accept(self)
250+
self.recursive_tvar_guard[tvar_id] = repl
243251
if isinstance(repl, ParamSpecType):
244252
return repl.copy_modified(
245253
flavor=t.flavor,

test-data/unit/check-typevar-defaults.test

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,32 @@ def func_d2(
425425
n = ClassD2[int, float, str]()
426426
reveal_type(n) # N: Revealed type is "__main__.ClassD2[builtins.int, builtins.float, builtins.str]"
427427

428+
[case testTypeVarDefaultsClassRecursive2]
429+
# flags: --disallow-any-generics
430+
from typing import Generic, ParamSpec
431+
432+
P1 = ParamSpec("P1", default=[int, str])
433+
P2 = ParamSpec("P2", default=P1)
434+
P3 = ParamSpec("P3")
435+
436+
class ClassE1(Generic[P1, P2]): ...
437+
438+
def func_e1(
439+
a: ClassE1,
440+
b: ClassE1[[float]],
441+
c: ClassE1[[float], [str]],
442+
) -> None:
443+
reveal_type(a) # N: Revealed type is "__main__.ClassE1[[builtins.int, builtins.str], [builtins.int, builtins.str]]"
444+
reveal_type(b) # N: Revealed type is "__main__.ClassE1[[builtins.float], [builtins.float]]"
445+
reveal_type(c) # N: Revealed type is "__main__.ClassE1[[builtins.float], [builtins.str]]"
446+
447+
k = ClassE1()
448+
# reveal_type(k) # Revealed type is "__main__.ClassE1[[builtins.int, builtins.str], [builtins.int, builtins.str]]" # TODO
449+
l = ClassE1[[float]]()
450+
reveal_type(l) # N: Revealed type is "__main__.ClassE1[[builtins.float], [builtins.float]]"
451+
m = ClassE1[[float], [str]]()
452+
reveal_type(m) # N: Revealed type is "__main__.ClassE1[[builtins.float], [builtins.str]]"
453+
428454
[case testTypeVarDefaultsClassRecursiveMultipleFiles]
429455
# flags: --disallow-any-generics
430456
from typing import Generic, TypeVar

0 commit comments

Comments
 (0)