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