Skip to content

Commit 133681e

Browse files
Fix a false positive for class attribute typed with Final (#10712)
Co-authored-by: Jacob Walls <[email protected]>
1 parent 1496340 commit 133681e

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fix a false positive when an UPPER_CASED class attribute was raising an
2+
``invalid-name`` when typed with ``Final``.
3+
4+
Closes #10711

pylint/checkers/base/name_checker/checker.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,9 @@ def leave_module(self, _: nodes.Module) -> None:
373373
def visit_classdef(self, node: nodes.ClassDef) -> None:
374374
self._check_name("class", node.name, node)
375375
for attr, anodes in node.instance_attrs.items():
376-
if not any(node.instance_attr_ancestors(attr)):
376+
if not any(
377+
node.instance_attr_ancestors(attr)
378+
) and not utils.is_assign_name_annotated_with(anodes[0], "Final"):
377379
self._check_name("attr", attr, anodes[0])
378380

379381
@utils.only_required_for_messages("disallowed-name", "invalid-name")
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Regression test for https://github.com/pylint-dev/pylint/issues/10711."""
2+
3+
# pylint: disable=missing-class-docstring, missing-function-docstring
4+
5+
from dataclasses import dataclass
6+
from typing import Final
7+
8+
module_snake_case_constant: Final[int] = 42 # [invalid-name]
9+
MODULE_UPPER_CASE_CONSTANT: Final[int] = 42
10+
11+
12+
def function() -> None:
13+
function_snake_case_constant: Final[int] = 42
14+
FUNCTION_UPPER_CASE_CONSTANT: Final[int] = 42 # [invalid-name]
15+
print(function_snake_case_constant, FUNCTION_UPPER_CASE_CONSTANT)
16+
17+
18+
@dataclass
19+
class Class:
20+
class_snake_case_constant: Final[int] = 42 # [invalid-name]
21+
CLASS_UPPER_CASE_CONSTANT: Final[int] = 42
22+
23+
def method(self) -> None:
24+
method_snake_case_constant: Final[int] = 42
25+
METHOD_UPPER_CASE_CONSTANT: Final[int] = 42 # [invalid-name]
26+
print(method_snake_case_constant, METHOD_UPPER_CASE_CONSTANT)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
invalid-name:8:0:8:26::"Constant name ""module_snake_case_constant"" doesn't conform to UPPER_CASE naming style":HIGH
2+
invalid-name:14:4:14:32:function:"Variable name ""FUNCTION_UPPER_CASE_CONSTANT"" doesn't conform to snake_case naming style":HIGH
3+
invalid-name:20:4:20:29:Class:"Class constant name ""class_snake_case_constant"" doesn't conform to UPPER_CASE naming style":HIGH
4+
invalid-name:25:8:25:34:Class.method:"Variable name ""METHOD_UPPER_CASE_CONSTANT"" doesn't conform to snake_case naming style":HIGH

0 commit comments

Comments
 (0)