@@ -881,19 +881,15 @@ def _is_dict_get_block(self, node: nodes.If) -> bool:
881
881
return isinstance (utils .safe_infer (test .ops [0 ][1 ]), nodes .Dict )
882
882
883
883
def _check_consider_get (self , node : nodes .If ) -> None :
884
- if_block_ok = self ._is_dict_get_block (node )
885
- if if_block_ok and not node .orelse :
886
- self .add_message ("consider-using-get" , node = node )
887
- elif (
888
- if_block_ok
889
- and len (node .orelse ) == 1
890
- and isinstance (node .orelse [0 ], nodes .Assign )
891
- and self ._type_and_name_are_equal (
892
- node .orelse [0 ].targets [0 ], node .body [0 ].targets [0 ]
893
- )
894
- and len (node .orelse [0 ].targets ) == 1
895
- ):
896
- self .add_message ("consider-using-get" , node = node )
884
+ if not self ._is_dict_get_block (node ):
885
+ return
886
+ match node :
887
+ case nodes .If (orelse = []):
888
+ self .add_message ("consider-using-get" , node = node )
889
+ case nodes .If (
890
+ body = [nodes .Assign (targets = [t1 ])], orelse = [nodes .Assign (targets = [t2 ])]
891
+ ) if self ._type_and_name_are_equal (t1 , t2 ):
892
+ self .add_message ("consider-using-get" , node = node )
897
893
898
894
@utils .only_required_for_messages (
899
895
"too-many-nested-blocks" ,
@@ -1374,14 +1370,14 @@ def _check_consider_using_in(self, node: nodes.BoolOp) -> None:
1374
1370
return
1375
1371
1376
1372
for value in node .values :
1377
- if (
1378
- not isinstance ( value , nodes .Compare )
1379
- or len ( value . ops ) != 1
1380
- or value . ops [ 0 ][ 0 ] not in allowed_ops [ node . op ]
1381
- ):
1382
- return
1383
- for comparable in value . left , value . ops [ 0 ][ 1 ]:
1384
- if isinstance ( comparable , nodes . Call ) :
1373
+ match value :
1374
+ case nodes . Compare ( left = nodes . Call ()) | nodes .Compare (
1375
+ ops = [ tuple ((_, nodes . Call ()))]
1376
+ ):
1377
+ return
1378
+ case nodes . Compare ( ops = [ tuple (( op , _))]) if op in allowed_ops [ node . op ]:
1379
+ pass
1380
+ case _ :
1385
1381
return
1386
1382
1387
1383
# Gather variables and values from comparisons
@@ -1822,42 +1818,43 @@ def _check_unnecessary_comprehension(self, node: nodes.Comprehension) -> None:
1822
1818
):
1823
1819
return
1824
1820
1825
- if (
1826
- isinstance (node .parent , nodes .DictComp )
1827
- and isinstance (node .parent .key , nodes .Name )
1828
- and isinstance (node .parent .value , nodes .Name )
1829
- and isinstance (node .target , nodes .Tuple )
1830
- and all (isinstance (elt , nodes .AssignName ) for elt in node .target .elts )
1831
- ):
1832
- expr_list = [node .parent .key .name , node .parent .value .name ]
1833
- target_list = [elt .name for elt in node .target .elts ]
1834
-
1835
- elif isinstance (node .parent , (nodes .ListComp , nodes .SetComp )):
1836
- expr = node .parent .elt
1837
- if isinstance (expr , nodes .Name ):
1838
- expr_list = expr .name
1839
- elif isinstance (expr , nodes .Tuple ):
1840
- if any (not isinstance (elt , nodes .Name ) for elt in expr .elts ):
1841
- return
1842
- expr_list = [elt .name for elt in expr .elts ]
1843
- else :
1844
- expr_list = []
1845
- target = node .parent .generators [0 ].target
1846
- target_list = (
1847
- target .name
1848
- if isinstance (target , nodes .AssignName )
1849
- else (
1850
- [
1851
- elt .name
1852
- for elt in target .elts
1853
- if isinstance (elt , nodes .AssignName )
1854
- ]
1855
- if isinstance (target , nodes .Tuple )
1856
- else []
1857
- )
1858
- )
1859
- else :
1860
- return
1821
+ match node :
1822
+ case nodes .Comprehension (
1823
+ target = nodes .Tuple (elts = elts ),
1824
+ parent = nodes .DictComp (
1825
+ key = nodes .Name (name = key_name ),
1826
+ value = nodes .Name (name = value_name ),
1827
+ ),
1828
+ ) if all (isinstance (elt , nodes .AssignName ) for elt in elts ):
1829
+ expr_list = [key_name , value_name ]
1830
+ target_list = [elt .name for elt in elts ]
1831
+
1832
+ case nodes .Comprehension (
1833
+ parent = nodes .ListComp () | nodes .SetComp () as parent
1834
+ ):
1835
+ match expr := parent .elt :
1836
+ case nodes .Name (name = expr_list ):
1837
+ pass
1838
+ case nodes .Tuple ():
1839
+ if not all (isinstance (elt , nodes .Name ) for elt in expr .elts ):
1840
+ return
1841
+ expr_list = [elt .name for elt in expr .elts ]
1842
+ case _:
1843
+ expr_list = []
1844
+ match target := parent .generators [0 ].target :
1845
+ case nodes .AssignName (name = target_list ):
1846
+ pass
1847
+ case nodes .Tuple ():
1848
+ target_list = [
1849
+ elt .name
1850
+ for elt in target .elts
1851
+ if isinstance (elt , nodes .AssignName )
1852
+ ]
1853
+ case _:
1854
+ target_list = []
1855
+
1856
+ case _:
1857
+ return
1861
1858
if expr_list == target_list and expr_list :
1862
1859
args : tuple [str ] | None = None
1863
1860
inferred = utils .safe_infer (node .iter )
0 commit comments