Пишем своего робота на Python. Урок 16
Последний урок курса. Структурируем код и учимся обращаться к функциям как к библиотекам
![Пишем своего робота на Python. Урок 16](https://storage.googleapis.com/static.istories.media/uploaded/images/af0afb2bf2c4407bbe0533b459e19a0e-1920x960px_1x.png)
Вот мы и добрались до последнего урока по созданию робота-анализатора госконтрактов. Мы уже написали весь код, научились удаленно и по расписанию запускать скрипт, а сегодня разберемся, как лучше оформлять код, чтобы с ним было проще работать и он был понятен людям со стороны.
Сейчас наш проект это набор функций, которые собраны в одном файле. Так он выглядит, потому что мы последовательно разбирались с каждой функцией по отдельности. На самом деле структуру этого кода можно организовать более удобно.
Давайте вынесем некоторые функции в отдельные файлы, чтобы к ним можно было обращаться через import как к библиотекам. Например, функцию, которая получала на вход словарь и находила его значение по ключу, сделаем отдельным файлом dict_key_finder.py.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/1b3c8303af354255be3ab0a6f48df6f7-1200xautopx_1x.png)
Также создадим отдельный файл и для отправки письма — send_email.py. Мы немного перестроили код, там появились функции, которые называются по-другому, но суть осталась прежней. Теперь там есть функция def create_message, которая парсит датасет от «ГосЗатрат» и превращает его в письмо.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/3342f9361cf44e4da96dc9200e82257d-1200xautopx_1x.png)
Далее — функция def send_empty_email, которая отправляет пустое письмо, если за указанный период времени в указанном регионе не набралось госконтрактов, удовлетворяющих заданным параметрам.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/b130d397961041cf8e72e8dbf553fd49-1200xautopx_1x.png)
Если же всё в порядке, сработает функция def send_email_with_contracts, которая соберет контракты в письмо.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/cc4bfbfe3dc54a77af0b62d99bd0b807-1200xautopx_1x.png)
Дополнительная функция def error_message — чтобы вам пришло сообщение об ошибке, если скрипт сломается.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/6a38c63b1f7a4a08ad5d59e8a5534b0d-1200xautopx_1x.png)
Список получателей тоже вынесем в отдельный файл email_reciepients.py. У нас там только один тестовый адрес, но их может быть столько, сколько вам необходимо.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/fdc0334b0c0149c68d8a9786acb9d87c-1200xautopx_1x.png)
Создадим следующий файл — get_contracts_from_clearspending.py, где мы будем обращаться к серверу «ГосЗатрат» и получать оттуда контракты.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/786369046b814715a38e96d6ee402f71-1200xautopx_1x.png)
Файл clearspending_contract_parser.py будет парсить датасет и возвращать нам объект, который далее можно помещать в письмо.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/384ffbf981ca4f248b198baf95ea1af3-1200xautopx_1x.png)
Теперь в файле main.py мы можем обращаться ко всем этим файлам как к библиотекам и импортировать оттуда нужные нам функции.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/e409a30d562e49789f3024ab44e35965-1200xautopx_1x.png)
Изменилась и структура главного файла — появилась функция def main и конструкция if __name__ == "__main__".
![](https://storage.googleapis.com/static.istories.media/uploaded/images/e0a035b5fc344683a0ec7da0bd47558b-1200xautopx_1x.png)
![](https://storage.googleapis.com/static.istories.media/uploaded/images/65861bef37ce4937b738feadcc1251c5-1200xautopx_1x.png)
Так код станет гораздо чище. Все переменные внутри def main будут локальными, а извне — глобальными. К тому же стало проще запускать тесты — мы можем импортировать код в виртуальное окружение и проверить на ошибки.
Робот готов! Полный код мы выложили на GitHub, чтобы вы могли внимательнее изучить его. Если появятся вопросы — как всегда, пишите в наш чат в Telegram, постараемся ответить.