2
2
import ast
3
3
from ast import iter_child_nodes
4
4
from collections import deque
5
+ from collections .abc import Iterable
5
6
from fnmatch import fnmatchcase
6
7
from functools import partial
7
8
from itertools import chain
@@ -107,8 +108,7 @@ class NamingChecker:
107
108
ignore_names = frozenset (_default_ignore_names )
108
109
109
110
def __init__ (self , tree , filename ):
110
- self .parents = deque ()
111
- self ._node = tree
111
+ self .tree = tree
112
112
113
113
@classmethod
114
114
def add_options (cls , parser ):
@@ -157,23 +157,22 @@ def parse_options(cls, options):
157
157
)
158
158
159
159
def run (self ):
160
- return self .visit_tree (self ._node ) if self ._node else ()
160
+ return self .visit_tree (self .tree , deque ()) if self .tree else ()
161
161
162
- def visit_tree (self , node ):
163
- yield from self .visit_node (node )
164
- self . parents .append (node )
162
+ def visit_tree (self , node , parents : deque ):
163
+ yield from self .visit_node (node , parents )
164
+ parents .append (node )
165
165
for child in iter_child_nodes (node ):
166
- yield from self .visit_tree (child )
167
- self . parents .pop ()
166
+ yield from self .visit_tree (child , parents )
167
+ parents .pop ()
168
168
169
- def visit_node (self , node ):
169
+ def visit_node (self , node , parents : Iterable ):
170
170
if isinstance (node , ast .ClassDef ):
171
171
self .tag_class_functions (node )
172
172
elif isinstance (node , FUNC_NODES ):
173
173
self .find_global_defs (node )
174
174
175
175
method = 'visit_' + node .__class__ .__name__ .lower ()
176
- parents = self .parents
177
176
ignore_names = self .ignore_names
178
177
for visitor in self .visitors :
179
178
visitor_method = getattr (visitor , method , None )
@@ -263,14 +262,14 @@ class ClassNameCheck(BaseASTCheck):
263
262
N818 = "exception name '{name}' should be named with an Error suffix"
264
263
265
264
@classmethod
266
- def get_classdef (cls , name , parents ):
265
+ def get_classdef (cls , name , parents : Iterable ):
267
266
for parent in parents :
268
267
for node in parent .body :
269
268
if isinstance (node , ast .ClassDef ) and node .name == name :
270
269
return node
271
270
272
271
@classmethod
273
- def superclass_names (cls , name , parents , _names = None ):
272
+ def superclass_names (cls , name , parents : Iterable , _names = None ):
274
273
names = _names or set ()
275
274
classdef = cls .get_classdef (name , parents )
276
275
if not classdef :
@@ -281,7 +280,7 @@ def superclass_names(cls, name, parents, _names=None):
281
280
names .update (cls .superclass_names (base .id , parents , names ))
282
281
return names
283
282
284
- def visit_classdef (self , node , parents , ignore = None ):
283
+ def visit_classdef (self , node , parents : Iterable , ignore = None ):
285
284
name = node .name
286
285
if _ignored (name , ignore ):
287
286
return
@@ -316,7 +315,7 @@ def has_override_decorator(node):
316
315
return True
317
316
return False
318
317
319
- def visit_functiondef (self , node , parents , ignore = None ):
318
+ def visit_functiondef (self , node , parents : Iterable , ignore = None ):
320
319
function_type = getattr (node , 'function_type' , _FunctionType .FUNCTION )
321
320
name = node .name
322
321
if _ignored (name , ignore ):
@@ -347,7 +346,7 @@ class FunctionArgNamesCheck(BaseASTCheck):
347
346
N804 = "first argument of a classmethod should be named 'cls'"
348
347
N805 = "first argument of a method should be named 'self'"
349
348
350
- def visit_functiondef (self , node , parents , ignore = None ):
349
+ def visit_functiondef (self , node , parents : Iterable , ignore = None ):
351
350
352
351
def arg_name (arg ):
353
352
return (arg , arg .arg ) if arg else (node , arg )
@@ -389,7 +388,7 @@ class ImportAsCheck(BaseASTCheck):
389
388
N814 = "camelcase '{name}' imported as constant '{asname}'"
390
389
N817 = "camelcase '{name}' imported as acronym '{asname}'"
391
390
392
- def visit_importfrom (self , node , parents , ignore = None ):
391
+ def visit_importfrom (self , node , parents : Iterable , ignore = None ):
393
392
for name in node .names :
394
393
asname = name .asname
395
394
if not asname :
@@ -421,7 +420,7 @@ class VariablesCheck(BaseASTCheck):
421
420
N815 = "variable '{name}' in class scope should not be mixedCase"
422
421
N816 = "variable '{name}' in global scope should not be mixedCase"
423
422
424
- def _find_errors (self , assignment_target , parents , ignore ):
423
+ def _find_errors (self , assignment_target , parents : Iterable , ignore ):
425
424
for parent_func in reversed (parents ):
426
425
if isinstance (parent_func , ast .ClassDef ):
427
426
checker = self .class_variable_check
@@ -449,36 +448,36 @@ def is_namedtupe(node_value):
449
448
return True
450
449
return False
451
450
452
- def visit_assign (self , node , parents , ignore = None ):
451
+ def visit_assign (self , node , parents : Iterable , ignore = None ):
453
452
if self .is_namedtupe (node .value ):
454
453
return
455
454
for target in node .targets :
456
455
yield from self ._find_errors (target , parents , ignore )
457
456
458
- def visit_namedexpr (self , node , parents , ignore ):
457
+ def visit_namedexpr (self , node , parents : Iterable , ignore ):
459
458
if self .is_namedtupe (node .value ):
460
459
return
461
460
yield from self ._find_errors (node .target , parents , ignore )
462
461
463
462
visit_annassign = visit_namedexpr
464
463
465
- def visit_with (self , node , parents , ignore ):
464
+ def visit_with (self , node , parents : Iterable , ignore ):
466
465
for item in node .items :
467
466
yield from self ._find_errors (
468
467
item .optional_vars , parents , ignore )
469
468
470
469
visit_asyncwith = visit_with
471
470
472
- def visit_for (self , node , parents , ignore ):
471
+ def visit_for (self , node , parents : Iterable , ignore ):
473
472
yield from self ._find_errors (node .target , parents , ignore )
474
473
475
474
visit_asyncfor = visit_for
476
475
477
- def visit_excepthandler (self , node , parents , ignore ):
476
+ def visit_excepthandler (self , node , parents : Iterable , ignore ):
478
477
if node .name :
479
478
yield from self ._find_errors (node , parents , ignore )
480
479
481
- def visit_generatorexp (self , node , parents , ignore ):
480
+ def visit_generatorexp (self , node , parents : Iterable , ignore ):
482
481
for gen in node .generators :
483
482
yield from self ._find_errors (gen .target , parents , ignore )
484
483
0 commit comments