← Назад к вопросам

Что такое нечистая функция?

2.2 Middle🔥 201 комментариев
#Python Core#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Нечистая функция (Impure Function)

Нечистая функция — это функция, которая имеет побочные эффекты или зависит от внешнего состояния. Это противоположность чистой функции в функциональном программировании.

Чистая vs Нечистая функция

# ЧИСТАЯ функция
def pure_add(a, b):
    return a + b  # Зависит только от параметров

# НЕЧИСТАЯ функция
result = 0

def impure_add(a, b):
    global result  # Зависит от внешней переменной
    result = a + b
    return result

Главные признаки нечистой функции

1. Модификация глобального состояния

counter = 0

def increment():
    global counter  # Модифицирует глобальную переменную
    counter += 1
    return counter

# Результаты разные при повторном вызове
print(increment())  # 1
print(increment())  # 2

2. Модификация аргументов (mutable objects)

def add_to_list_impure(my_list, value):
    my_list.append(value)  # Изменяет переданный список!
    return my_list

original = [1, 2, 3]
result = add_to_list_impure(original, 4)
print(original)  # [1, 2, 3, 4] — функция изменила оригинал!

# Чистая версия
def add_to_list_pure(my_list, value):
    return my_list + [value]  # Создаёт новый список

original = [1, 2, 3]
result = add_to_list_pure(original, 4)
print(original)  # [1, 2, 3] — не изменился
print(result)    # [1, 2, 3, 4]

3. Ввод-вывод (I/O операции)

# НЕЧИСТАЯ функция
def load_user_data(user_id):
    response = requests.get(f"https://api.example.com/users/{user_id}")
    print(response.json())  # Print — побочный эффект
    return response.json()

# НЕЧИСТАЯ функция
def save_to_file(data):
    with open("data.txt", "w") as f:
        f.write(str(data))  # Модифицирует файловую систему

4. Зависимость от текущего времени

from datetime import datetime

# НЕЧИСТАЯ функция
def get_current_timestamp():
    return datetime.now()  # Результат зависит от текущего момента времени

# Результаты будут разными
print(get_current_timestamp())  # 2026-03-22 10:15:30.123456
print(get_current_timestamp())  # 2026-03-22 10:15:31.654321

5. Использование случайных чисел

import random

# НЕЧИСТАЯ функция
def get_random_number():
    return random.randint(1, 100)  # Непредсказуемая выходная функция

6. Исключения

# НЕЧИСТАЯ функция
def divide(a, b):
    return a / b  # Может выбросить ZeroDivisionError

Примеры из реальной практики

# НЕЧИСТАЯ
class BankAccount:
    def __init__(self, balance):
        self.balance = balance
    
    def withdraw(self, amount):
        self.balance -= amount  # Изменяет состояние объекта
        return self.balance

# ЧИСТАЯ
def calculate_new_balance(current_balance, amount):
    return current_balance - amount  # Возвращает новое значение

# Использование
acc = BankAccount(1000)
acc.withdraw(100)  # Нечистая — изменила состояние
new_balance = calculate_new_balance(1000, 100)  # Чистая — вернула результат

Почему нечистые функции — проблема?

  1. Тестирование сложнее — результат зависит от контекста
  2. Отладка затруднена — побочные эффекты скрыты
  3. Параллелизм опасен — race conditions
  4. Переиспользование сложнее — зависимость от состояния
  5. Вывод непредсказуем — одинаковый вход может дать разные результаты

Как тестировать нечистые функции?

from unittest.mock import patch

def fetch_and_process(url):
    response = requests.get(url)
    return response.json()["name"]

# Тест с мокированием
@patch("requests.get")
def test_fetch_and_process(mock_get):
    mock_get.return_value.json.return_value = {"name": "John"}
    result = fetch_and_process("http://example.com/user")
    assert result == "John"
    mock_get.assert_called_once()

Когда нечистые функции необходимы

  • Получение данных из БД
  • API запросы
  • Работа с файлами
  • Логирование
  • Взаимодействие с пользователем

Важно: изолируй побочные эффекты на границах приложения.

Итог

Чистые функции — идеал, но нечистые часто необходимы. Главное правило: изолируй побочные эффекты и минимизируй их использование в основной логике.

Что такое нечистая функция? | PrepBro