Skip to content

unnecessary-enumerate (FURB148)#

Derived from the refurb linter.

Fix is sometimes available.

This rule is unstable and in preview. The --preview flag is required for use.

What it does#

Checks for uses of enumerate that discard either the index or the value when iterating over a sequence.

Why is this bad?#

The built-in enumerate function is useful when you need both the index and value of a sequence.

If you only need the index or values of a sequence, you should iterate over range(len(...)) or the sequence itself, respectively, instead. This is more efficient and communicates the intent of the code more clearly.

Known problems#

This rule is prone to false negatives due to type inference limitations; namely, it will only suggest a fix using the len builtin function if the sequence passed to enumerate is an instantiated as a list, set, dict, or tuple literal, or annotated as such with a type annotation.

The len builtin function is not defined for all object types (such as generators), and so refactoring to use len over enumerate is not always safe.

Example#

for index, _ in enumerate(sequence):
    print(index)

for _, value in enumerate(sequence):
    print(value)

Use instead:

for index in range(len(sequence)):
    print(index)

for value in sequence:
    print(value)

References#