@@ -74,7 +74,9 @@ def _extract_namedtuple_arg_or_keyword( # pylint: disable=inconsistent-return-s
74
74
75
75
def infer_func_form (
76
76
node : nodes .Call ,
77
- base_type : list [nodes .NodeNG ],
77
+ base_type : nodes .NodeNG ,
78
+ * ,
79
+ parent : nodes .NodeNG ,
78
80
context : InferenceContext | None = None ,
79
81
enum : bool = False ,
80
82
) -> tuple [nodes .ClassDef , str , list [str ]]:
@@ -147,15 +149,10 @@ def infer_func_form(
147
149
col_offset = node .col_offset ,
148
150
end_lineno = node .end_lineno ,
149
151
end_col_offset = node .end_col_offset ,
150
- parent = nodes . Unknown () ,
152
+ parent = parent ,
151
153
)
152
- # A typical ClassDef automatically adds its name to the parent scope,
153
- # but doing so causes problems, so defer setting parent until after init
154
- # see: https://github.com/pylint-dev/pylint/issues/5982
155
- class_node .parent = node .parent
156
154
class_node .postinit (
157
- # set base class=tuple
158
- bases = base_type ,
155
+ bases = [base_type ],
159
156
body = [],
160
157
decorators = None ,
161
158
)
@@ -195,25 +192,16 @@ def infer_named_tuple(
195
192
node : nodes .Call , context : InferenceContext | None = None
196
193
) -> Iterator [nodes .ClassDef ]:
197
194
"""Specific inference function for namedtuple Call node."""
198
- tuple_base_name : list [nodes .NodeNG ] = [
199
- nodes .Name (
200
- name = "tuple" ,
201
- parent = node .root (),
202
- lineno = 0 ,
203
- col_offset = 0 ,
204
- end_lineno = None ,
205
- end_col_offset = None ,
206
- )
207
- ]
195
+ tuple_base : nodes .Name = _extract_single_node ("tuple" )
208
196
class_node , name , attributes = infer_func_form (
209
- node , tuple_base_name , context = context
197
+ node , tuple_base , parent = AstroidManager (). adhoc_module , context = context
210
198
)
199
+
211
200
call_site = arguments .CallSite .from_call (node , context = context )
212
- node = extract_node ("import collections; collections.namedtuple" )
213
- try :
214
- func = next (node .infer ())
215
- except StopIteration as e :
216
- raise InferenceError (node = node ) from e
201
+ func = util .safe_infer (
202
+ _extract_single_node ("import collections; collections.namedtuple" )
203
+ )
204
+ assert isinstance (func , nodes .NodeNG )
217
205
try :
218
206
rename = next (
219
207
call_site .infer_argument (func , "rename" , context or InferenceContext ())
@@ -364,7 +352,17 @@ def value(self):
364
352
__members__ = ['']
365
353
"""
366
354
)
367
- class_node = infer_func_form (node , [enum_meta ], context = context , enum = True )[0 ]
355
+
356
+ # FIXME arguably, the base here shouldn't be the EnumMeta class definition
357
+ # itself, but a reference (Name) to it. Otherwise, the invariant that all
358
+ # children of a node have that node as their parent is broken.
359
+ class_node = infer_func_form (
360
+ node ,
361
+ enum_meta ,
362
+ parent = AstroidManager ().adhoc_module ,
363
+ context = context ,
364
+ enum = True ,
365
+ )[0 ]
368
366
return iter ([class_node .instantiate_class ()])
369
367
370
368
0 commit comments