@@ -881,19 +881,15 @@ def _is_dict_get_block(self, node: nodes.If) -> bool:
881881 return isinstance (utils .safe_infer (test .ops [0 ][1 ]), nodes .Dict )
882882
883883 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 )
897893
898894 @utils .only_required_for_messages (
899895 "too-many-nested-blocks" ,
@@ -1374,14 +1370,14 @@ def _check_consider_using_in(self, node: nodes.BoolOp) -> None:
13741370 return
13751371
13761372 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 _ :
13851381 return
13861382
13871383 # Gather variables and values from comparisons
@@ -1822,42 +1818,43 @@ def _check_unnecessary_comprehension(self, node: nodes.Comprehension) -> None:
18221818 ):
18231819 return
18241820
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
18611858 if expr_list == target_list and expr_list :
18621859 args : tuple [str ] | None = None
18631860 inferred = utils .safe_infer (node .iter )
0 commit comments