Обходное решение проблемы вывода трассировочной информации в Python 3.1

obhodnoe reshenie problemy vyvoda trassirovochnoj informacii v python 3 1 Почтовый клиент PyMailGUI Python

Из разряда «непонятно, но факт»: для корректной работы в Python 3.1 потребовалось изменить общую функцию вывода трассировочной информации в модуле SharedNames.py. Функция print_tb из модуля traceback более не способна выводить содержимое стека в поток вывода sys.stdout, если вызывающая ее программа была запущена другой программой в Windows, но работает, как и прежде, когда вызывается из программы, запущенной из командной строки обычным способом. Так как эта функция вызывается из основного потока выполнения в случае появления исключения в рабочем потоке, любая попытка вывести трассировочную информацию (если это разрешено) приводит к полному уничтожению графического интерфейса, если он был запущен из программ запуска демонстрационных примеров.

Для решения этой проблемы функция теперь перехватывает исключения, возникающие при вызове print_tb, и повторно вызывает ее, передавая действительный файл вместо sys.stdout. Эта проблема, скорее всего, является недостатком Python 3.X, так как тот же самый программный код выполнялся без ошибок в Python 2.5 и 2.6. В отличие от других похожих проблем, данная никак не связана с поддержкой Юникода, так как трассировочная информация содержит только символы ASCII. Еще больше расстраивает тот факт, что прямой вывод в поток stdout в той же функции работает прекрасно. Однако, если бы все было просто, это не называлось бы это «работой».

Адре са «Bcc» те перь до бав ля ют ся в ар гумент функ ции от прав ки, а сам за го ло вок уда ля ет ся

Небольшое изменение: адреса, вводимые пользователем в поле ввода строки заголовка «Bcc», включаются в список получателей (на «конверте»), а сам заголовок «Bcc» не включается в текст отправляемого сообщения. В противном случае адреса в заголовке «Bcc» могут оказаться видимыми в некоторых клиентах электронной почты (включая PyMailGUI), что лишает смысла этот заголовок.

Ис клю че ние возмож но сти парал лель ной за груз ки од но го и то го же со- обще ния

Программа PyMailGUI загружает только заголовки сообщений, а полный текст загружается позднее, когда его необходимо будет просмотреть или выполнить другую операцию; при этом допускается одновременная загрузка нескольких сообщений (загрузка выполняется в параллельных потоках). Маловероятно, но вполне возможно запустить операцию загрузки письма, когда оно уже загружается, выбрав письмо еще раз (для этого достаточно два раза подряд быстро щелкнуть на элементе списка в оглавлении). Операция обновления кэша сообщений, производимая выполняющимися потоками параллельно, является безопасной, тем не менее, такое поведение не является нормальным и приводит к пустым тратам времени.

Чтобы избавиться от этого недостатка, данная версия теперь запоминает в главном потоке выполнения, какие письма загружаются в текущий момент, чтобы избежать перекрытия во времени загрузки одного и того же письма — пока сообщение загружается, запрещаются все новые запросы на получение этого письма, пока оно не будет получено полностью. При этом сохраняется возможность одновременного выполнения нескольких операций получения, при условии, что их цели не пересекаются. Для определения пересекающихся запросов используется множество. Письма, уже загруженные и помещенные в кэш, не являются предметом этой проверки и всегда доступны для выбора независимо от того, какие письма загружаются в текущий момент.

Адре са в полях вво да гра фи че ско го ин тер фей са от деля ют ся за пя ты- ми, а не точ ка ми с за пя той

В предыдущем издании в качестве символа-разделителя адресов использовался символ «;», и при передаче адреса просто разбивались по этому символу. Это было сделано с целью избежать конфликтов в адресах с символом «,», часто используемым в компоненте имени. При создании ответов перед записью в адрес «To» компонент имени отбрасывался, если он содержал «;», но сохранялась вероятность конфликтов, если символ «;» появлялся одновременно и как разделитель адресов, и как символ в компоненте имени адреса электронной почты при ручном вводе.

В версии для этого издания в качестве разделителя адресов используется символ «,», а вместо простого разбиения строки выполняется анализ списков адресов с помощью инструментов getaddresses и par- seaddr из пакета email. Поскольку эти инструменты специально предназначены для этого, символы «,», присутствующие в компонентах имен, не воспринимаются по ошибке за разделители адресов и конфликты не возникают. Серверы и клиенты обычно ожидают символ «,», поэтому все работает естественным образом.

С этими исправлениями запятые можно использовать и как разделители адресов, и как символы внутри компонентов имен. При создании ответов они обрабатываются автоматически: поле «To» заполняется содержимым поля «From» оригинального сообщения. При отправке новых писем разбиение адресов в заголовках «To», «Cc» и «Bcc» выполняется инструментами электронной почты автоматически (последние два игнорируются, если содержат первый символ «?»).

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий