Модуль в примере 13.21 реализует логику инициализации пакета mailtools. Как обычно, этот модуль выполняется автоматически при первой попытке импортировать пакет. Обратите внимание, что при использовании инструкций from * этот файл помещает содержимое всех вложенных модулей в пространство имен каталога — поскольку первые версии пакета mailtools состояли из единственного файла .py, такой подход обеспечивает обратную совместимость с уже существующими клиентами. Мы также должны использовать здесь синтаксис импортирования относительно пакета (from .module), потому что Python 3.X больше не включает собственный каталог пакета в путь поиска модулей (только родительский каталог пакета находится в пути поиска). Так как это корневой модуль, в него помещены также глобальные комментарии.
Пример 13.21. PP4E\Internet\Email\mailtools\__init__.py
############################################################################ пакет mailtools: интерфейс к почтовому серверу, используется клиентами pymail2, PyMailGUI и PyMailCGI; реализует загрузку, отправку, анализ, составление, удаление, возможность добавления вложений, кодирование (оба вида — MIME и Юникода) и так далее; классы, реализующие анализ, получение и отправку, могут подмешиваться в подклассы, использующие их методы, или использоваться как встраиваемые или самостоятельные объекты;
этот пакет также включает удобные подклассы для работы в немом режиме и многое другое; загружает все почтовые сообщения, если сервер POP не устанавливает верхнюю границу; не содержит специальной поддержки многопоточной модели выполнения или графического интерфейса и позволяет подклассам предоставлять свою реализацию запроса пароля; функция обратного вызова progress получает признак состояния; в случае ошибки все методы возбуждают исключения — они должны обрабатываться клиентом с графическим/другим интерфейсом; этот набор инструментов был преобразован из простого модуля в пакет: вложенные модули импортируются здесь для обратной совместимости;
4E: необходимо использовать синтаксис импортирования относительно пакета, потому что в Py 3.X каталог пакета больше не включается в путь поиска модулей при импортировании пакета, если пакет импортируется из произвольного каталога (из другого каталога, который использует этот пакет); кроме того, выполняется декодирование Юникода в тексте письма при его получении (смотрите mailFetcher), а также в некоторых частях с текстовым содержимым, которые, возможно, были закодированы в формат MIME (смотрите mailParser);
TBD: в saveparts, возможно, следовало бы открывать файл в текстовом режиме, когда основной тип определяется, как text?
TBD: в walkNamedParts, возможно, следовало бы перешагивать через нетипичные типы, такие как message/delivery—status?
TBD: поддержка Юникода не подвергалась всеобъемлющему тестированию: обращайтесь к главе 13 за дополнительными сведениями о пакете email в Py3.1, его ограничениях и о приемах, используемых здесь;
############################################################################
# собрать содержимое всех модулей здесь, если импортируется каталог пакета from .mailFetcher import *
from .mailSender import * # 4E: импортирование относительно пакета
from .mailParser import *
# экспортировать вложенные модули для инструкций from mailtools import * __all__ = ‘mailFetcher’, ‘mailSender’, ‘mailParser’
# программный код самотестирования находится в файле selftest.py, чтобы
# позволить установить путь к модулю mailconfig перед тем, как будут
# выполнены инструкции импортирования вложенных модулей выше
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011