44import ast
55import collections
66import sys
7+ from typing import List
8+ from typing import Optional
9+ from typing import Sequence
10+ from typing import Set
711
812
913BUILTIN_TYPES = {
2226
2327class BuiltinTypeVisitor (ast .NodeVisitor ):
2428 def __init__ (self , ignore = None , allow_dict_kwargs = True ):
25- self .builtin_type_calls = []
29+ # type: (Optional[Sequence[str]], bool) -> None
30+ self .builtin_type_calls = [] # type: List[BuiltinTypeCall]
2631 self .ignore = set (ignore ) if ignore else set ()
2732 self .allow_dict_kwargs = allow_dict_kwargs
2833
29- def _check_dict_call (self , node ):
34+ def _check_dict_call (self , node ): # type: (ast.Call) -> bool
35+
3036 return self .allow_dict_kwargs and (getattr (node , 'kwargs' , None ) or getattr (node , 'keywords' , None ))
3137
32- def visit_Call (self , node ):
38+ def visit_Call (self , node ): # type: (ast.Call) -> None
39+
3340 if not isinstance (node .func , ast .Name ):
3441 # Ignore functions that are object attributes (`foo.bar()`).
3542 # Assume that if the user calls `builtins.list()`, they know what
@@ -47,31 +54,30 @@ def visit_Call(self, node):
4754
4855
4956def check_file_for_builtin_type_constructors (filename , ignore = None , allow_dict_kwargs = True ):
57+ # type: (str, Optional[Sequence[str]], bool) -> List[BuiltinTypeCall]
5058 with open (filename , 'rb' ) as f :
5159 tree = ast .parse (f .read (), filename = filename )
5260 visitor = BuiltinTypeVisitor (ignore = ignore , allow_dict_kwargs = allow_dict_kwargs )
5361 visitor .visit (tree )
5462 return visitor .builtin_type_calls
5563
5664
57- def parse_args (argv ):
58- def parse_ignore (value ):
59- return set (value .split (',' ))
65+ def parse_ignore (value ): # type: (str) -> Set[str]
66+ return set (value .split (',' ))
6067
68+
69+ def main (argv = None ): # type: (Optional[Sequence[str]]) -> int
6170 parser = argparse .ArgumentParser ()
6271 parser .add_argument ('filenames' , nargs = '*' )
6372 parser .add_argument ('--ignore' , type = parse_ignore , default = set ())
6473
65- allow_dict_kwargs = parser .add_mutually_exclusive_group (required = False )
66- allow_dict_kwargs .add_argument ('--allow-dict-kwargs' , action = 'store_true' )
67- allow_dict_kwargs .add_argument ('--no-allow-dict-kwargs' , dest = 'allow_dict_kwargs' , action = 'store_false' )
68- allow_dict_kwargs .set_defaults (allow_dict_kwargs = True )
69-
70- return parser .parse_args (argv )
74+ mutex = parser .add_mutually_exclusive_group (required = False )
75+ mutex .add_argument ('--allow-dict-kwargs' , action = 'store_true' )
76+ mutex .add_argument ('--no-allow-dict-kwargs' , dest = 'allow_dict_kwargs' , action = 'store_false' )
77+ mutex .set_defaults (allow_dict_kwargs = True )
7178
79+ args = parser .parse_args (argv )
7280
73- def main (argv = None ):
74- args = parse_args (argv )
7581 rc = 0
7682 for filename in args .filenames :
7783 calls = check_file_for_builtin_type_constructors (
0 commit comments