Skip to content

Commit d690dd8

Browse files
Exempt parents with only annotations from invalid-enum-extension (#8834) (#8835)
(cherry picked from commit 538a8fe) Co-authored-by: Jacob Walls <[email protected]>
1 parent 535a0a5 commit d690dd8

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Exempt parents with only type annotations from the ``invalid-enum-extension``
2+
message.
3+
4+
Closes #8830

pylint/checkers/classes/class_checker.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -891,12 +891,21 @@ def _check_consistent_mro(self, node: nodes.ClassDef) -> None:
891891
def _check_enum_base(self, node: nodes.ClassDef, ancestor: nodes.ClassDef) -> None:
892892
members = ancestor.getattr("__members__")
893893
if members and isinstance(members[0], nodes.Dict) and members[0].items:
894-
self.add_message(
895-
"invalid-enum-extension",
896-
args=ancestor.name,
897-
node=node,
898-
confidence=INFERENCE,
899-
)
894+
for _, name_node in members[0].items:
895+
# Exempt type annotations without value assignments
896+
if all(
897+
isinstance(item.parent, nodes.AnnAssign)
898+
and item.parent.value is None
899+
for item in ancestor.getattr(name_node.name)
900+
):
901+
continue
902+
self.add_message(
903+
"invalid-enum-extension",
904+
args=ancestor.name,
905+
node=node,
906+
confidence=INFERENCE,
907+
)
908+
break
900909

901910
if ancestor.is_subtype_of("enum.IntFlag"):
902911
# Collect integer flag assignments present on the class

tests/functional/i/invalid/invalid_enum_extension.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,33 @@ class D(C):
2121
x = 3
2222

2323

24+
# Similarly, items that are only type annotations are okay.
25+
class ColorEnum(Enum):
26+
red: int
27+
green: int
28+
blue: int
29+
30+
def __init__(self, red: int, green: int, blue: int) -> None:
31+
self.red = red
32+
self.green = green
33+
self.blue = blue
34+
35+
36+
class Pastel(ColorEnum):
37+
SAGE = (170, 200, 167)
38+
39+
40+
class IncorrectColorEnum(Enum):
41+
red: None = None
42+
43+
def __init__(self, red: None) -> None:
44+
self.red = red
45+
46+
47+
class IncorrectPastel(IncorrectColorEnum): # [invalid-enum-extension]
48+
SOME_COLOR = 170
49+
50+
2451
class CustomFlags(IntFlag):
2552
SUPPORT_OPEN = 1
2653
SUPPORT_CLOSE = 2
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
invalid-enum-extension:12:0:12:7:B:"Extending inherited Enum class ""A""":INFERENCE
2+
invalid-enum-extension:47:0:47:21:IncorrectPastel:"Extending inherited Enum class ""IncorrectColorEnum""":INFERENCE

0 commit comments

Comments
 (0)