From 66b52a2cf766aef5dba010afa85531bb94333a41 Mon Sep 17 00:00:00 2001 From: Mark Byrne Date: Tue, 3 Oct 2023 14:26:35 +0200 Subject: [PATCH] Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined. Closes #9100 --- doc/whatsnew/fragments/9100.other | 3 +++ pylint/checkers/utils.py | 5 ++++- .../i/invalid/invalid_name/invalid_name_enum.py | 8 +++++++- .../i/invalid/invalid_name/invalid_name_enum.txt | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 doc/whatsnew/fragments/9100.other diff --git a/doc/whatsnew/fragments/9100.other b/doc/whatsnew/fragments/9100.other new file mode 100644 index 00000000000..75e19175b9c --- /dev/null +++ b/doc/whatsnew/fragments/9100.other @@ -0,0 +1,3 @@ +Fix a crash when an enum class which is also decorated with a ``dataclasses.dataclass`` decorator is defined. + +Closes #9100 diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py index d3a344c9c63..370e7fe20da 100644 --- a/pylint/checkers/utils.py +++ b/pylint/checkers/utils.py @@ -2281,5 +2281,8 @@ def is_enum_member(node: nodes.AssignName) -> bool: ): return False - enum_member_objects = frame.locals.get("__members__")[0].items + try: + enum_member_objects = frame.locals.get("__members__")[0].items + except TypeError: + return False return node.name in [name_obj.name for value, name_obj in enum_member_objects] diff --git a/tests/functional/i/invalid/invalid_name/invalid_name_enum.py b/tests/functional/i/invalid/invalid_name/invalid_name_enum.py index 5338a036931..055883f1223 100644 --- a/tests/functional/i/invalid/invalid_name/invalid_name_enum.py +++ b/tests/functional/i/invalid/invalid_name/invalid_name_enum.py @@ -1,7 +1,8 @@ """ Tests for invalid-name checker in the context of enums. """ -# pylint: disable=too-few-public-methods +# pylint: disable=too-few-public-methods, missing-class-docstring +from dataclasses import dataclass from enum import Enum @@ -28,3 +29,8 @@ def __init__(self, red: int, green: int, blue: int) -> None: def as_hex(self) -> str: """Get hex 'abcdef' representation for a color.""" return f'{self.red:0{2}x}{self.green:0{2}x}{self.blue:0{2}x}' + + +@dataclass +class Something(str, Enum): + asd: str = 'sdf' diff --git a/tests/functional/i/invalid/invalid_name/invalid_name_enum.txt b/tests/functional/i/invalid/invalid_name/invalid_name_enum.txt index 9383a49dbff..97f29cc6277 100644 --- a/tests/functional/i/invalid/invalid_name/invalid_name_enum.txt +++ b/tests/functional/i/invalid/invalid_name/invalid_name_enum.txt @@ -1 +1 @@ -invalid-name:16:4:16:14:Color:"Class constant name ""aquamarine"" doesn't conform to UPPER_CASE naming style":HIGH +invalid-name:17:4:17:14:Color:"Class constant name ""aquamarine"" doesn't conform to UPPER_CASE naming style":HIGH