Пишем своего робота на Python. Урок 16
Последний урок курса. Структурируем код и учимся обращаться к функциям как к библиотекам
Вот мы и добрались до последнего урока по созданию робота-анализатора госконтрактов. Мы уже написали весь код, научились удаленно и по расписанию запускать скрипт, а сегодня разберемся, как лучше оформлять код, чтобы с ним было проще работать и он был понятен людям со стороны.
Сейчас наш проект это набор функций, которые собраны в одном файле. Так он выглядит, потому что мы последовательно разбирались с каждой функцией по отдельности. На самом деле структуру этого кода можно организовать более удобно.
Давайте вынесем некоторые функции в отдельные файлы, чтобы к ним можно было обращаться через 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 будут локальными, а извне — глобальными. К тому же стало проще запускать тесты — мы можем импортировать код в виртуальное окружение и проверить на ошибки.
Робот готов! Полный код мы выложили на GitHub, чтобы вы могли внимательнее изучить его. Если появятся вопросы — как всегда, пишите в наш чат в Telegram, постараемся ответить.