@@ -46,24 +46,28 @@ class NestedMinMaxChecker(BaseChecker):
4646 }
4747
4848 @classmethod
49- def is_min_max_call (cls , node : nodes .NodeNG ) -> bool :
50- if not isinstance (node , nodes .Call ):
51- return False
52-
49+ def maybe_get_inferred_min_max_call (
50+ cls , node : nodes .Call
51+ ) -> nodes .FunctionDef | None :
5352 inferred = safe_infer (node .func )
54- return (
53+ if (
5554 isinstance (inferred , nodes .FunctionDef )
5655 and inferred .qname () in cls .FUNC_NAMES
57- )
56+ ):
57+ return inferred
58+ return None
5859
5960 @classmethod
60- def get_redundant_calls (cls , node : nodes .Call ) -> list [nodes .Call ]:
61+ def get_redundant_calls (
62+ cls , node : nodes .Call , inferred_call : nodes .FunctionDef
63+ ) -> list [nodes .Call ]:
6164 return [
6265 arg
6366 for arg in node .args
6467 if (
65- cls .is_min_max_call (arg )
66- and arg .func .name == node .func .name
68+ isinstance (arg , nodes .Call )
69+ and (inferred := cls .maybe_get_inferred_min_max_call (arg ))
70+ and inferred .qname == inferred_call .qname
6771 # Nesting is useful for finding the maximum in a matrix.
6872 # Allow: max(max([[1, 2, 3], [4, 5, 6]]))
6973 # Meaning, redundant call only if parent max call has more than 1 arg.
@@ -73,10 +77,11 @@ def get_redundant_calls(cls, node: nodes.Call) -> list[nodes.Call]:
7377
7478 @only_required_for_messages ("nested-min-max" )
7579 def visit_call (self , node : nodes .Call ) -> None :
76- if not self .is_min_max_call (node ):
80+ inferred = self .maybe_get_inferred_min_max_call (node )
81+ if inferred is None :
7782 return
7883
79- redundant_calls = self .get_redundant_calls (node )
84+ redundant_calls = self .get_redundant_calls (node , inferred )
8085 if not redundant_calls :
8186 return
8287
@@ -96,7 +101,7 @@ def visit_call(self, node: nodes.Call) -> None:
96101 )
97102 break
98103
99- redundant_calls = self .get_redundant_calls (fixed_node )
104+ redundant_calls = self .get_redundant_calls (fixed_node , inferred )
100105
101106 for idx , arg in enumerate (fixed_node .args ):
102107 if not isinstance (arg , nodes .Const ):
@@ -121,11 +126,15 @@ def visit_call(self, node: nodes.Call) -> None:
121126 splat_node ,
122127 * fixed_node .args [idx + 1 : idx ],
123128 ]
124-
129+ func_name = (
130+ node .func .attrname
131+ if isinstance (node .func , nodes .Attribute )
132+ else node .func .name
133+ )
125134 self .add_message (
126135 "nested-min-max" ,
127136 node = node ,
128- args = (node . func . name , fixed_node .as_string ()),
137+ args = (func_name , fixed_node .as_string ()),
129138 confidence = INFERENCE ,
130139 )
131140
0 commit comments