@@ -914,17 +914,16 @@ def _check_declare_non_slot(self, node: nodes.ClassDef) -> None:
914
914
# Every class in bases has __slots__, our __slots__ is non-empty and there is no __dict__
915
915
916
916
for child in node .body :
917
- if isinstance (child , nodes .AnnAssign ):
918
- if child .value is not None :
919
- continue
920
- if isinstance (child .target , nodes .AssignName ):
921
- if child .target .name not in slot_names :
922
- self .add_message (
923
- "declare-non-slot" ,
924
- args = child .target .name ,
925
- node = child .target ,
926
- confidence = INFERENCE ,
927
- )
917
+ match child :
918
+ case nodes .AnnAssign (
919
+ target = nodes .AssignName (name = name ), value = None
920
+ ) if (name not in slot_names ):
921
+ self .add_message (
922
+ "declare-non-slot" ,
923
+ args = child .target .name ,
924
+ node = child .target ,
925
+ confidence = INFERENCE ,
926
+ )
928
927
929
928
def _check_consistent_mro (self , node : nodes .ClassDef ) -> None :
930
929
"""Detect that a class has a consistent mro or duplicate bases."""
@@ -936,31 +935,30 @@ def _check_consistent_mro(self, node: nodes.ClassDef) -> None:
936
935
self .add_message ("duplicate-bases" , args = node .name , node = node )
937
936
938
937
def _check_enum_base (self , node : nodes .ClassDef , ancestor : nodes .ClassDef ) -> None :
939
- members = ancestor .getattr ("__members__" )
940
- if members and isinstance ( members [ 0 ], nodes .Dict ) and members [ 0 ]. items :
941
- for _ , name_node in members [ 0 ]. items :
942
- # Exempt type annotations without value assignments
943
- if all (
944
- isinstance (item .parent , nodes .AnnAssign )
945
- and item .parent .value is None
946
- for item in ancestor .getattr (name_node .name )
947
- ):
948
- continue
949
- self .add_message (
950
- "invalid-enum-extension" ,
951
- args = ancestor .name ,
952
- node = node ,
953
- confidence = INFERENCE ,
954
- )
955
- break
938
+ match ancestor .getattr ("__members__" ):
939
+ case [ nodes .Dict ( items = items ), * _] if items :
940
+ for _ , name_node in items :
941
+ # Exempt type annotations without value assignments
942
+ if all (
943
+ isinstance (item .parent , nodes .AnnAssign )
944
+ and item .parent .value is None
945
+ for item in ancestor .getattr (name_node .name )
946
+ ):
947
+ continue
948
+ self .add_message (
949
+ "invalid-enum-extension" ,
950
+ args = ancestor .name ,
951
+ node = node ,
952
+ confidence = INFERENCE ,
953
+ )
954
+ break
956
955
957
956
if ancestor .is_subtype_of ("enum.IntFlag" ):
958
957
# Collect integer flag assignments present on the class
959
958
assignments = defaultdict (list )
960
959
for assign_name in node .nodes_of_class (nodes .AssignName ):
961
- if isinstance (assign_name .parent , nodes .Assign ):
962
- value = getattr (assign_name .parent .value , "value" , None )
963
- if isinstance (value , int ):
960
+ match assign_name .parent :
961
+ case nodes .Assign (value = object (value = int () as value )):
964
962
assignments [value ].append (assign_name )
965
963
966
964
# For each bit position, collect all the flags that set the bit
@@ -1336,11 +1334,9 @@ def visit_functiondef(self, node: nodes.FunctionDef) -> None:
1336
1334
try :
1337
1335
overridden = klass .instance_attr (node .name )[0 ]
1338
1336
overridden_frame = overridden .frame ()
1339
- if (
1340
- isinstance (overridden_frame , nodes .FunctionDef )
1341
- and overridden_frame .type == "method"
1342
- ):
1343
- overridden_frame = overridden_frame .parent .frame ()
1337
+ match overridden_frame :
1338
+ case nodes .FunctionDef (type = "method" ):
1339
+ overridden_frame = overridden_frame .parent .frame ()
1344
1340
if not (
1345
1341
isinstance (overridden_frame , nodes .ClassDef )
1346
1342
and klass .is_subtype_of (overridden_frame .qname ())
@@ -1740,12 +1736,10 @@ def _check_invalid_class_object(self, node: nodes.AssignAttr) -> None:
1740
1736
inferred = safe_infer (node .parent .parent .value .elts [class_index ])
1741
1737
else :
1742
1738
inferred = safe_infer (node .parent .value )
1743
- if (
1744
- isinstance (inferred , (nodes .ClassDef , util .UninferableBase ))
1745
- or inferred is None
1746
- ):
1747
- # If is uninferable, we allow it to prevent false positives
1748
- return
1739
+ match inferred :
1740
+ case nodes .ClassDef () | util .UninferableBase () | None :
1741
+ # If uninferable, we allow it to prevent false positives
1742
+ return
1749
1743
self .add_message (
1750
1744
"invalid-class-object" ,
1751
1745
node = node ,
@@ -1926,12 +1920,9 @@ def _check_protected_attribute_access(
1926
1920
# through the class object or through super
1927
1921
1928
1922
# If the expression begins with a call to super, that's ok.
1929
- if (
1930
- isinstance (node .expr , nodes .Call )
1931
- and isinstance (node .expr .func , nodes .Name )
1932
- and node .expr .func .name == "super"
1933
- ):
1934
- return
1923
+ match node .expr :
1924
+ case nodes .Call (func = nodes .Name (name = "super" )):
1925
+ return
1935
1926
1936
1927
# If the expression begins with a call to type(self), that's ok.
1937
1928
if self ._is_type_self_call (node .expr ):
@@ -1960,14 +1951,10 @@ def _check_protected_attribute_access(
1960
1951
# class A:
1961
1952
# b = property(lambda: self._b)
1962
1953
1963
- stmt = node .parent .statement ()
1964
- if (
1965
- isinstance (stmt , nodes .Assign )
1966
- and len (stmt .targets ) == 1
1967
- and isinstance (stmt .targets [0 ], nodes .AssignName )
1968
- ):
1969
- name = stmt .targets [0 ].name
1970
- if _is_attribute_property (name , klass ):
1954
+ match node .parent .statement ():
1955
+ case nodes .Assign (
1956
+ targets = [nodes .AssignName (name = name )]
1957
+ ) if _is_attribute_property (name , klass ):
1971
1958
return
1972
1959
1973
1960
if (
@@ -2241,12 +2228,9 @@ def _check_init(self, node: nodes.FunctionDef, klass_node: nodes.ClassDef) -> No
2241
2228
if not isinstance (expr , nodes .Attribute ) or expr .attrname != "__init__" :
2242
2229
continue
2243
2230
# skip the test if using super
2244
- if (
2245
- isinstance (expr .expr , nodes .Call )
2246
- and isinstance (expr .expr .func , nodes .Name )
2247
- and expr .expr .func .name == "super"
2248
- ):
2249
- return
2231
+ match expr .expr :
2232
+ case nodes .Call (func = nodes .Name (name = "super" )):
2233
+ return
2250
2234
# pylint: disable = too-many-try-statements
2251
2235
try :
2252
2236
for klass in expr .expr .infer ():
0 commit comments