Skip to content

Commit cee50e6

Browse files
AWhetterPCManticore
authored andcommitted
Fixed being unable to access class attributes on a NamedTuple (#673)
Close pylint-dev/pylint#1628
1 parent 7cbde8e commit cee50e6

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ Release Date: TBA
5555

5656
Close #665
5757

58+
* Fix being unable to access class attributes on a NamedTuple.
59+
60+
Close PyCQA/pylint#1628
61+
5862

5963
What's New in astroid 2.2.0?
6064
============================

astroid/brain/brain_namedtuple_enum.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,15 @@ def infer_typing_namedtuple_class(class_node, context=None):
381381
generated_class_node = next(infer_named_tuple(node, context))
382382
for method in class_node.mymethods():
383383
generated_class_node.locals[method.name] = [method]
384+
385+
for assign in class_node.body:
386+
if not isinstance(assign, nodes.Assign):
387+
continue
388+
389+
for target in assign.targets:
390+
attr = target.name
391+
generated_class_node.locals[attr] = class_node.locals[attr]
392+
384393
return iter((generated_class_node,))
385394

386395

astroid/tests/unittest_brain.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,7 @@ def test_namedtuple_class_form(self):
10061006
from typing import NamedTuple
10071007
10081008
class Example(NamedTuple):
1009+
CLASS_ATTR = "class_attr"
10091010
mything: int
10101011
10111012
Example(mything=1)
@@ -1014,6 +1015,11 @@ class Example(NamedTuple):
10141015
inferred = next(result.infer())
10151016
self.assertIsInstance(inferred, astroid.Instance)
10161017

1018+
class_attr = inferred.getattr("CLASS_ATTR")[0]
1019+
self.assertIsInstance(class_attr, astroid.AssignName)
1020+
const = next(class_attr.infer())
1021+
self.assertEqual(const.value, "class_attr")
1022+
10171023
def test_typing_types(self):
10181024
ast_nodes = builder.extract_node(
10191025
"""

0 commit comments

Comments
 (0)