@@ -2452,18 +2452,20 @@ def _enumerate_with_start(
24522452 return False , confidence
24532453
24542454 def _get_start_value (self , node : nodes .NodeNG ) -> tuple [int | None , Confidence ]:
2455- if (
2456- isinstance (node , (nodes .Name , nodes .Call , nodes .Attribute ))
2457- or isinstance (node , nodes .UnaryOp )
2458- and isinstance (node .operand , (nodes .Attribute , nodes .Name ))
2459- ):
2460- inferred = utils .safe_infer (node )
2461- # inferred can be an astroid.base.Instance as in 'enumerate(x, int(y))' or
2462- # not correctly inferred (None)
2463- start_val = inferred .value if isinstance (inferred , nodes .Const ) else None
2464- return start_val , INFERENCE
2465- if isinstance (node , nodes .UnaryOp ):
2466- return node .operand .value , HIGH
2455+ # Most common use cases are a constant integer or minus a constant integer. We
2456+ # don't need inference for that. If that's not the case, we assume arbitrary
2457+ # complexity and we use inference.
24672458 if isinstance (node , nodes .Const ):
24682459 return node .value , HIGH
2469- return None , HIGH
2460+ if isinstance (node , nodes .UnaryOp ) and isinstance (node .operand , nodes .Const ):
2461+ return node .operand .value , HIGH
2462+ inferred = utils .safe_infer (node )
2463+ if isinstance (inferred , nodes .Const ):
2464+ return inferred .value , INFERENCE
2465+ # inferred can be an 'astroid.base.Instance' in 'enumerate(x, int(y))',
2466+ # for example. We're doing nothing in this case for now, as extracting
2467+ # the value is costly.
2468+
2469+ # At this point the most likely cases is that the node is uninferable
2470+ # But we don't have to check if it's actually uninferable.
2471+ return None , INFERENCE
0 commit comments