File tree 4 files changed +41
-7
lines changed
tests/functional/i/invalid
4 files changed +41
-7
lines changed Original file line number Diff line number Diff line change
1
+ Fix crash in ``invalid-metaclass`` check when a metaclass had duplicate bases.
2
+
3
+ Closes #8698
Original file line number Diff line number Diff line change @@ -747,7 +747,10 @@ def _no_context_variadic(
747
747
748
748
749
749
def _is_invalid_metaclass (metaclass : nodes .ClassDef ) -> bool :
750
- mro = metaclass .mro ()
750
+ try :
751
+ mro = metaclass .mro ()
752
+ except (astroid .DuplicateBasesError , astroid .InconsistentMroError ):
753
+ return True
751
754
return not any (is_builtin_object (cls ) and cls .name == "type" for cls in mro )
752
755
753
756
Original file line number Diff line number Diff line change 5
5
# pylint: disable=multiple-statements
6
6
7
7
import abc
8
+ from pathlib import Path
9
+ from typing import Protocol
8
10
9
11
import six
10
12
from unknown import Unknown
@@ -68,3 +70,25 @@ class Invalid(metaclass=invalid_metaclass_1): # [invalid-metaclass]
68
70
69
71
class InvalidSecond (metaclass = invalid_metaclass_2 ): # [invalid-metaclass]
70
72
pass
73
+
74
+
75
+ class MetaclassWithInvalidMRO (type (object ), type (object )): # [duplicate-bases]
76
+ pass
77
+
78
+
79
+ class FifthInvalid (metaclass = MetaclassWithInvalidMRO ): # [invalid-metaclass]
80
+ pass
81
+
82
+
83
+ class Proto (Protocol ):
84
+ ...
85
+
86
+
87
+ class MetaclassWithInconsistentMRO (type (Path ), type (Proto )): # [inconsistent-mro]
88
+ pass
89
+
90
+
91
+ class SixthInvalid ( # [invalid-metaclass]
92
+ Path , Proto , metaclass = MetaclassWithInconsistentMRO
93
+ ):
94
+ pass
Original file line number Diff line number Diff line change 1
- invalid-metaclass:41:0:41:18:FirstInvalid:Invalid metaclass 'int' used:UNDEFINED
2
- invalid-metaclass:45:0:45:19:SecondInvalid:Invalid metaclass 'InvalidAsMetaclass' used:UNDEFINED
3
- invalid-metaclass:49:0:49:18:ThirdInvalid:Invalid metaclass '2' used:UNDEFINED
4
- invalid-metaclass:53:0:53:19:FourthInvalid:Invalid metaclass 'Instance of invalid_metaclass.InvalidAsMetaclass' used:UNDEFINED
5
- invalid-metaclass:65:0:65:13:Invalid:Invalid metaclass 'int' used:UNDEFINED
6
- invalid-metaclass:69:0:69:19:InvalidSecond:Invalid metaclass '1' used:UNDEFINED
1
+ invalid-metaclass:43:0:43:18:FirstInvalid:Invalid metaclass 'int' used:UNDEFINED
2
+ invalid-metaclass:47:0:47:19:SecondInvalid:Invalid metaclass 'InvalidAsMetaclass' used:UNDEFINED
3
+ invalid-metaclass:51:0:51:18:ThirdInvalid:Invalid metaclass '2' used:UNDEFINED
4
+ invalid-metaclass:55:0:55:19:FourthInvalid:Invalid metaclass 'Instance of invalid_metaclass.InvalidAsMetaclass' used:UNDEFINED
5
+ invalid-metaclass:67:0:67:13:Invalid:Invalid metaclass 'int' used:UNDEFINED
6
+ invalid-metaclass:71:0:71:19:InvalidSecond:Invalid metaclass '1' used:UNDEFINED
7
+ duplicate-bases:75:0:75:29:MetaclassWithInvalidMRO:Duplicate bases for class 'MetaclassWithInvalidMRO':UNDEFINED
8
+ invalid-metaclass:79:0:79:18:FifthInvalid:Invalid metaclass 'MetaclassWithInvalidMRO' used:UNDEFINED
9
+ inconsistent-mro:87:0:87:34:MetaclassWithInconsistentMRO:Inconsistent method resolution order for class 'MetaclassWithInconsistentMRO':UNDEFINED
10
+ invalid-metaclass:91:0:91:18:SixthInvalid:Invalid metaclass 'MetaclassWithInconsistentMRO' used:UNDEFINED
You can’t perform that action at this time.
0 commit comments