Функция должна делать одну вещь, делать её хорошо и заниматься только ей.
Здесь функция делает слишком много:
def calculate_final_total(
price: float,
quantity: int,
discount_rate: float,
tax_rate: float
) -> float:
subtotal = price * quantity
discounted_amount = subtotal * (1 - discount_rate)
final_total = discounted_amount * (1 + tax_rate)
return final_total
Проблема в том, что расчёт суммы, скидки и налога объединён в одном месте. Любое изменение одного из этапов может затронуть всю функцию.
Лучше разделить логику на небольшие функции:
def calculate_subtotal(price: float, quantity: int) -> float:
return price * quantity
def apply_discount(subtotal: float, discount: float) -> float:
return subtotal * (1 - discount)
def calculate_tax(amount: float, tax_rate: float) -> float:
return amount * (1 + tax_rate)
Так намного лучше.
Небольшие функции с одной конкретной задачей проще покрывать юнит-тестами: у них меньше зависимостей и реже нужны моки.
Плюс такие компоненты проще переиспользовать в других частях приложения или пайплайна, не подтягивая лишнюю логику.
Поэтому держите функции простыми и сфокусированными. Одна функция — одна ответственность.
👉 @PythonPortal
