Skip to content

Commit 2d8a894

Browse files
Fix false positive for inherit-non-class for generic Protocols (#9108) (#9111)
(cherry picked from commit cd4b292) Co-authored-by: Daniël van Noord <[email protected]>
1 parent 4a7ad5e commit 2d8a894

File tree

4 files changed

+33
-13
lines changed

4 files changed

+33
-13
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fixed false positive for ``inherit-non-class`` for generic Protocols.
2+
3+
Closes #9106

pylint/checkers/classes/class_checker.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -957,8 +957,9 @@ def _check_proper_bases(self, node: nodes.ClassDef) -> None:
957957
ancestor = safe_infer(base)
958958
if not ancestor:
959959
continue
960-
if isinstance(ancestor, astroid.Instance) and ancestor.is_subtype_of(
961-
"builtins.type"
960+
if isinstance(ancestor, astroid.Instance) and (
961+
ancestor.is_subtype_of("builtins.type")
962+
or ancestor.is_subtype_of(".Protocol")
962963
):
963964
continue
964965

tests/functional/i/inherit_non_class.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# pylint: disable=import-error, invalid-name, using-constant-test
55
# pylint: disable=missing-docstring, too-few-public-methods, useless-object-inheritance
66

7+
from typing import Protocol, TypeVar
78
from missing import Missing
89

910
if 1:
@@ -101,3 +102,18 @@ class Child2(ParentBad[int]): # [inherit-non-class]
101102
# Classes that don't implement '__class_getitem__' are marked as unsubscriptable
102103
class Child3(Empty[int]): # [unsubscriptable-object]
103104
pass
105+
106+
107+
T = TypeVar("T")
108+
109+
110+
class Channel(Protocol[T]):
111+
"""A generic Protocol."""
112+
113+
async def get(self) -> T:
114+
"""A get method using the generic."""
115+
116+
117+
class DirectChannel(Channel[T]):
118+
async def get(self) -> T:
119+
"""An implementation of the generic."""
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
inherit-non-class:21:0:21:9:Bad:Inheriting '1', which is not a class.:UNDEFINED
2-
inherit-non-class:24:0:24:10:Bad1:"Inheriting 'lambda abc: 42', which is not a class.":UNDEFINED
3-
inherit-non-class:27:0:27:10:Bad2:Inheriting 'object()', which is not a class.:UNDEFINED
4-
inherit-non-class:30:0:30:10:Bad3:Inheriting 'return_class', which is not a class.:UNDEFINED
5-
inherit-non-class:33:0:33:10:Bad4:Inheriting 'Empty()', which is not a class.:UNDEFINED
6-
inherit-non-class:68:0:68:24:NotInheritableBool:Inheriting 'bool', which is not a class.:UNDEFINED
7-
inherit-non-class:72:0:72:25:NotInheritableRange:Inheriting 'range', which is not a class.:UNDEFINED
8-
inherit-non-class:76:0:76:25:NotInheritableSlice:Inheriting 'slice', which is not a class.:UNDEFINED
9-
inherit-non-class:80:0:80:30:NotInheritableMemoryView:Inheriting 'memoryview', which is not a class.:UNDEFINED
10-
inherit-non-class:98:0:98:12:Child2:Inheriting 'ParentBad[int]', which is not a class.:UNDEFINED
11-
unsubscriptable-object:102:13:102:18:Child3:Value 'Empty' is unsubscriptable:UNDEFINED
1+
inherit-non-class:22:0:22:9:Bad:Inheriting '1', which is not a class.:UNDEFINED
2+
inherit-non-class:25:0:25:10:Bad1:"Inheriting 'lambda abc: 42', which is not a class.":UNDEFINED
3+
inherit-non-class:28:0:28:10:Bad2:Inheriting 'object()', which is not a class.:UNDEFINED
4+
inherit-non-class:31:0:31:10:Bad3:Inheriting 'return_class', which is not a class.:UNDEFINED
5+
inherit-non-class:34:0:34:10:Bad4:Inheriting 'Empty()', which is not a class.:UNDEFINED
6+
inherit-non-class:69:0:69:24:NotInheritableBool:Inheriting 'bool', which is not a class.:UNDEFINED
7+
inherit-non-class:73:0:73:25:NotInheritableRange:Inheriting 'range', which is not a class.:UNDEFINED
8+
inherit-non-class:77:0:77:25:NotInheritableSlice:Inheriting 'slice', which is not a class.:UNDEFINED
9+
inherit-non-class:81:0:81:30:NotInheritableMemoryView:Inheriting 'memoryview', which is not a class.:UNDEFINED
10+
inherit-non-class:99:0:99:12:Child2:Inheriting 'ParentBad[int]', which is not a class.:UNDEFINED
11+
unsubscriptable-object:103:13:103:18:Child3:Value 'Empty' is unsubscriptable:UNDEFINED

0 commit comments

Comments
 (0)