(self, lvalue: NameExpr, rvalue: CallExpr)
| 1059 | return None # Not a named tuple call |
| 1060 | |
| 1061 | def process_namedtuple(self, lvalue: NameExpr, rvalue: CallExpr) -> None: |
| 1062 | if self._state == CLASS: |
| 1063 | self.add("\n") |
| 1064 | |
| 1065 | if not isinstance(rvalue.args[0], StrExpr): |
| 1066 | self.annotate_as_incomplete(lvalue) |
| 1067 | return |
| 1068 | |
| 1069 | fields = self._get_namedtuple_fields(rvalue) |
| 1070 | if fields is None: |
| 1071 | self.annotate_as_incomplete(lvalue) |
| 1072 | return |
| 1073 | bases = self.add_name("typing.NamedTuple") |
| 1074 | # TODO: Add support for generic NamedTuples. Requires `Generic` as base class. |
| 1075 | class_def = f"{self._indent}class {lvalue.name}({bases}):" |
| 1076 | if len(fields) == 0: |
| 1077 | self.add(f"{class_def} ...\n") |
| 1078 | self._state = EMPTY_CLASS |
| 1079 | else: |
| 1080 | if self._state not in (EMPTY, CLASS): |
| 1081 | self.add("\n") |
| 1082 | self.add(f"{class_def}\n") |
| 1083 | for f_name, f_type in fields: |
| 1084 | self.add(f"{self._indent} {f_name}: {f_type}\n") |
| 1085 | self._state = CLASS |
| 1086 | |
| 1087 | def is_typeddict(self, expr: CallExpr) -> bool: |
| 1088 | return self.get_fullname(expr.callee) in TPDICT_NAMES |
no test coverage detected