Загрузка данных


import logging

# 1 и 2. Настраиваем логирование и вывод в файл app.log
logging.basicConfig(
    filename='app.log',      # Имя файла для логов
    level=logging.DEBUG,     # Минимальный уровень логирования (пишем всё от DEBUG и выше)
    format='%(asctime)s - %(levelname)s - %(message)s',
    encoding='utf-8'         # Чтобы корректно отображалась кириллица
)

def process_inventory(items):
    logging.info("Начало обработки списка инвентаря.")
    total_value = 0
    processed_count = 0

    for item in items:
        # Логируем каждый шаг для детального отслеживания
        logging.debug(f"Обработка предмета: {item}")
        
        # Проверка на наличие ключа 'price'
        if 'price' not in item:
            logging.warning(f"У предмета '{item.get('name', 'Неизвестно')}' отсутствует цена. Пропускаем.")
            continue
        
        # Проверка типа данных (вдруг цена указана текстом)
        if not isinstance(item['price'], (int, float)):
            logging.error(f"Неверный формат цены для '{item.get('name')}': {item['price']}. Ожидалось число.")
            continue
        
        # Проверка на логическую ошибку (цена не может быть меньше нуля)
        if item['price'] < 0:
            logging.error(f"Отрицательная цена у '{item.get('name')}': {item['price']}. Пропускаем, возможна ошибка в базе.")
            continue

        # Если все проверки пройдены, плюсуем стоимость
        total_value += item['price']
        processed_count += 1
        logging.debug(f"Промежуточная общая стоимость: {total_value}")

    logging.info(f"Обработка завершена. Успешно обработано корректных предметов: {processed_count} шт.")
    return total_value

# 3. Тестовые наборы с разными входными данными (включая "битые")
inventory_data = [
    {"name": "Фиолетовый меч", "price": 150.5},
    {"name": "Оранжевый щит", "price": "двести"},  # Вызовет ERROR (строка вместо числа)
    {"name": "Зелье маны"},                        # Вызовет WARNING (нет цены)
    {"name": "Стрелы (9 шт)", "price": -50},       # Вызовет ERROR (отрицательное значение)
    {"name": "Шлем", "price": 99.0}
]

if __name__ == "__main__":
    logging.info("--- Запуск программы ---")
    
    final_cost = process_inventory(inventory_data)
    
    print(f"Программа выполнена. Итоговая стоимость корректных предметов: {final_cost}")
    print("Подробности выполнения записаны в файл app.log")
    
    logging.info(f"Программа успешно завершила работу. Итог: {final_cost}")