Skip to content

Commit 538a8fe

Browse files
Exempt parents with only annotations from invalid-enum-extension (#8834)
1 parent f815e9f commit 538a8fe

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
@@ -893,12 +893,21 @@ def _check_consistent_mro(self, node: nodes.ClassDef) -> None:
893893
def _check_enum_base(self, node: nodes.ClassDef, ancestor: nodes.ClassDef) -> None:
894894
members = ancestor.getattr("__members__")
895895
if members and isinstance(members[0], nodes.Dict) and members[0].items:
896-
self.add_message(
897-
"invalid-enum-extension",
898-
args=ancestor.name,
899-
node=node,
900-
confidence=INFERENCE,
901-
)
896+
for _, name_node in members[0].items:
897+
# Exempt type annotations without value assignments
898+
if all(
899+
isinstance(item.parent, nodes.AnnAssign)
900+
and item.parent.value is None
901+
for item in ancestor.getattr(name_node.name)
902+
):
903+
continue
904+
self.add_message(
905+
"invalid-enum-extension",
906+
args=ancestor.name,
907+
node=node,
908+
confidence=INFERENCE,
909+
)
910+
break
902911

903912
if ancestor.is_subtype_of("enum.IntFlag"):
904913
# 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)