@@ -2452,18 +2452,20 @@ def _enumerate_with_start(
2452
2452
return False , confidence
2453
2453
2454
2454
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.
2467
2458
if isinstance (node , nodes .Const ):
2468
2459
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