diff options
| author | hippo91 <guillaume.peillex@gmail.com> | 2019-02-09 11:04:51 +0100 |
|---|---|---|
| committer | hippo91 <guillaume.peillex@gmail.com> | 2019-02-09 11:04:51 +0100 |
| commit | e6ec4fdb36d3e085b2d82e878520e72178ff8acc (patch) | |
| tree | 917b96fcfd9d5eec39197db3149705eb2dc8ad66 | |
| parent | 2aaad9c3e94b2f9b4eb1898e3a0f9c5f68635e3e (diff) | |
| parent | 6b5991d570a3743335816c5ecda0d07f5309a337 (diff) | |
| download | astroid-git-e6ec4fdb36d3e085b2d82e878520e72178ff8acc.tar.gz | |
Merge branch 'master' into bug_pylint_2436
| -rw-r--r-- | ChangeLog | 9 | ||||
| -rw-r--r-- | astroid/brain/brain_namedtuple_enum.py | 11 | ||||
| -rw-r--r-- | astroid/tests/unittest_brain.py | 38 |
3 files changed, 54 insertions, 4 deletions
@@ -6,6 +6,15 @@ What's New in astroid 2.2.0? ============================ Release Date: TBA + +* Support non-const nodes as values of Enum attributes. + + Close #612 + +* Fix a crash in the ``enum`` brain tip caused by non-assign members in class definitions. + + Close PyCQA/pylint#2719 + * ``brain_numpy`` returns an undefined type for ``numpy`` methods to avoid ``assignment-from-no-return`` Close PyCQA/pylint#2694 diff --git a/astroid/brain/brain_namedtuple_enum.py b/astroid/brain/brain_namedtuple_enum.py index 58402f18..69e5eb8c 100644 --- a/astroid/brain/brain_namedtuple_enum.py +++ b/astroid/brain/brain_namedtuple_enum.py @@ -320,11 +320,14 @@ def infer_enum_class(node): targets = [stmt.target] inferred_return_value = None - if isinstance(stmt.value, nodes.Const): - if isinstance(stmt.value.value, str): - inferred_return_value = repr(stmt.value.value) + if isinstance(stmt, nodes.Assign): + if isinstance(stmt.value, nodes.Const): + if isinstance(stmt.value.value, str): + inferred_return_value = repr(stmt.value.value) + else: + inferred_return_value = stmt.value.value else: - inferred_return_value = stmt.value.value + inferred_return_value = stmt.value.as_string() new_targets = [] for target in targets: diff --git a/astroid/tests/unittest_brain.py b/astroid/tests/unittest_brain.py index 5eec16ad..10649f15 100644 --- a/astroid/tests/unittest_brain.py +++ b/astroid/tests/unittest_brain.py @@ -764,6 +764,44 @@ class EnumBrainTest(unittest.TestCase): inferred_string = next(node.infer()) assert inferred_string.value == "\N{NULL}" + def test_dont_crash_on_for_loops_in_body(self): + node = builder.extract_node( + """ + + class Commands(IntEnum): + _ignore_ = 'Commands index' + _init_ = 'value string' + + BEL = 0x07, 'Bell' + Commands = vars() + for index in range(4): + Commands[f'DC{index + 1}'] = 0x11 + index, f'Device Control {index + 1}' + + Commands + """ + ) + inferred = next(node.infer()) + assert isinstance(inferred, astroid.ClassDef) + + def test_enum_tuple_list_values(self): + tuple_node, list_node = builder.extract_node( + """ + import enum + + class MyEnum(enum.Enum): + a = (1, 2) + b = [2, 4] + MyEnum.a.value #@ + MyEnum.b.value #@ + """ + ) + inferred_tuple_node = next(tuple_node.infer()) + inferred_list_node = next(list_node.infer()) + assert isinstance(inferred_tuple_node, astroid.Tuple) + assert isinstance(inferred_list_node, astroid.List) + assert inferred_tuple_node.as_string() == "(1, 2)" + assert inferred_list_node.as_string() == "[2, 4]" + @unittest.skipUnless(HAS_DATEUTIL, "This test requires the dateutil library.") class DateutilBrainTest(unittest.TestCase): |
