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}")