@@ -202,6 +202,7 @@ def visit_tree(self, node):
202
202
def visit_node (self , node ):
203
203
if isinstance (node , ast .ClassDef ):
204
204
self .tag_class_functions (node )
205
+ self .tag_class_superclasses (node )
205
206
elif isinstance (node , FUNC_NODES ):
206
207
self .find_global_defs (node )
207
208
@@ -264,6 +265,11 @@ def set_function_nodes_types(self, nodes, ismetaclass, late_decoration):
264
265
node .function_type = self .decorator_to_type [name ]
265
266
break
266
267
268
+ def tag_class_superclasses (self , cls_node ):
269
+ cls_node .superclasses = self .superclass_names (
270
+ cls_node .name , self .parents
271
+ )
272
+
267
273
@classmethod
268
274
def find_decorator_name (cls , d ):
269
275
if isinstance (d , ast .Name ):
@@ -286,16 +292,6 @@ def find_global_defs(func_def_node):
286
292
nodes_to_check .extend (iter_child_nodes (node ))
287
293
func_def_node .global_names = global_names
288
294
289
-
290
- class ClassNameCheck (BaseASTCheck ):
291
- """
292
- Almost without exception, class names use the CapWords convention.
293
-
294
- Classes for internal use have a leading underscore in addition.
295
- """
296
- N801 = "class name '{name}' should use CapWords convention"
297
- N818 = "exception name '{name}' should be named with an Error suffix"
298
-
299
295
@classmethod
300
296
def get_classdef (cls , name , parents ):
301
297
for parent in parents :
@@ -315,15 +311,24 @@ def superclass_names(cls, name, parents, _names=None):
315
311
names .update (cls .superclass_names (base .id , parents , names ))
316
312
return names
317
313
314
+
315
+ class ClassNameCheck (BaseASTCheck ):
316
+ """
317
+ Almost without exception, class names use the CapWords convention.
318
+
319
+ Classes for internal use have a leading underscore in addition.
320
+ """
321
+ N801 = "class name '{name}' should use CapWords convention"
322
+ N818 = "exception name '{name}' should be named with an Error suffix"
323
+
318
324
def visit_classdef (self , node , parents , ignore = None ):
319
325
name = node .name
320
326
if _ignored (name , ignore ):
321
327
return
322
328
name = name .strip ('_' )
323
329
if not name [:1 ].isupper () or '_' in name :
324
330
yield self .err (node , 'N801' , name = name )
325
- superclasses = self .superclass_names (name , parents )
326
- if "Exception" in superclasses and not name .endswith ("Error" ):
331
+ if "Exception" in node .superclasses and not name .endswith ("Error" ):
327
332
yield self .err (node , 'N818' , name = name )
328
333
329
334
@@ -448,6 +453,8 @@ class VariablesCheck(BaseASTCheck):
448
453
def _find_errors (self , assignment_target , parents , ignore ):
449
454
for parent_func in reversed (parents ):
450
455
if isinstance (parent_func , ast .ClassDef ):
456
+ if "TypedDict" in parent_func .superclasses :
457
+ return
451
458
checker = self .class_variable_check
452
459
break
453
460
if isinstance (parent_func , FUNC_NODES ):
0 commit comments