Вот мы и добрались до последнего урока по созданию робота-анализатора госконтрактов. Мы уже написали весь код, научились удаленно и по расписанию запускать скрипт, а сегодня разберемся, как лучше оформлять код, чтобы с ним было проще работать и он был понятен людям со стороны.

Съемка и монтаж: Глеб Лиманский

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

Давайте вынесем некоторые функции в отдельные файлы, чтобы к ним можно было обращаться через import как к библиотекам. Например, функцию, которая получала на вход словарь и находила его значение по ключу, сделаем отдельным файлом dict_key_finder.py

Также создадим отдельный файл и для отправки письма — send_email.py. Мы немного перестроили код, там появились функции, которые называются по-другому, но суть осталась прежней. Теперь там есть функция def create_message, которая парсит датасет от «ГосЗатрат» и превращает его в письмо.

Далее — функция def send_empty_email, которая отправляет пустое письмо, если за указанный период времени в указанном регионе не набралось госконтрактов, удовлетворяющих заданным параметрам. 

Если же всё в порядке, сработает функция def send_email_with_contracts, которая соберет контракты в письмо.

Дополнительная функция def error_message — чтобы вам пришло сообщение об ошибке, если скрипт сломается

Список получателей тоже вынесем в отдельный файл email_reciepients.py. У нас там только один тестовый адрес, но их может быть столько, сколько вам необходимо.

Создадим следующий файл — get_contracts_from_clearspending.py, где мы будем обращаться к серверу «ГосЗатрат» и получать оттуда контракты. 

Файл clearspending_contract_parser.py будет парсить датасет и возвращать нам объект, который далее можно помещать в письмо.

Теперь в файле main.py мы можем обращаться ко всем этим файлам как к библиотекам и импортировать оттуда нужные нам функции. 

Изменилась и структура главного файла — появилась функция def main и конструкция if __name__ == "__main__"

def main
if __name__ == "__main__"

Так код станет гораздо чище. Все переменные внутри def main будут локальными, а извне — глобальными. К тому же стало проще запускать тесты — мы можем импортировать код в виртуальное окружение и проверить на ошибки

Робот готов! Полный код мы выложили на GitHub, чтобы вы могли внимательнее изучить его. Если появятся вопросы — как всегда, пишите в наш чат в Telegram, постараемся ответить.