31
31
import functools
32
32
import keyword
33
33
from textwrap import dedent
34
+ from typing import Iterator , List , Optional , Tuple
34
35
35
36
import astroid
36
37
from astroid import arguments , inference_tip , nodes , util
37
38
from astroid .builder import AstroidBuilder , extract_node
39
+ from astroid .context import InferenceContext
38
40
from astroid .exceptions import (
39
41
AstroidTypeError ,
40
42
AstroidValueError ,
@@ -90,7 +92,12 @@ def _extract_namedtuple_arg_or_keyword( # pylint: disable=inconsistent-return-s
90
92
raise UseInferenceDefault ()
91
93
92
94
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 ]]:
94
101
"""Specific inference function for namedtuple or Python 3 enum."""
95
102
# node is a Call node, class name as first argument and generated class
96
103
# attributes as second argument
@@ -102,10 +109,13 @@ def infer_func_form(node, base_type, context=None, enum=False):
102
109
try :
103
110
attributes = names .value .replace ("," , " " ).split ()
104
111
except AttributeError as exc :
112
+ # Handle attributes of NamedTuples
105
113
if not enum :
106
114
attributes = [
107
115
_infer_first (const , context ).value for const in names .elts
108
116
]
117
+
118
+ # Handle attributes of Enums
109
119
else :
110
120
# Enums supports either iterator of (name, value) pairs
111
121
# or mappings.
@@ -183,7 +193,9 @@ def _looks_like(node, name):
183
193
_looks_like_typing_namedtuple = functools .partial (_looks_like , name = "NamedTuple" )
184
194
185
195
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 ]:
187
199
"""Specific inference function for namedtuple Call node"""
188
200
tuple_base_name = nodes .Name (name = "tuple" , parent = node .root ())
189
201
class_node , name , attributes = infer_func_form (
@@ -507,7 +519,9 @@ def infer_typing_namedtuple_function(node, context=None):
507
519
return klass .infer (context )
508
520
509
521
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 ]:
511
525
"""Infer a typing.NamedTuple(...) call."""
512
526
# This is essentially a namedtuple with different arguments
513
527
# so we extract the args and infer a named tuple.
0 commit comments