Skip to content

Commit c1c41b8

Browse files
authored
Fix issue with annotated class constants (#4266)
1 parent 245feab commit c1c41b8

File tree

4 files changed

+38
-24
lines changed

4 files changed

+38
-24
lines changed

ChangeLog

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ Release date: Undefined
1818
..
1919
Put bug fixes that will be cherry-picked to latest major version here
2020

21+
* Fix issue with annotated class constants
22+
23+
* Closes #4264
2124

2225

2326
What's New in Pylint 2.7.3?

pylint/checkers/utils.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -1461,9 +1461,16 @@ def is_attribute_typed_annotation(
14611461

14621462
def is_class_var(node: astroid.AssignName) -> bool:
14631463
"""Test if node has `ClassVar` annotation."""
1464-
return isinstance(node.parent, astroid.AnnAssign) and (
1465-
isinstance(node.parent.annotation, astroid.Subscript)
1466-
and node.parent.annotation.value.name == "ClassVar"
1467-
or isinstance(node.parent.annotation, astroid.Name)
1468-
and node.parent.annotation.name == "ClassVar"
1469-
)
1464+
if not isinstance(node.parent, astroid.AnnAssign):
1465+
return False
1466+
annotation = node.parent.annotation
1467+
if isinstance(annotation, astroid.Subscript):
1468+
annotation = annotation.value
1469+
if (
1470+
isinstance(annotation, astroid.Name)
1471+
and annotation.name == "ClassVar"
1472+
or isinstance(annotation, astroid.Attribute)
1473+
and annotation.attrname == "ClassVar"
1474+
):
1475+
return True
1476+
return False

tests/functional/n/name/name_styles.py

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import print_function
44
import abc
55
import collections
6+
import typing
67
from enum import Enum
78
from typing import ClassVar
89

@@ -154,3 +155,5 @@ class Bar:
154155
CLASS_CONST: ClassVar[int] = 42
155156
CLASS_CONST2: ClassVar = "const"
156157
variable: ClassVar[str] = "invalid name" # [invalid-name]
158+
CLASS_CONST3: typing.ClassVar
159+
variable2: typing.ClassVar[int] # [invalid-name]
+19-18
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
invalid-name:10:0::"Constant name ""bad_const_name"" doesn't conform to UPPER_CASE naming style"
2-
invalid-name:13:0:BADFUNCTION_name:"Function name ""BADFUNCTION_name"" doesn't conform to snake_case naming style"
3-
invalid-name:15:4:BADFUNCTION_name:"Variable name ""BAD_LOCAL_VAR"" doesn't conform to snake_case naming style"
4-
invalid-name:19:0:func_bad_argname:"Argument name ""NOT_GOOD"" doesn't conform to snake_case naming style"
5-
invalid-name:29:0:bad_class_name:"Class name ""bad_class_name"" doesn't conform to PascalCase naming style"
6-
invalid-name:40:8:CorrectClassName.__init__:"Attribute name ""_Bad_AtTR_name"" doesn't conform to snake_case naming style"
7-
invalid-name:41:8:CorrectClassName.__init__:"Attribute name ""Bad_PUBLIC_name"" doesn't conform to snake_case naming style"
8-
invalid-name:46:4:CorrectClassName.BadMethodName:"Method name ""BadMethodName"" doesn't conform to snake_case naming style":INFERENCE
9-
invalid-name:52:4:CorrectClassName.__DunDER_IS_not_free_for_all__:"Method name ""__DunDER_IS_not_free_for_all__"" doesn't conform to snake_case naming style":INFERENCE
10-
invalid-name:82:0::"Class name ""BAD_NAME_FOR_CLASS"" doesn't conform to PascalCase naming style"
11-
invalid-name:83:0::"Class name ""NEXT_BAD_NAME_FOR_CLASS"" doesn't conform to PascalCase naming style"
12-
invalid-name:90:0::"Class name ""NOT_CORRECT"" doesn't conform to PascalCase naming style"
13-
invalid-name:96:4:test_globals:"Constant name ""AlsoCorrect"" doesn't conform to UPPER_CASE naming style"
14-
invalid-name:109:4:FooClass.PROPERTY_NAME:"Attribute name ""PROPERTY_NAME"" doesn't conform to snake_case naming style":INFERENCE
15-
invalid-name:114:4:FooClass.ABSTRACT_PROPERTY_NAME:"Attribute name ""ABSTRACT_PROPERTY_NAME"" doesn't conform to snake_case naming style":INFERENCE
16-
invalid-name:119:4:FooClass.PROPERTY_NAME_SETTER:"Attribute name ""PROPERTY_NAME_SETTER"" doesn't conform to snake_case naming style":INFERENCE
17-
invalid-name:150:4:FooEnum:"Class constant name ""bad_enum_name"" doesn't conform to UPPER_CASE naming style"
18-
invalid-name:156:4:Bar:"Class constant name ""variable"" doesn't conform to UPPER_CASE naming style"
1+
invalid-name:11:0::"Constant name ""bad_const_name"" doesn't conform to UPPER_CASE naming style"
2+
invalid-name:14:0:BADFUNCTION_name:"Function name ""BADFUNCTION_name"" doesn't conform to snake_case naming style"
3+
invalid-name:16:4:BADFUNCTION_name:"Variable name ""BAD_LOCAL_VAR"" doesn't conform to snake_case naming style"
4+
invalid-name:20:0:func_bad_argname:"Argument name ""NOT_GOOD"" doesn't conform to snake_case naming style"
5+
invalid-name:30:0:bad_class_name:"Class name ""bad_class_name"" doesn't conform to PascalCase naming style"
6+
invalid-name:41:8:CorrectClassName.__init__:"Attribute name ""_Bad_AtTR_name"" doesn't conform to snake_case naming style"
7+
invalid-name:42:8:CorrectClassName.__init__:"Attribute name ""Bad_PUBLIC_name"" doesn't conform to snake_case naming style"
8+
invalid-name:47:4:CorrectClassName.BadMethodName:"Method name ""BadMethodName"" doesn't conform to snake_case naming style":INFERENCE
9+
invalid-name:53:4:CorrectClassName.__DunDER_IS_not_free_for_all__:"Method name ""__DunDER_IS_not_free_for_all__"" doesn't conform to snake_case naming style":INFERENCE
10+
invalid-name:83:0::"Class name ""BAD_NAME_FOR_CLASS"" doesn't conform to PascalCase naming style"
11+
invalid-name:84:0::"Class name ""NEXT_BAD_NAME_FOR_CLASS"" doesn't conform to PascalCase naming style"
12+
invalid-name:91:0::"Class name ""NOT_CORRECT"" doesn't conform to PascalCase naming style"
13+
invalid-name:97:4:test_globals:"Constant name ""AlsoCorrect"" doesn't conform to UPPER_CASE naming style"
14+
invalid-name:110:4:FooClass.PROPERTY_NAME:"Attribute name ""PROPERTY_NAME"" doesn't conform to snake_case naming style":INFERENCE
15+
invalid-name:115:4:FooClass.ABSTRACT_PROPERTY_NAME:"Attribute name ""ABSTRACT_PROPERTY_NAME"" doesn't conform to snake_case naming style":INFERENCE
16+
invalid-name:120:4:FooClass.PROPERTY_NAME_SETTER:"Attribute name ""PROPERTY_NAME_SETTER"" doesn't conform to snake_case naming style":INFERENCE
17+
invalid-name:151:4:FooEnum:"Class constant name ""bad_enum_name"" doesn't conform to UPPER_CASE naming style"
18+
invalid-name:157:4:Bar:"Class constant name ""variable"" doesn't conform to UPPER_CASE naming style"
19+
invalid-name:159:4:Bar:"Class constant name ""variable2"" doesn't conform to UPPER_CASE naming style"

0 commit comments

Comments
 (0)