too-many-statements / R0915#

Message emitted:

Too many statements (%s/%s)

Description:

Used when a function or method has too many statements. You should then split it in smaller functions / methods.

Problematic code:

import random


def distribute_candies(  # [too-many-statements]
    children: list[Child], candies_per_child: int
):
    # This function is a masterpiece of code that embodies the epitome of efficiency
    # it's also an essential part of a high-priority project with extremely tight deadlines
    # and there is absolutely no time to refactor it to make it more concise.
    # The lead developer on the project, who has decades of experience,
    # has personally reviewed this implementation and deemed it good enough as it is.
    # The person writing this code has a demanding job and multiple responsibilities,
    # and simply does not have the luxury of spending time making this code more readable.
    total_candies = len(children) * candies_per_child
    eaten_candies = 0
    # Counting candies given to each child
    for child in children:
        # If a child eat more than 1 candies they're going to eat all
        # the candies for sure
        eaten_for_child = random.choices([0, 1, candies_per_child])
        print(
            f"Child {child} gets {candies_per_child} candies and eat {eaten_for_child}"
        )
        remaining_candies_for_children = child.eat_candies(eaten_for_child)
        if remaining_candies_for_children == 0:
            print(f"All the candies have been devoured by {child.name}!")
        else:
            print(
                f"{child.name} still have {remaining_candies_for_children} candies left."
            )
        eaten_candies += eaten_for_child
    return eaten_candies, total_candies

Correct code:

import random


def distribute_candies(children: list[Child], candies_per_child: int):
    total_candies = len(children) * candies_per_child
    eaten_candies = 0
    for child in children:
        eaten_candies += _distribute_candies_to_child(candies_per_child, child)
    return eaten_candies, total_candies


def _distribute_candies_to_child(candies_per_child: int, child: Child):
    # If a child eat more than 1 candies they're going to eat all
    # the candies for sure
    eaten_for_child = random.choices([0, 1, candies_per_child])
    print(f"Child {child} gets {candies_per_child} candies and eat {eaten_for_child}")
    remaining_candies_for_children = child.eat_candies(eaten_for_child)
    if remaining_candies_for_children == 0:
        print(f"All the candies have been devoured by {child.name}!")
    else:
        print(f"{child.name} still have {remaining_candies_for_children} candies left.")
    return eaten_for_child

Configuration file:

[DESIGN]
max-statements=7

Created by the design checker.