3131import functools
3232import keyword
3333from textwrap import dedent
34+ from typing import Iterator , List , Optional , Tuple
3435
3536import astroid
3637from astroid import arguments , inference_tip , nodes , util
3738from astroid .builder import AstroidBuilder , extract_node
39+ from astroid .context import InferenceContext
3840from astroid .exceptions import (
3941 AstroidTypeError ,
4042 AstroidValueError ,
@@ -90,7 +92,12 @@ def _extract_namedtuple_arg_or_keyword( # pylint: disable=inconsistent-return-s
9092 raise UseInferenceDefault ()
9193
9294
93- def infer_func_form (node , base_type , context = None , enum = False ):
95+ def infer_func_form (
96+ node : nodes .Call ,
97+ base_type : nodes .NodeNG ,
98+ context : Optional [InferenceContext ] = None ,
99+ enum : bool = False ,
100+ ) -> Tuple [nodes .ClassDef , str , List [str ]]:
94101 """Specific inference function for namedtuple or Python 3 enum."""
95102 # node is a Call node, class name as first argument and generated class
96103 # attributes as second argument
@@ -102,10 +109,13 @@ def infer_func_form(node, base_type, context=None, enum=False):
102109 try :
103110 attributes = names .value .replace ("," , " " ).split ()
104111 except AttributeError as exc :
112+ # Handle attributes of NamedTuples
105113 if not enum :
106114 attributes = [
107115 _infer_first (const , context ).value for const in names .elts
108116 ]
117+
118+ # Handle attributes of Enums
109119 else :
110120 # Enums supports either iterator of (name, value) pairs
111121 # or mappings.
@@ -183,7 +193,9 @@ def _looks_like(node, name):
183193_looks_like_typing_namedtuple = functools .partial (_looks_like , name = "NamedTuple" )
184194
185195
186- def infer_named_tuple (node , context = None ):
196+ def infer_named_tuple (
197+ node : nodes .Call , context : Optional [InferenceContext ] = None
198+ ) -> Iterator [nodes .ClassDef ]:
187199 """Specific inference function for namedtuple Call node"""
188200 tuple_base_name = nodes .Name (name = "tuple" , parent = node .root ())
189201 class_node , name , attributes = infer_func_form (
@@ -507,7 +519,9 @@ def infer_typing_namedtuple_function(node, context=None):
507519 return klass .infer (context )
508520
509521
510- def infer_typing_namedtuple (node , context = None ):
522+ def infer_typing_namedtuple (
523+ node : nodes .Call , context : Optional [InferenceContext ] = None
524+ ) -> Iterator [nodes .ClassDef ]:
511525 """Infer a typing.NamedTuple(...) call."""
512526 # This is essentially a namedtuple with different arguments
513527 # so we extract the args and infer a named tuple.
0 commit comments