From d70e348e4e9e942ff2766f6d3ba73304de138423 Mon Sep 17 00:00:00 2001 From: Mehdi Drissi Date: Sun, 16 Apr 2023 04:58:00 -0700 Subject: [PATCH 1/2] Support nested namedtuple classes. --- mypy/semanal_namedtuple.py | 4 ++++ mypy/semanal_shared.py | 4 ++++ test-data/unit/check-class-namedtuple.test | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/mypy/semanal_namedtuple.py b/mypy/semanal_namedtuple.py index a9f12ceae5c2c..b197eda0d3650 100644 --- a/mypy/semanal_namedtuple.py +++ b/mypy/semanal_namedtuple.py @@ -166,6 +166,10 @@ def check_namedtuple_classdef( # And docstrings. if isinstance(stmt, ExpressionStmt) and isinstance(stmt.expr, StrExpr): continue + # Allow nested classes. + if isinstance(stmt, ClassDef): + self.api.analyze_class(stmt) + continue statements.pop() defn.removed_statements.append(stmt) self.fail(NAMEDTUP_CLASS_ERROR, stmt) diff --git a/mypy/semanal_shared.py b/mypy/semanal_shared.py index c86ed828b2b9f..eb6d3418155d0 100644 --- a/mypy/semanal_shared.py +++ b/mypy/semanal_shared.py @@ -251,6 +251,10 @@ def process_placeholder( ) -> None: raise NotImplementedError + @abstractmethod + def analyze_class(self, defn: ClassDef) -> None: + raise NotImplementedError + def set_callable_name(sig: Type, fdef: FuncDef) -> ProperType: sig = get_proper_type(sig) diff --git a/test-data/unit/check-class-namedtuple.test b/test-data/unit/check-class-namedtuple.test index 8ae7f6555f9db..6b1b7e7538b96 100644 --- a/test-data/unit/check-class-namedtuple.test +++ b/test-data/unit/check-class-namedtuple.test @@ -728,3 +728,21 @@ reveal_type(y) # N: Revealed type is "builtins.int" point.y = 6 # E: Property "y" defined in "Point" is read-only [builtins fixtures/tuple.pyi] + +[case testNestedNamedTuple] +from enum import Enum +from typing import NamedTuple + +class T(NamedTuple): + class State(Enum): + A =1 + state:State + +class RaggedFeature(NamedTuple): + class RowSplits(NamedTuple): + x: int + + splits: RowSplits + +reveal_type(T.State.A) # N: Revealed type is "Literal[__main__.T.State.A]" +reveal_type(RaggedFeature.RowSplits.x) # N: Revealed type is "builtins.int" From 18c6de79ea95dcce23ddbaa494029bcda60ae9ef Mon Sep 17 00:00:00 2001 From: Mehdi Drissi Date: Sun, 16 Apr 2023 21:40:04 -0700 Subject: [PATCH 2/2] fix non-incremental test case --- test-data/unit/check-class-namedtuple.test | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test-data/unit/check-class-namedtuple.test b/test-data/unit/check-class-namedtuple.test index 6b1b7e7538b96..c82f453a6e7fe 100644 --- a/test-data/unit/check-class-namedtuple.test +++ b/test-data/unit/check-class-namedtuple.test @@ -735,8 +735,8 @@ from typing import NamedTuple class T(NamedTuple): class State(Enum): - A =1 - state:State + A = 1 + state: State class RaggedFeature(NamedTuple): class RowSplits(NamedTuple): @@ -744,5 +744,7 @@ class RaggedFeature(NamedTuple): splits: RowSplits -reveal_type(T.State.A) # N: Revealed type is "Literal[__main__.T.State.A]" +reveal_type(T.State.A) # N: Revealed type is "Literal[__main__.State.A]?" reveal_type(RaggedFeature.RowSplits.x) # N: Revealed type is "builtins.int" + +[builtins fixtures/tuple.pyi]