3.2.md
1> **Источник:** https://python-all.ru/3.5/whatsnew/3.2.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.289| Автор: | Рэймонд Хеттингер |10| --- | --- |1112В этой статье описаны новые возможности Python 3.2 по сравнению с версией 3.1. Она сосредоточена на нескольких ключевых моментах и приводит несколько примеров. Полные сведения см. в файле [Misc/NEWS](https://python-all.ru/src/3.2/Misc/NEWS).1314> **См. также**15>16> [**PEP 392**](https://python-all.ru/3.5/whatsnew/3.2.html) - График выпуска Python 3.21718## PEP 384: Определение стабильного ABI1920Раньше модули расширения, собранные для одной версии Python, часто были несовместимы с другими версиями. Особенно в Windows каждый выпуск с новыми возможностями требовал пересборки всех модулей расширения, которые хотелось использовать. Это было следствием свободного доступа к внутренним структурам интерпретатора Python, который могли использовать модули расширения.2122В Python 3.2 появляется альтернативный подход: модули расширения, ограничивающие себя ограниченным API (определяя Py\_LIMITED\_API), не могут использовать многие внутренние структуры, но ограничены набором функций API, которые обещают быть стабильными на протяжении нескольких выпусков. В результате модули расширения, собранные для 3.2 в этом режиме, будут также работать с 3.3, 3.4 и так далее. Модули расширения, использующие детали структур памяти, по-прежнему можно собирать, но их придётся перекомпилировать для каждого выпуска с новыми возможностями.2324> **См. также**25>26> **[**PEP 384**](https://python-all.ru/3.5/whatsnew/3.2.html) - Определение стабильного ABI**27>28> PEP написан Мартином фон Лёвисом.2930## PEP 389: Модуль разбора командной строки argparse3132Новый модуль для разбора командной строки, [`argparse`](https://python-all.ru/3.5/library/argparse.html#module-argparse), был представлен, чтобы преодолеть ограничения [`optparse`](https://python-all.ru/3.5/library/optparse.html#module-optparse), который не поддерживал позиционные аргументы (не только опции), подкоманды, обязательные опции и другие типовые паттерны задания и проверки опций.3334Этот модуль уже получил широкое распространение в сообществе как сторонний модуль. Будучи более функциональным, чем его предшественник, модуль [`argparse`](https://python-all.ru/3.5/library/argparse.html#module-argparse) теперь является предпочтительным для обработки командной строки. Старый модуль по-прежнему доступен из-за большого объёма устаревшего кода, который от него зависит.3536Вот пример аннотированного парсера, показывающий такие возможности, как ограничение результатов набором вариантов, указание *metavar* в справке, проверка наличия одного или нескольких позиционных аргументов и создание обязательной опции:3738```python39import argparse40parser = argparse.ArgumentParser(41 description = 'Manage servers', # основное описание для справки42 epilog = 'Tested on Solaris and Linux') # отображается после справки43parser.add_argument('action', # имя аргумента44 choices = ['deploy', 'start', 'stop'], # три допустимых значения45 help = 'action on each target') # сообщение справки46parser.add_argument('targets',47 metavar = 'HOSTNAME', # имя переменной, используемое в сообщении справки48 nargs = '+', # требуется одна или несколько целей49 help = 'url for target machines') # пояснение к сообщению справки50parser.add_argument('-u', '--user', # опция -u или --user51 required = True, # сделать его обязательным аргументом52 help = 'login as user')53```5455Пример вызова парсера для командной строки:5657```python58>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'59>>> result = parser.parse_args(cmd.split())60>>> result.action61'deploy'62>>> result.targets63['sneezy.example.com', 'sleepy.example.com']64>>> result.user65'skycaptain'66```6768Пример автоматически сгенерированной справки парсера:6970```python71>>> parser.parse_args('-h'.split())7273usage: manage_cloud.py [-h] -u USER74 {deploy,start,stop} HOSTNAME [HOSTNAME ...]7576Manage servers7778positional arguments:79 {deploy,start,stop} action on each target80 HOSTNAME url for target machines8182optional arguments:83 -h, --help show this help message and exit84 -u USER, --user USER login as user8586Tested on Solaris and Linux87```8889Особенно удобная возможность [`argparse`](https://python-all.ru/3.5/library/argparse.html#module-argparse) – это возможность определять подпарсеры, каждый со своими шаблонами аргументов и справкой:9091```python92import argparse93parser = argparse.ArgumentParser(prog='HELM')94subparsers = parser.add_subparsers()9596parser_l = subparsers.add_parser('launch', help='Launch Control') # первая подгруппа97parser_l.add_argument('-m', '--missiles', action='store_true')98parser_l.add_argument('-t', '--torpedos', action='store_true')99100parser_m = subparsers.add_parser('move', help='Move Vessel', # вторая подгруппа101 aliases=('steer', 'turn')) # эквивалентные имена102parser_m.add_argument('-c', '--course', type=int, required=True)103parser_m.add_argument('-s', '--speed', type=int, default=0)104```105106```console107$ ./helm.py --help # справка верхнего уровня (запуск и перемещение)108$ ./helm.py launch --help # справка по параметрам запуска109$ ./helm.py launch --missiles # задать missiles=True и torpedos=False110$ ./helm.py steer --course 180 --speed 5 # задать параметры движения111```112113> **См. также**114>115> **[**PEP 389**](https://python-all.ru/3.5/whatsnew/3.2.html) - Новый модуль разбора командной строки**116>117> PEP написан Стивеном Бетардом.118>119> [Обновление кода optparse](https://python-all.ru/3.5/library/argparse.html#upgrading-optparse-code) за подробностями о различиях с [`optparse`](https://python-all.ru/3.5/library/optparse.html#module-optparse).120121## PEP 391: Конфигурация логирования на основе словарей122123Модуль [`logging`](https://python-all.ru/3.5/library/logging.html#module-logging) предоставлял два вида конфигурации: один строится на вызовах функций для каждого параметра, другой – на внешнем файле в формате `ConfigParser`. Эти варианты не давали гибкости для создания конфигураций из файлов JSON или YAML, а также не поддерживали инкрементальную настройку, необходимую для задания параметров логгера из командной строки.124125Для поддержки более гибкого подхода модуль теперь предлагает [`logging.config.dictConfig()`](https://python-all.ru/3.5/library/logging.config.html#logging.config.dictConfig) для задания конфигурации логирования с помощью обычных словарей Python. Параметры конфигурации включают форматтеры, обработчики, фильтры и логгеры. Вот рабочий пример словаря конфигурации:126127```python128{"version": 1,129 "formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},130 "full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}131 },132 "handlers": {"console": {133 "class": "logging.StreamHandler",134 "formatter": "brief",135 "level": "INFO",136 "stream": "ext://sys.stdout"},137 "console_priority": {138 "class": "logging.StreamHandler",139 "formatter": "full",140 "level": "ERROR",141 "stream": "ext://sys.stderr"}142 },143 "root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}144```145146Если этот словарь сохранён в файле `conf.json`, его можно загрузить и вызвать следующим кодом:147148```python149>>> import json, logging.config150>>> with open('conf.json') as f:151... conf = json.load(f)152...153>>> logging.config.dictConfig(conf)154>>> logging.info("Transaction completed normally")155INFO : root : Transaction completed normally156>>> logging.critical("Abnormal termination")1572011-02-17 11:14:36,694 root CRITICAL Abnormal termination158```159160> **См. также**161>162> **[**PEP 391**](https://python-all.ru/3.5/whatsnew/3.2.html) – Конфигурация логирования на основе словарей**163>164> PEP написан Винаем Саджипом.165166## PEP 3148: Модуль `concurrent.futures`167168Код для создания параллельного выполнения и управления им собирается в новом пространстве имён верхнего уровня *concurrent*. Первый его компонент – пакет *futures*, предоставляющий единый высокоуровневый интерфейс для управления потоками и процессами.169170Дизайн [`concurrent.futures`](https://python-all.ru/3.5/library/concurrent.futures.html#module-concurrent.futures) был вдохновлён пакетом *java.util.concurrent*. В этой модели выполняющийся вызов и его результат представлены объектом [`Future`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.Future), который абстрагирует общие для потоков, процессов и удалённых вызовов возможности. Этот объект поддерживает проверку состояния (выполняется или завершён), таймауты, отмены, добавление колбэков и доступ к результатам или исключениям.171172Основная часть нового модуля – два класса исполнителей для запуска и управления вызовами. Цель исполнителей – упростить использование существующих инструментов для параллельных вызовов. Они избавляют от необходимости настраивать пул ресурсов, запускать вызовы, создавать очередь результатов, добавлять обработку таймаутов и ограничивать общее количество потоков, процессов или удалённых вызовов.173174В идеале каждое приложение должно использовать один общий исполнитель для нескольких компонентов, чтобы ограничения на процессы и потоки управлялись централизованно. Это решает проблему проектирования, возникающую, когда у каждого компонента своя конкурирующая стратегия управления ресурсами.175176Оба класса имеют общий интерфейс с тремя методами: [`submit()`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.Executor.submit) для планирования вызываемого объекта и возврата объекта [`Future`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.Future); [`map()`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.Executor.map) для планирования нескольких асинхронных вызовов одновременно и [`shutdown()`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.Executor.shutdown) для освобождения ресурсов. Класс является [контекстным менеджером](https://python-all.ru/3.5/glossary.html#term-context-manager) и может использоваться в операторе [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), чтобы гарантировать автоматическое освобождение ресурсов после завершения всех ожидающих future.177178Простой пример [`ThreadPoolExecutor`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) – запуск четырёх параллельных потоков для копирования файлов:179180```python181import concurrent.futures, shutil182with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:183 e.submit(shutil.copy, 'src1.txt', 'dest1.txt')184 e.submit(shutil.copy, 'src2.txt', 'dest2.txt')185 e.submit(shutil.copy, 'src3.txt', 'dest3.txt')186 e.submit(shutil.copy, 'src3.txt', 'dest4.txt')187```188189> **См. также**190>191> **[**PEP 3148**](https://python-all.ru/3.5/whatsnew/3.2.html) – Futures – асинхронное выполнение вычислений**192>193> PEP написан Брайаном Куинланом.194>195> [Код для параллельного чтения URL в потоках](https://python-all.ru/3.5/library/concurrent.futures.html#threadpoolexecutor-example) – пример использования потоков для параллельной загрузки нескольких веб-страниц.196>197> [Код для параллельного вычисления простых чисел](https://python-all.ru/3.5/library/concurrent.futures.html#processpoolexecutor-example) – пример, демонстрирующий [`ProcessPoolExecutor`](https://python-all.ru/3.5/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor).198199## PEP 3147: Директории репозитория PYC200201Схема кэширования байт-кода Python в файлы *.pyc* плохо работала в средах с несколькими интерпретаторами Python. Если один интерпретатор встречал кэшированный файл, созданный другим, он перекомпилировал исходный код и перезаписывал кэш, теряя преимущества кэширования.202203Проблема «pyc-войн» стала более заметной, поскольку в дистрибутивах Linux стало обычным делом поставлять несколько версий Python. Эти конфликты возникают и с альтернативными реализациями CPython, такими как Unladen Swallow.204205Чтобы решить эту проблему, механизм импорта Python был расширен для использования разных имён файлов для каждого интерпретатора. Вместо того чтобы Python 3.2, Python 3.3 и Unladen Swallow конкурировали за файл с именем «mymodule.pyc», теперь они будут искать «mymodule.cpython-32.pyc», «mymodule.cpython-33.pyc» и «mymodule.unladen10.pyc». А чтобы все эти новые файлы не засоряли исходные каталоги, файлы *pyc* теперь собираются в каталог «\_\_pycache\_\_», расположенный внутри каталога пакета.206207Помимо имён файлов и целевых каталогов, новая схема имеет несколько аспектов, видимых программисту:208209- Импортированные модули теперь имеют атрибут [`__cached__`](https://python-all.ru/3.5/reference/import.html#__cached__), хранящий имя файла, который был импортирован:210211 ```python212 >>> import collections213 >>> collections.__cached__ # doctest: +SKIP214 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'215 ```216- Уникальный для каждого интерпретатора тег доступен из модуля [`imp`](https://python-all.ru/3.5/library/imp.html#module-imp):217218 ```python219 >>> import imp220 >>> imp.get_tag() # doctest: +SKIP221 'cpython-32'222 ```223- Скрипты, пытающиеся определить имя исходного файла по импортированному файлу, теперь должны быть умнее. Просто удалить букву «c» из имени файла «.pyc» уже недостаточно. Вместо этого используйте новые функции из модуля [`imp`](https://python-all.ru/3.5/library/imp.html#module-imp):224225 ```python226 >>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')227 'c:/py32/lib/collections.py'228 >>> imp.cache_from_source('c:/py32/lib/collections.py') # doctest: +SKIP229 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'230 ```231- Модули [`py_compile`](https://python-all.ru/3.5/library/py_compile.html#module-py_compile) и [`compileall`](https://python-all.ru/3.5/library/compileall.html#module-compileall) были обновлены, чтобы отразить новое соглашение об именовании и целевой каталог. Вызов из командной строки *compileall* получил новые опции: `-i` для указания списка файлов и каталогов для компиляции и `-b`, которая заставляет записывать файлы байт-кода в их прежнее расположение, а не в *\_\_pycache\_\_*.232- Модуль [`importlib.abc`](https://python-all.ru/3.5/library/importlib.html#module-importlib.abc) обновлён новыми [абстрактными базовыми классами](https://python-all.ru/3.5/glossary.html#term-abstract-base-class) для загрузки файлов байт-кода. Устаревшие ABC, `PyLoader` и `PyPycLoader`, объявлены устаревшими (в документацию включены инструкции по сохранению совместимости с Python 3.1).233234> **См. также**235>236> **[**PEP 3147**](https://python-all.ru/3.5/whatsnew/3.2.html) – Директории репозитория PYC**237>238> PEP написан Барри Варшавой.239240## PEP 3149: .so-файлы с тегом версии ABI241242Директория репозитория PYC позволяет размещать несколько кэшированных файлов байт-кода в одном месте. Этот PEP реализует аналогичный механизм для разделяемых объектных файлов, помещая их в общую директорию с разными именами для каждой версии.243244Общая директория называется «pyshared», а имена файлов различаются указанием реализации Python (например, CPython, PyPy, Jython и т.д.), номерами старшей и младшей версии, а также необязательными флагами сборки (например, «d» для отладки, «m» для pymalloc, «u» для wide-unicode). Для произвольного пакета «foo» при установке дистрибутивного пакета можно увидеть такие файлы:245246```python247/usr/share/pyshared/foo.cpython-32m.so248/usr/share/pyshared/foo.cpython-33md.so249```250251В самом Python теги доступны через функции из модуля [`sysconfig`](https://python-all.ru/3.5/library/sysconfig.html#module-sysconfig):252253```python254>>> import sysconfig255>>> sysconfig.get_config_var('SOABI') # найти тег версии256'cpython-32mu'257>>> sysconfig.get_config_var('EXT_SUFFIX') # найти полное расширение имени файла258'.cpython-32mu.so'259```260261> **См. также**262>263> **[**PEP 3149**](https://python-all.ru/3.5/whatsnew/3.2.html) – файлы .so с тегами версии ABI**264>265> PEP написан Барри Варшавой.266267## PEP 3333: Python Web Server Gateway Interface v1.0.1268269Этот информационный PEP разъясняет, как в протоколе WSGI следует обрабатывать вопросы, связанные с байтами и текстом. Сложность в том, что в Python 3 со строками удобнее всего работать через тип [`str`](https://python-all.ru/3.5/library/stdtypes.html#str), хотя сам протокол HTTP ориентирован на байты.270271PEP различает так называемые *нативные строки*, используемые для заголовков и метаданных запросов/ответов, и *байтовые строки*, используемые для тел запросов и ответов.272273*Нативные строки* всегда имеют тип [`str`](https://python-all.ru/3.5/library/stdtypes.html#str), но ограничены кодовыми точками от *U+0000* до *U+00FF*, которые могут быть преобразованы в байты с использованием кодировки *Latin-1*. Эти строки используются для ключей и значений в словаре окружения, а также для заголовков и статусов ответов в функции `start_response()`. Они должны соответствовать [**RFC 2616**](https://python-all.ru/3.5/whatsnew/3.2.html) в отношении кодировки. То есть они должны быть либо символами *ISO-8859-1*, либо использовать кодировку MIME [**RFC 2047**](https://python-all.ru/3.5/whatsnew/3.2.html).274275Для разработчиков, переносящих WSGI-приложения с Python 2, вот ключевые моменты:276277- Если приложение уже использовало строки для заголовков в Python 2, никаких изменений не требуется.278- Если же приложение кодировало выходные заголовки или декодировало входные, то заголовки потребуется перекодировать в Latin-1. Например, выходной заголовок, закодированный в utf-8, использовал `h.encode('utf-8')`, теперь же необходимо преобразовать байты в нативные строки с помощью `h.encode('utf-8').decode('latin-1')`.279- Значения, возвращаемые приложением или отправляемые с помощью метода `write()`, должны быть байтовыми строками. Функция `start_response()` и environ должны использовать нативные строки. Их нельзя смешивать.280281Для разработчиков серверов, пишущих CGI-to-WSGI мосты или другие протоколы в стиле CGI, пользователи должны иметь возможность доступа к окружению через нативные строки, даже если базовая платформа использует другую конвенцию. Для преодоления этого разрыва в модуле [`wsgiref`](https://python-all.ru/3.5/library/wsgiref.html#module-wsgiref) появилась новая функция [`wsgiref.handlers.read_environ()`](https://python-all.ru/3.5/library/wsgiref.html#wsgiref.handlers.read_environ) для перекодирования CGI-переменных из [`os.environ`](https://python-all.ru/3.5/library/os.html#os.environ) в нативные строки и возврата нового словаря.282283> **См. также**284>285> **[**PEP 3333**](https://python-all.ru/3.5/whatsnew/3.2.html) – Python Web Server Gateway Interface v1.0.1**286>287> PEP написан Филлипом Иби.288289## Прочие изменения языка290291Некоторые небольшие изменения, внесённые в ядро языка Python:292293- Форматирование строк для [`format()`](https://python-all.ru/3.5/library/functions.html#format) и [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format) получило новые возможности для символа формата **#**. Ранее для целых чисел в двоичной, восьмеричной или шестнадцатеричной системе он добавлял префикс «0b», «0o» или «0x» соответственно. Теперь он также может обрабатывать числа с плавающей точкой, комплексные числа и Decimal, при этом вывод всегда содержит десятичную точку, даже если после неё нет цифр.294295 ```python296 >>> format(20, '#o')297 '0o24'298 >>> format(12.34, '#5.0f')299 ' 12.'300 ```301302 (Предложено Марком Дикинсоном и реализовано Эриком Смитом в [bpo-7094](https://python-all.ru/3.5/whatsnew/3.2.html).)303- Также появился новый метод [`str.format_map()`](https://python-all.ru/3.5/library/stdtypes.html#str.format_map), расширяющий возможности существующего метода [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format) за счёт приёма произвольных [объектов-отображений](https://python-all.ru/3.5/glossary.html#term-mapping). Этот новый метод позволяет использовать форматирование строк с любыми словареподобными объектами Python, такими как [`defaultdict`](https://python-all.ru/3.5/library/collections.html#collections.defaultdict), [`Shelf`](https://python-all.ru/3.5/library/shelve.html#shelve.Shelf), [`ConfigParser`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser) или [`dbm`](https://python-all.ru/3.5/library/dbm.html#module-dbm). Он также полезен с пользовательскими подклассами [`dict`](https://python-all.ru/3.5/library/stdtypes.html#dict), которые нормализуют ключи перед поиском или предоставляют метод [`__missing__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__missing__) для неизвестных ключей:304305 ```python306 >>> import shelve307 >>> d = shelve.open('tmp.shl')308 >>> 'The {project_name} status is {status} as of {date}'.format_map(d)309 'The testing project status is green as of February 15, 2011'310311 >>> class LowerCasedDict(dict):312 ... def __getitem__(self, key):313 ... return dict.__getitem__(self, key.lower())314 >>> lcd = LowerCasedDict(part='widgets', quantity=10)315 >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd)316 'There are 10 widgets in stock'317318 >>> class PlaceholderDict(dict):319 ... def __missing__(self, key):320 ... return '<{}>'.format(key)321 >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict())322 'Hello <name>, welcome to <location>'323 ```324325> (Предложено Рэймондом Хеттингером и реализовано Эриком Смитом в326>327> [bpo-6081](https://python-all.ru/3.5/whatsnew/3.2.html)328>329> .)330331- Интерпретатор теперь можно запускать с тихим режимом, опцией `-q`, чтобы предотвратить отображение информации об авторских правах и версии в интерактивном режиме. Состояние опции можно проверить через атрибут [`sys.flags`](https://python-all.ru/3.5/library/sys.html#sys.flags):332333 ```console334 $ python -q335 >>> sys.flags336 sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,337 optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,338 ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)339 ```340341 (Предложено Марчином Войдыром в [bpo-1772833](https://python-all.ru/3.5/whatsnew/3.2.html)).342- Функция [`hasattr()`](https://python-all.ru/3.5/library/functions.html#hasattr) работает, вызывая [`getattr()`](https://python-all.ru/3.5/library/functions.html#getattr) и определяя, было ли возбуждено исключение. Эта техника позволяет ей обнаруживать методы, созданные динамически с помощью [`__getattr__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__getattribute__), которые иначе отсутствовали бы в словаре класса. Раньше *hasattr* перехватывал любые исключения, что могло маскировать настоящие ошибки. Теперь *hasattr* был ужесточён и перехватывает только [`AttributeError`](https://python-all.ru/3.5/library/exceptions.html#AttributeError), пропуская другие исключения:343344 ```python345 >>> class A:346 ... @property347 ... def f(self):348 ... return 1 // 0349 ...350 >>> a = A()351 >>> hasattr(a, 'f')352 Traceback (most recent call last):353 ...354 ZeroDivisionError: integer division or modulo by zero355 ```356357 (Обнаружено Юрием Селивановым и исправлено Бенджамином Петерсоном; [bpo-9666](https://python-all.ru/3.5/whatsnew/3.2.html).)358- [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) числа с плавающей точкой или комплексного числа теперь совпадает с его [`repr()`](https://python-all.ru/3.5/library/functions.html#repr). Ранее форма [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) была короче, но это лишь вызывало путаницу, и теперь в ней больше нет необходимости, поскольку по умолчанию отображается самая короткая возможная [`repr()`](https://python-all.ru/3.5/library/functions.html#repr):359360 ```python361 >>> import math362 >>> repr(math.pi)363 '3.141592653589793'364 >>> str(math.pi)365 '3.141592653589793'366 ```367368 (Предложено и реализовано Марком Дикинсоном; [bpo-9337](https://python-all.ru/3.5/whatsnew/3.2.html).)369- Объекты [`memoryview`](https://python-all.ru/3.5/library/stdtypes.html#memoryview) теперь имеют метод [`release()`](https://python-all.ru/3.5/library/stdtypes.html#memoryview.release), а также поддерживают протокол менеджера контекста. Это позволяет своевременно освобождать любые ресурсы, которые были получены при запросе буфера от исходного объекта.370371 ```python372 >>> with memoryview(b'abcdefgh') as v:373 ... print(v.tolist())374 [97, 98, 99, 100, 101, 102, 103, 104]375 ```376377 (Добавлено Антуаном Питру; [bpo-9757](https://python-all.ru/3.5/whatsnew/3.2.html).)378- Ранее было запрещено удалять имя из локального пространства имён, если оно встречается как свободная переменная во вложенном блоке:379380 ```python381 def outer(x):382 def inner():383 return x384 inner()385 del x386 ```387388 Теперь это разрешено. Помните, что цель (target) в предложении [`except`](https://python-all.ru/3.5/reference/compound_stmts.html#except) очищается, поэтому этот код, который работал в Python 2.6, вызывал [`SyntaxError`](https://python-all.ru/3.5/library/exceptions.html#SyntaxError) в Python 3.1, а теперь снова работает:389390 ```python391 def f():392 def print_error():393 print(e)394 try:395 something396 except Exception as e:397 print_error()398 # неявное "del e" здесь399 ```400401 (См. [bpo-4617](https://python-all.ru/3.5/whatsnew/3.2.html).)402- Внутренний инструмент `structsequence` теперь создаёт подклассы tuple. Это означает, что структуры C, такие как возвращаемые [`os.stat()`](https://python-all.ru/3.5/library/os.html#os.stat), [`time.gmtime()`](https://python-all.ru/3.5/library/time.html#time.gmtime) и [`sys.version_info`](https://python-all.ru/3.5/library/sys.html#sys.version_info), теперь работают как [именованный кортеж](https://python-all.ru/3.5/glossary.html#term-named-tuple) и работают с функциями и методами, ожидающими tuple в качестве аргумента. Это большой шаг вперёд в обеспечении гибкости структур C, сравнимой с их аналогами на чистом Python:403404 ```python405 >>> import sys406 >>> isinstance(sys.version_info, tuple)407 True408 >>> 'Version %d.%d.%d %s(%d)' % sys.version_info # doctest: +SKIP409 'Version 3.2.0 final(0)'410 ```411412 (Предложено Arfrever Frehtes Taifersar Arahesis и реализовано Benjamin Peterson в [bpo-8413](https://python-all.ru/3.5/whatsnew/3.2.html).)413- Теперь предупреждениями проще управлять с помощью переменной окружения [`PYTHONWARNINGS`](https://python-all.ru/3.5/using/cmdline.html#envvar-PYTHONWARNINGS) в качестве альтернативы использованию `-W` в командной строке:414415 ```console416 $ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'417 ```418419 (Предложено Barry Warsaw и реализовано Philip Jenvey в [bpo-7301](https://python-all.ru/3.5/whatsnew/3.2.html).)420- Добавлена новая категория предупреждений [`ResourceWarning`](https://python-all.ru/3.5/library/exceptions.html#ResourceWarning). Она выдаётся при обнаружении потенциальных проблем с потреблением ресурсов или очисткой. По умолчанию она отключена в обычных сборках, но её можно включить средствами модуля [`warnings`](https://python-all.ru/3.5/library/warnings.html#module-warnings) или в командной строке.421422 При завершении интерпретатора выдаётся [`ResourceWarning`](https://python-all.ru/3.5/library/exceptions.html#ResourceWarning), если список [`gc.garbage`](https://python-all.ru/3.5/library/gc.html#gc.garbage) не пуст, и если установлен [`gc.DEBUG_UNCOLLECTABLE`](https://python-all.ru/3.5/library/gc.html#gc.DEBUG_UNCOLLECTABLE), то печатаются все несобираемые объекты. Это сделано для того, чтобы программист знал, что его код содержит проблемы с финализацией объектов.423424 [`ResourceWarning`](https://python-all.ru/3.5/library/exceptions.html#ResourceWarning) также выдаётся, когда [объект файла](https://python-all.ru/3.5/glossary.html#term-file-object) уничтожается без явного закрытия. Хотя деаллокатор такого объекта гарантирует закрытие нижележащего ресурса операционной системы (обычно файлового дескриптора), задержка с деаллокацией объекта может вызывать различные проблемы, особенно в Windows. Вот пример включения предупреждения из командной строки:425426 ```console427 $ python -q -Wdefault428 >>> f = open("foo", "wb")429 >>> del f430 __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>431 ```432433 (Добавлено Antoine Pitrou и Georg Brandl в [bpo-10093](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-477863](https://python-all.ru/3.5/whatsnew/3.2.html).)434- Объекты [`range`](https://python-all.ru/3.5/library/stdtypes.html#range) теперь поддерживают методы *index* и *count*. Это часть усилий по расширению реализации `collections.Sequence` [абстрактного базового класса](https://python-all.ru/3.5/glossary.html#term-abstract-base-class) на большее количество объектов. В результате язык получит более единообразный API. Кроме того, объекты [`range`](https://python-all.ru/3.5/library/stdtypes.html#range) теперь поддерживают срезы и отрицательные индексы, даже со значениями, превышающими [`sys.maxsize`](https://python-all.ru/3.5/library/sys.html#sys.maxsize). Это делает *range* более совместимым со списками:435436 ```python437 >>> range(0, 100, 2).count(10)438 1439 >>> range(0, 100, 2).index(10)440 5441 >>> range(0, 100, 2)[5]442 10443 >>> range(0, 100, 2)[0:5]444 range(0, 10, 2)445 ```446447 (Вклад Daniel Stutzbach в [bpo-9213](https://python-all.ru/3.5/whatsnew/3.2.html), Alexander Belopolsky в [bpo-2690](https://python-all.ru/3.5/whatsnew/3.2.html) и Nick Coghlan в [bpo-10889](https://python-all.ru/3.5/whatsnew/3.2.html).)448- Встроенная функция [`callable()`](https://python-all.ru/3.5/library/functions.html#callable) из Py2.x была восстановлена. Она предоставляет краткую и читаемую альтернативу использованию [абстрактного базового класса](https://python-all.ru/3.5/glossary.html#term-abstract-base-class) в выражении вида `isinstance(x, collections.Callable)`:449450 ```python451 >>> callable(max)452 True453 >>> callable(20)454 False455 ```456457 (См. [bpo-10518](https://python-all.ru/3.5/whatsnew/3.2.html).)458- Механизм импорта Python теперь может загружать модули, установленные в каталогах, в именах путей которых есть не-ASCII символы. Это решило давнюю проблему с домашними каталогами пользователей, имеющих не-ASCII символы в именах.459460> (Потребовало значительной работы от Victor Stinner в461>462> [bpo-9425](https://python-all.ru/3.5/whatsnew/3.2.html)463>464> .)465466## Новые, улучшенные и устаревшие модули467468Стандартная библиотека Python прошла значительную работу по сопровождению и улучшению качества.469470Самая важная новость для Python 3.2: пакет [`email`](https://python-all.ru/3.5/library/email.html#module-email), модуль [`mailbox`](https://python-all.ru/3.5/library/mailbox.html#module-mailbox) и модули [`nntplib`](https://python-all.ru/3.5/library/nntplib.html#module-nntplib) теперь корректно работают с моделью байты/текст в Python 3. Впервые правильно обрабатываются сообщения со смешанными кодировками.471472По всей стандартной библиотеке уделено больше внимания вопросам кодировок и различиям между текстом и байтами. В частности, взаимодействие с операционной системой теперь лучше обменивается не-ASCII данными, используя кодировку Windows MBCS, локаль-зависимые кодировки или UTF-8.473474Ещё одно важное достижение – добавление значительно улучшенной поддержки *SSL*-соединений и сертификатов безопасности.475476Кроме того, больше классов теперь реализуют [менеджер контекста](https://python-all.ru/3.5/glossary.html#term-context-manager) для удобной и надёжной очистки ресурсов с помощью оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with).477478### email479480Пригодность к использованию пакета [`email`](https://python-all.ru/3.5/library/email.html#module-email) в Python 3 в значительной степени исправлена благодаря масштабной работе R. David Murray. Проблема заключалась в том, что электронные письма обычно читаются и хранятся в виде [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes), а не [`str`](https://python-all.ru/3.5/library/stdtypes.html#str) текста, и могут содержать несколько кодировок в одном письме. Поэтому пакет email пришлось расширить, чтобы разбирать и создавать сообщения в формате байтов.481482- Новые функции [`message_from_bytes()`](https://python-all.ru/3.5/library/email.parser.html#email.message_from_bytes) и [`message_from_binary_file()`](https://python-all.ru/3.5/library/email.parser.html#email.message_from_binary_file), а также новые классы [`BytesFeedParser`](https://python-all.ru/3.5/library/email.parser.html#email.parser.BytesFeedParser) и [`BytesParser`](https://python-all.ru/3.5/library/email.parser.html#email.parser.BytesParser) позволяют разбирать двоичные данные сообщений в объекты модели.483- Если на вход модели подаются байты, [`get_payload()`](https://python-all.ru/3.5/library/email.message.html#email.message.Message.get_payload) по умолчанию декодирует тело сообщения с *Content-Transfer-Encoding*, равным *8bit*, используя кодировку, указанную в MIME-заголовках, и возвращает результирующую строку.484- Если на вход модели подаются байты, [`Generator`](https://python-all.ru/3.5/library/email.generator.html#email.generator.Generator) преобразует тела сообщений, имеющие *Content-Transfer-Encoding* со значением *8bit*, в тела с *7bit* *Content-Transfer-Encoding*.485486 Заголовки с незакодированными не-ASCII байтами считаются закодированными по [**RFC 2047**](https://python-all.ru/3.5/whatsnew/3.2.html) с использованием набора символов *unknown-8bit*.487- Новый класс [`BytesGenerator`](https://python-all.ru/3.5/library/email.generator.html#email.generator.BytesGenerator) выводит байты, сохраняя любые неизменённые не-ASCII данные, которые присутствовали во входных данных, использованных для построения модели, включая тела сообщений с *Content-Transfer-Encoding* равным *8bit*.488- Класс [`smtplib`](https://python-all.ru/3.5/library/smtplib.html#module-smtplib) [`SMTP`](https://python-all.ru/3.5/library/smtplib.html#smtplib.SMTP) теперь принимает байтовую строку для аргумента *msg* метода [`sendmail()`](https://python-all.ru/3.5/library/smtplib.html#smtplib.SMTP.sendmail), а новый метод [`send_message()`](https://python-all.ru/3.5/library/smtplib.html#smtplib.SMTP.send_message) принимает объект [`Message`](https://python-all.ru/3.5/library/email.message.html#email.message.Message) и может опционально получать адреса *from\_addr* и *to\_addrs* непосредственно из объекта.489490(Предложено и реализовано R. David Murray, [bpo-4661](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-10321](https://python-all.ru/3.5/whatsnew/3.2.html).)491492### elementtree493494Пакет [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) и его аналог `xml.etree.cElementTree` обновлены до версии 1.3.495496Добавлено несколько новых полезных функций и методов:497498- [`xml.etree.ElementTree.fromstringlist()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstringlist) – строит XML-документ из последовательности фрагментов499- [`xml.etree.ElementTree.register_namespace()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace) – для регистрации глобального префикса пространства имён500- [`xml.etree.ElementTree.tostringlist()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostringlist) для строкового представления, включая все подсписки501- [`xml.etree.ElementTree.Element.extend()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.extend) для добавления последовательности из нуля или более элементов502- [`xml.etree.ElementTree.Element.iterfind()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind) ищет элемент и подэлементы503- [`xml.etree.ElementTree.Element.itertext()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext) создаёт текстовый итератор по элементу и его подэлементам504- [`xml.etree.ElementTree.TreeBuilder.end()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.end) закрывает текущий элемент505- [`xml.etree.ElementTree.TreeBuilder.doctype()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) обрабатывает объявление doctype506507Два метода устарели:508509- `xml.etree.ElementTree.getchildren()` используйте `list(elem)`.510- `xml.etree.ElementTree.getiterator()` используйте `Element.iter`.511512Подробнее об обновлении см. в статье [Introducing ElementTree](https://python-all.ru/3.5/whatsnew/3.2.html) на сайте Фредрика Лунда.513514(Авторы: Florent Xicluna и Fredrik Lundh, [bpo-6472](https://python-all.ru/3.5/whatsnew/3.2.html).)515516### functools517518- Модуль [`functools`](https://python-all.ru/3.5/library/functools.html#module-functools) включает новый декоратор для кеширования вызовов функций. [`functools.lru_cache()`](https://python-all.ru/3.5/library/functools.html#functools.lru_cache) позволяет избежать повторных запросов к внешнему ресурсу, когда результаты предположительно одинаковы.519520 Например, добавление декоратора кеширования к функции запроса к базе данных может сократить количество обращений к базе данных для популярных поисковых запросов:521522 ```python523 >>> import functools524 >>> @functools.lru_cache(maxsize=300)525 ... def get_phone_number(name):526 ... c = conn.cursor()527 ... c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))528 ... return c.fetchone()[0]529 ```530531 ```python532 >>> for name in user_requests: # doctest: +SKIP533 ... get_phone_number(name) # кэшированный поиск534 ```535536 Чтобы помочь с выбором эффективного размера кеша, обёрнутая функция оснащается средствами отслеживания статистики кеша:537538 ```python539 >>> get_phone_number.cache_info() # doctest: +SKIP540 CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)541 ```542543 Если таблица phonelist обновляется, устаревшее содержимое кеша можно очистить с помощью:544545 ```python546 >>> get_phone_number.cache_clear()547 ```548549 (Автор: Raymond Hettinger с использованием идей дизайна от Jim Baker, Miki Tebeka и Nick Coghlan; см. [recipe 498245](https://python-all.ru/3.5/whatsnew/3.2.html), [recipe 577479](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-10586](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-10593](https://python-all.ru/3.5/whatsnew/3.2.html).)550- Декоратор [`functools.wraps()`](https://python-all.ru/3.5/library/functools.html#functools.wraps) теперь добавляет атрибут `__wrapped__`, указывающий на исходную вызываемую функцию. Это позволяет проводить интроспекцию обёрнутых функций. Он также копирует `__annotations__`, если тот определён. Кроме того, он корректно пропускает отсутствующие атрибуты, такие как `__doc__`, которые могут быть не определены для обёрнутой вызываемой функции.551552 В приведённом выше примере кеш можно удалить, восстановив исходную функцию:553554 ```python555 >>> get_phone_number = get_phone_number.__wrapped__ # некэшированная функция556 ```557558 (Авторы: Nick Coghlan и Terrence Cole; [bpo-9567](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-3445](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-8814](https://python-all.ru/3.5/whatsnew/3.2.html).)559- Чтобы упростить написание классов с методами полного сравнения, новый декоратор [`functools.total_ordering()`](https://python-all.ru/3.5/library/functools.html#functools.total_ordering) будет использовать существующие методы равенства и неравенства для заполнения остальных методов.560561 Например, указав *\_\_eq\_\_* и *\_\_lt\_\_*, можно позволить [`total_ordering()`](https://python-all.ru/3.5/library/functools.html#functools.total_ordering) заполнить *\_\_le\_\_*, *\_\_gt\_\_* и *\_\_ge\_\_*:562563 ```python564 @total_ordering565 class Student:566 def __eq__(self, other):567 return ((self.lastname.lower(), self.firstname.lower()) ==568 (other.lastname.lower(), other.firstname.lower()))569570 def __lt__(self, other):571 return ((self.lastname.lower(), self.firstname.lower()) <572 (other.lastname.lower(), other.firstname.lower()))573 ```574575 С помощью декоратора *total\_ordering* остальные методы сравнения заполняются автоматически.576577 (Автор: Raymond Hettinger.)578- Чтобы облегчить перенос программ с Python 2, функция [`functools.cmp_to_key()`](https://python-all.ru/3.5/library/functools.html#functools.cmp_to_key) преобразует устаревшую функцию сравнения в современную [функцию ключа](https://python-all.ru/3.5/glossary.html#term-key-function):579580 ```python581 >>> # порядок сортировки с учётом локали582 >>> sorted(iterable, key=cmp_to_key(locale.strcoll)) # doctest: +SKIP583 ```584585 Примеры сортировки и краткое руководство по сортировке см. в руководстве [Sorting HowTo](https://python-all.ru/3.5/whatsnew/3.2.html).586587 (Автор: Raymond Hettinger.)588589### itertools590591- Модуль [`itertools`](https://python-all.ru/3.5/library/itertools.html#module-itertools) содержит новую функцию [`accumulate()`](https://python-all.ru/3.5/library/itertools.html#itertools.accumulate), созданную по образцу оператора *scan* из APL и функции *accumulate* из Numpy:592593 ```python594 >>> from itertools import accumulate595 >>> list(accumulate([8, 2, 50]))596 [8, 10, 60]597 ```598599 ```python600 >>> prob_dist = [0.1, 0.4, 0.2, 0.3]601 >>> list(accumulate(prob_dist)) # кумулятивное распределение вероятностей602 [0.1, 0.5, 0.7, 1.0]603 ```604605 Пример использования [`accumulate()`](https://python-all.ru/3.5/library/itertools.html#itertools.accumulate) см. в [примерах для модуля random](https://python-all.ru/3.5/library/random.html#random-examples).606607 (Автор: Raymond Hettinger с учётом предложений по дизайну от Mark Dickinson.)608609### collections610611- Класс [`collections.Counter`](https://python-all.ru/3.5/library/collections.html#collections.Counter) теперь имеет две формы вычитания на месте: существующий оператор *-=* для [насыщающего вычитания](https://python-all.ru/3.5/whatsnew/3.2.html) и новый метод [`subtract()`](https://python-all.ru/3.5/library/collections.html#collections.Counter.subtract) для обычного вычитания. Первый подходит для [мультимножеств](https://python-all.ru/3.5/whatsnew/3.2.html), которые имеют только положительные счётчики, а второй больше подходит для случаев, допускающих отрицательные счётчики:612613 ```python614 >>> from collections import Counter615 >>> tally = Counter(dogs=5, cats=3)616 >>> tally -= Counter(dogs=2, cats=8) # насыщающее вычитание617 >>> tally618 Counter({'dogs': 3})619 ```620621 ```python622 >>> tally = Counter(dogs=5, cats=3)623 >>> tally.subtract(dogs=2, cats=8) # обычное вычитание624 >>> tally625 Counter({'dogs': 3, 'cats': -5})626 ```627628 (Автор: Raymond Hettinger.)629- Класс [`collections.OrderedDict`](https://python-all.ru/3.5/library/collections.html#collections.OrderedDict) имеет новый метод [`move_to_end()`](https://python-all.ru/3.5/library/collections.html#collections.OrderedDict.move_to_end), который принимает существующий ключ и перемещает его либо в первую, либо в последнюю позицию упорядоченной последовательности.630631 По умолчанию элемент перемещается на последнюю позицию. Это эквивалентно обновлению записи с помощью `od[k] = od.pop(k)`.632633 Быстрая операция перемещения в конец полезна для изменения порядка следования записей. Например, упорядоченный словарь можно использовать для отслеживания порядка доступа, упорядочивая записи от самых старых к самым недавно запрошенным.634635 ```python636 >>> from collections import OrderedDict637 >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])638 >>> list(d)639 ['a', 'b', 'X', 'd', 'e']640 >>> d.move_to_end('X')641 >>> list(d)642 ['a', 'b', 'd', 'e', 'X']643 ```644645 (Автор: Raymond Hettinger.)646- У класса [`collections.deque`](https://python-all.ru/3.5/library/collections.html#collections.deque) появилось два новых метода – [`count()`](https://python-all.ru/3.5/library/collections.html#collections.deque.count) и [`reverse()`](https://python-all.ru/3.5/library/collections.html#collections.deque.reverse), которые делают его более взаимозаменяемым с объектами [`list`](https://python-all.ru/3.5/library/stdtypes.html#list):647648 ```python649 >>> from collections import deque650 >>> d = deque('simsalabim')651 >>> d.count('s')652 2653 >>> d.reverse()654 >>> d655 deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])656 ```657658 (Автор: Raymond Hettinger.)659660### threading661662В модуле [`threading`](https://python-all.ru/3.5/library/threading.html#module-threading) появился новый класс синхронизации [`Barrier`](https://python-all.ru/3.5/library/threading.html#threading.Barrier), который заставляет несколько потоков ждать, пока все они не достигнут общей точки барьера. Барьеры полезны для обеспечения того, чтобы задача с несколькими предусловиями не выполнялась до завершения всех предшествующих задач.663664Барьеры могут работать с произвольным числом потоков. Это обобщение механизма [рандеву](https://python-all.ru/3.5/whatsnew/3.2.html), который определён только для двух потоков.665666Реализованный как двухфазный циклический барьер, объект [`Barrier`](https://python-all.ru/3.5/library/threading.html#threading.Barrier) подходит для использования в циклах. Отдельные фазы *заполнения* и *опустошения* гарантируют, что все потоки будут освобождены (опустошены) прежде, чем какой-либо из них сможет вернуться назад и снова войти в барьер. Барьер полностью сбрасывается после каждого цикла.667668Пример использования барьеров:669670```python671from threading import Barrier, Thread672673def get_votes(site):674 ballots = conduct_election(site)675 all_polls_closed.wait() # не подсчитывать, пока все голосования не закрыты676 totals = summarize(ballots)677 publish(site, totals)678679all_polls_closed = Barrier(len(sites))680for site in sites:681 Thread(target=get_votes, args=(site,)).start()682```683684В этом примере барьер обеспечивает соблюдение правила, согласно которому голоса не могут быть подсчитаны на любом избирательном участке, пока все участки не закроются. Обратите внимание, что решение с барьером похоже на решение с [`threading.Thread.join()`](https://python-all.ru/3.5/library/threading.html#threading.Thread.join), но после пересечения точки барьера потоки остаются живыми и продолжают работать (подсчитывать бюллетени).685686Если какая-либо из предшествующих задач может зависнуть или задержаться, барьер можно создать с необязательным параметром *тайм-аут*. Тогда, если период ожидания истекает до того, как все предшествующие задачи достигнут точки барьера, все ожидающие потоки освобождаются и возбуждается исключение [`BrokenBarrierError`](https://python-all.ru/3.5/library/threading.html#threading.BrokenBarrierError):687688```python689def get_votes(site):690 ballots = conduct_election(site)691 try:692 all_polls_closed.wait(timeout=midnight - time.now())693 except BrokenBarrierError:694 lockbox = seal_ballots(ballots)695 queue.put(lockbox)696 else:697 totals = summarize(ballots)698 publish(site, totals)699```700701В этом примере барьер обеспечивает более надежное правило. Если некоторые избирательные участки не заканчивают работу до полуночи, барьер срабатывает по тайм-ауту, и бюллетени опечатываются и помещаются в очередь для последующей обработки.702703Смотрите [Barrier Synchronization Patterns](https://python-all.ru/3.5/whatsnew/3.2.html) для получения дополнительных примеров использования барьеров в параллельных вычислениях. Кроме того, простое и подробное объяснение барьеров приведено в [The Little Book of Semaphores](https://python-all.ru/3.5/whatsnew/3.2.html), *раздел 3.6*.704705(Автор: Kristján Valur Jónsson, рецензирование API: Jeffrey Yasskin, в [bpo-8777](https://python-all.ru/3.5/whatsnew/3.2.html).)706707### datetime and time708709- В модуле [`datetime`](https://python-all.ru/3.5/library/datetime.html#module-datetime) появился новый тип [`timezone`](https://python-all.ru/3.5/library/datetime.html#datetime.timezone), который реализует интерфейс [`tzinfo`](https://python-all.ru/3.5/library/datetime.html#datetime.tzinfo), возвращая фиксированное смещение UTC и название часового пояса. Это упрощает создание объектов datetime с учётом часового пояса:710711 ```python712 >>> from datetime import datetime, timezone713714 >>> datetime.now(timezone.utc)715 datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)716717 >>> datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")718 datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)719 ```720- Кроме того, объекты [`timedelta`](https://python-all.ru/3.5/library/datetime.html#datetime.timedelta) теперь можно умножать на [`float`](https://python-all.ru/3.5/library/functions.html#float) и делить на [`float`](https://python-all.ru/3.5/library/functions.html#float) и [`int`](https://python-all.ru/3.5/library/functions.html#int). А объекты [`timedelta`](https://python-all.ru/3.5/library/datetime.html#datetime.timedelta) теперь можно делить друг на друга.721- Метод [`datetime.date.strftime()`](https://python-all.ru/3.5/library/datetime.html#datetime.date.strftime) больше не ограничен годами после 1900. Новый поддерживаемый диапазон лет – от 1000 до 9999 включительно.722- Всякий раз, когда в кортеже времени используется двузначный год, его интерпретация определяется `time.accept2dyear`. По умолчанию используется `True`, что означает, что для двузначного года век определяется по правилам POSIX, регламентирующим формат `%y` strptime.723724 Начиная с Py3.2, использование эвристики угадывания века будет вызывать предупреждение [`DeprecationWarning`](https://python-all.ru/3.5/library/exceptions.html#DeprecationWarning). Вместо этого рекомендуется установить `time.accept2dyear` в `False`, чтобы можно было использовать большие диапазоны дат без угадывания:725726 ```python727 >>> import time, warnings728 >>> warnings.resetwarnings() # удалить фильтры предупреждений по умолчанию729730 >>> time.accept2dyear = True # угадать, означает ли 11 число 11 или 2011731 >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))732 Warning (from warnings module):733 ...734 DeprecationWarning: Century info guessed for a 2-digit year.735 'Fri Jan 1 12:34:56 2011'736737 >>> time.accept2dyear = False # использовать полный диапазон допустимых дат738 >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))739 'Fri Jan 1 12:34:56 11'740 ```741742 Несколько функций теперь имеют значительно расширенные диапазоны дат. Когда `time.accept2dyear` имеет значение false, функция [`time.asctime()`](https://python-all.ru/3.5/library/time.html#time.asctime) принимает любой год, помещающийся в int в C, а функции [`time.mktime()`](https://python-all.ru/3.5/library/time.html#time.mktime) и [`time.strftime()`](https://python-all.ru/3.5/library/time.html#time.strftime) принимают полный диапазон, поддерживаемый соответствующими функциями операционной системы.743744(Авторы: Alexander Belopolsky и Victor Stinner в [bpo-1289118](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-5094](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-6641](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-2706](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-1777412](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-8013](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-10827](https://python-all.ru/3.5/whatsnew/3.2.html).)745746### math747748Модуль [`math`](https://python-all.ru/3.5/library/math.html#module-math) обновлён и содержит шесть новых функций, вдохновлённых стандартом C99.749750Функция [`isfinite()`](https://python-all.ru/3.5/library/math.html#math.isfinite) предоставляет надёжный и быстрый способ обнаружения особых значений. Она возвращает `True` для обычных чисел и `False` для *NaN* или *бесконечность*:751752```python753>>> from math import isfinite754>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]755[True, True, False, False]756```757758Функция [`expm1()`](https://python-all.ru/3.5/library/math.html#math.expm1) вычисляет `e**x-1` для малых значений *x* без потери точности, которая обычно сопутствует вычитанию почти равных величин:759760```python761>>> from math import expm1762>>> expm1(0.013671875) # более точный способ вычисления e**x-1 для малых x7630.013765762467652909764```765766Функция [`erf()`](https://python-all.ru/3.5/library/math.html#math.erf) вычисляет интеграл вероятности или [функцию ошибок Гаусса](https://python-all.ru/3.5/whatsnew/3.2.html). Дополнительная функция ошибок, [`erfc()`](https://python-all.ru/3.5/library/math.html#math.erfc), равна `1 - erf(x)`:767768```python769>>> from math import erf, erfc, sqrt770>>> erf(1.0/sqrt(2.0)) # доля нормального распределения в пределах одного стандартного отклонения7710.682689492137086772>>> erfc(1.0/sqrt(2.0)) # доля нормального распределения за пределами одного стандартного отклонения7730.31731050786291404774>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))7751.0776```777778Функция [`gamma()`](https://python-all.ru/3.5/library/math.html#math.gamma) является непрерывным расширением функции факториала. Подробнее см. [https://en.wikipedia.org/wiki/Gamma\_function](https://python-all.ru/3.5/whatsnew/3.2.html). Поскольку эта функция связана с факториалами, она быстро растёт даже при малых значениях *x*, поэтому существует также функция [`lgamma()`](https://python-all.ru/3.5/library/math.html#math.lgamma) для вычисления натурального логарифма гамма-функции:779780```python781>>> from math import gamma, lgamma782>>> gamma(7.0) # шесть факториал783720.0784>>> lgamma(801.0) # логарифм факториала 8007854551.950730698041786```787788(Автор: Mark Dickinson.)789790### abc791792Модуль [`abc`](https://python-all.ru/3.5/library/abc.html#module-abc) теперь поддерживает [`abstractclassmethod()`](https://python-all.ru/3.5/library/abc.html#abc.abstractclassmethod) и [`abstractstaticmethod()`](https://python-all.ru/3.5/library/abc.html#abc.abstractstaticmethod).793794Эти инструменты позволяют определить [абстрактный базовый класс](https://python-all.ru/3.5/glossary.html#term-abstract-base-class), который требует реализации определённого [`classmethod()`](https://python-all.ru/3.5/library/functions.html#classmethod) или [`staticmethod()`](https://python-all.ru/3.5/library/functions.html#staticmethod):795796```python797class Temperature(metaclass=abc.ABCMeta):798 @abc.abstractclassmethod799 def from_fahrenheit(cls, t):800 ...801 @abc.abstractclassmethod802 def from_celsius(cls, t):803 ...804```805806(Патч предоставлен Daniel Urban; [bpo-5867](https://python-all.ru/3.5/whatsnew/3.2.html).)807808### io809810У [`io.BytesIO`](https://python-all.ru/3.5/library/io.html#io.BytesIO) появился новый метод [`getbuffer()`](https://python-all.ru/3.5/library/io.html#io.BytesIO.getbuffer), функциональность которого похожа на [`memoryview()`](https://python-all.ru/3.5/library/stdtypes.html#memoryview). Он создаёт редактируемое представление данных без копирования. Произвольный доступ и поддержка срезов в буфере хорошо подходят для редактирования на месте:811812```python813>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11814815>>> def change_location(buffer, record_number, location):816... start = record_number * REC_LEN + LOC_START817... buffer[start: start+LOC_LEN] = location818819>>> import io820821>>> byte_stream = io.BytesIO(822... b'G3805 storeroom Main chassis '823... b'X7899 shipping Reserve cog '824... b'L6988 receiving Primary sprocket'825... )826>>> buffer = byte_stream.getbuffer()827>>> change_location(buffer, 1, b'warehouse ')828>>> change_location(buffer, 0, b'showroom ')829>>> print(byte_stream.getvalue())830b'G3805 showroom Main chassis '831b'X7899 warehouse Reserve cog '832b'L6988 receiving Primary sprocket'833```834835(Предложено Антуаном Питру в [bpo-5506](https://python-all.ru/3.5/whatsnew/3.2.html).)836837### reprlib838839При написании метода [`__repr__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__repr__) для пользовательского контейнера легко забыть обработать случай, когда элемент ссылается обратно на сам контейнер. Встроенные объекты Python, такие как [`list`](https://python-all.ru/3.5/library/stdtypes.html#list) и [`set`](https://python-all.ru/3.5/library/stdtypes.html#set), обрабатывают самоссылку, отображая «…» в рекурсивной части строки представления.840841Чтобы помочь в написании таких методов [`__repr__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__repr__), модуль [`reprlib`](https://python-all.ru/3.5/library/reprlib.html#module-reprlib) получил новый декоратор [`recursive_repr()`](https://python-all.ru/3.5/library/reprlib.html#reprlib.recursive_repr) для обнаружения рекурсивных вызовов [`__repr__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__repr__) и подстановки вместо них строки-заполнителя:842843```python844>>> class MyList(list):845... @recursive_repr()846... def __repr__(self):847... return '<' + '|'.join(map(repr, self)) + '>'848...849>>> m = MyList('abc')850>>> m.append(m)851>>> m.append('x')852>>> print(m)853<'a'|'b'|'c'|...|'x'>854```855856(Предложено Рэймондом Хеттингером в [bpo-9826](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-9840](https://python-all.ru/3.5/whatsnew/3.2.html).)857858### logging859860В дополнение к конфигурации на основе словаря, описанной выше, пакет [`logging`](https://python-all.ru/3.5/library/logging.html#module-logging) содержит множество других улучшений.861862Документация по logging была дополнена [базовым руководством](https://python-all.ru/3.5/howto/logging.html#logging-basic-tutorial), [продвинутым руководством](https://python-all.ru/3.5/howto/logging.html#logging-advanced-tutorial) и [поваренной книгой](https://python-all.ru/3.5/howto/logging-cookbook.html#logging-cookbook) с рецептами логирования. Эти документы – самый быстрый способ изучить логирование.863864Функция настройки [`logging.basicConfig()`](https://python-all.ru/3.5/library/logging.html#logging.basicConfig) получила аргумент *style* для поддержки трёх различных типов форматирования строк. По умолчанию он равен «%» для традиционного форматирования через %, может быть установлен в «{» для нового стиля [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format) или в «$» для форматирования в стиле оболочки, предоставляемого [`string.Template`](https://python-all.ru/3.5/library/string.html#string.Template). Следующие три конфигурации эквивалентны:865866```python867>>> from logging import basicConfig868>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")869>>> basicConfig(style='{', format="{name} -> {levelname} {message}")870>>> basicConfig(style='$', format="$name -> $levelname: $message")871```872873Если до возникновения события логирования не настроена конфигурация, теперь используется конфигурация по умолчанию с [`StreamHandler`](https://python-all.ru/3.5/library/logging.handlers.html#logging.StreamHandler), направленным в [`sys.stderr`](https://python-all.ru/3.5/library/sys.html#sys.stderr) для событий уровня `WARNING` и выше. Ранее событие, произошедшее до настройки конфигурации, либо вызывало исключение, либо молча отбрасывалось в зависимости от значения `logging.raiseExceptions`. Новый обработчик по умолчанию хранится в [`logging.lastResort`](https://python-all.ru/3.5/library/logging.html#logging.lastResort).874875Использование фильтров упрощено. Вместо создания объекта [`Filter`](https://python-all.ru/3.5/library/logging.html#logging.Filter) предикатом может быть любой вызываемый объект Python, возвращающий `True` или `False`.876877Было сделано множество других улучшений, повышающих гибкость и упрощающих конфигурацию. Полный список изменений в Python 3.2 смотрите в документации модуля.878879### csv880881Модуль [`csv`](https://python-all.ru/3.5/library/csv.html#module-csv) теперь поддерживает новый диалект [`unix_dialect`](https://python-all.ru/3.5/library/csv.html#csv.unix_dialect), который применяет кавычки для всех полей и традиционный стиль Unix с `'\n'` в качестве завершителя строки. Зарегистрированное имя диалекта – `unix`.882883У [`csv.DictWriter`](https://python-all.ru/3.5/library/csv.html#csv.DictWriter) появился новый метод [`writeheader()`](https://python-all.ru/3.5/library/csv.html#csv.DictWriter.writeheader) для записи начальной строки с именами полей:884885```python886>>> import csv, sys887>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')888>>> w.writeheader()889"name","dept"890>>> w.writerows([891... {'name': 'tom', 'dept': 'accounting'},892... {'name': 'susan', 'dept': 'Salesl'}])893"tom","accounting"894"susan","sales"895```896897(Новый диалект предложен Джеем Талботом в [bpo-5975](https://python-all.ru/3.5/whatsnew/3.2.html), а новый метод предложен Эдом Абрахамом в [bpo-1537721](https://python-all.ru/3.5/whatsnew/3.2.html).)898899### contextlib900901Появился новый и слегка умопомрачительный инструмент [`ContextDecorator`](https://python-all.ru/3.5/library/contextlib.html#contextlib.ContextDecorator), полезный для создания [менеджера контекста](https://python-all.ru/3.5/glossary.html#term-context-manager), который выполняет двойную роль как декоратор функций.902903Для удобства эта новая функциональность используется [`contextmanager()`](https://python-all.ru/3.5/library/contextlib.html#contextlib.contextmanager), так что не требуется дополнительных усилий для поддержки обеих ролей.904905Основная идея в том, что и менеджеры контекста, и декораторы функций могут использоваться как обёртки для действий до и после. Менеджеры контекста оборачивают группу операторов с помощью оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), а декораторы функций оборачивают группу операторов, заключённых в функцию. Поэтому иногда возникает необходимость написать обёртку для предварительного или последующего действия, которую можно использовать в любой из этих ролей.906907Например, иногда полезно обернуть функции или группы операторов логгером, который может отслеживать время входа и время выхода. Вместо написания как декоратора функций, так и менеджера контекста для этой задачи, [`contextmanager()`](https://python-all.ru/3.5/library/contextlib.html#contextlib.contextmanager) предоставляет обе возможности в одном определении:908909```python910from contextlib import contextmanager911import logging912913logging.basicConfig(level=logging.INFO)914915@contextmanager916def track_entry_and_exit(name):917 logging.info('Entering: {}'.format(name))918 yield919 logging.info('Exiting: {}'.format(name))920```921922Ранее это можно было использовать только как менеджер контекста:923924```python925with track_entry_and_exit('widget loader'):926 print('Some time consuming activity goes here')927 load_widget()928```929930Теперь его можно использовать и как декоратор:931932```python933@track_entry_and_exit('widget loader')934def activity():935 print('Some time consuming activity goes here')936 load_widget()937```938939Попытка выполнять сразу две роли накладывает некоторые ограничения на технику. Менеджеры контекста обычно имеют возможность вернуть аргумент, который может использоваться оператором [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), но для декораторов функции такой параллели нет.940941В приведённом выше примере нет чистого способа для менеджера контекста *track\_entry\_and\_exit* вернуть экземпляр логгера для использования в теле вложенных операторов.942943(Предложено Майклом Фордом в [bpo-9110](https://python-all.ru/3.5/whatsnew/3.2.html).)944945### decimal and fractions946947Марк Дикинсон разработал элегантную и эффективную схему, гарантирующую, что разные числовые типы данных будут иметь одинаковое хеш-значение, когда их фактические значения равны ([bpo-8188](https://python-all.ru/3.5/whatsnew/3.2.html)):948949```python950assert hash(Fraction(3, 2)) == hash(1.5) == \951 hash(Decimal("1.5")) == hash(complex(1.5, 0))952```953954Некоторые детали хеширования доступны через новый атрибут [`sys.hash_info`](https://python-all.ru/3.5/library/sys.html#sys.hash_info), который описывает разрядность хеш-значения, простой модуль, хеш-значения для *бесконечности* и *nan*, а также множитель, используемый для мнимой части числа:955956```python957>>> sys.hash_info # doctest: +SKIP958sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)959```960961Ранее принятое решение ограничить совместимость различных числовых типов было смягчено. По-прежнему не поддерживается (и не рекомендуется) неявное смешивание в арифметических выражениях, таких как `Decimal('1.1') + float('1.1')`, поскольку оно теряет информацию в процессе построения двоичного числа с плавающей запятой. Однако, поскольку существующие значения с плавающей запятой можно без потерь преобразовать как в десятичное, так и в рациональное представление, имеет смысл добавить их в конструктор и поддерживать сравнения смешанных типов.962963- Конструктор [`decimal.Decimal`](https://python-all.ru/3.5/library/decimal.html#decimal.Decimal) теперь принимает объекты [`float`](https://python-all.ru/3.5/library/functions.html#float) напрямую, поэтому больше нет необходимости использовать метод [`from_float()`](https://python-all.ru/3.5/library/decimal.html#decimal.Decimal.from_float) ([bpo-8257](https://python-all.ru/3.5/whatsnew/3.2.html)).964- Сравнения смешанных типов теперь полностью поддерживаются, так что объекты [`Decimal`](https://python-all.ru/3.5/library/decimal.html#decimal.Decimal) можно напрямую сравнивать с [`float`](https://python-all.ru/3.5/library/functions.html#float) и [`fractions.Fraction`](https://python-all.ru/3.5/library/fractions.html#fractions.Fraction) ([bpo-2531](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-8188](https://python-all.ru/3.5/whatsnew/3.2.html)).965966Аналогичные изменения были внесены в [`fractions.Fraction`](https://python-all.ru/3.5/library/fractions.html#fractions.Fraction), так что методы [`from_float()`](https://python-all.ru/3.5/library/fractions.html#fractions.Fraction.from_float) и [`from_decimal()`](https://python-all.ru/3.5/library/fractions.html#fractions.Fraction.from_decimal) больше не нужны ([bpo-8294](https://python-all.ru/3.5/whatsnew/3.2.html)):967968```python969>>> from decimal import Decimal970>>> from fractions import Fraction971>>> Decimal(1.1)972Decimal('1.100000000000000088817841970012523233890533447265625')973>>> Fraction(1.1)974Fraction(2476979795053773, 2251799813685248)975```976977Ещё одно полезное изменение для модуля [`decimal`](https://python-all.ru/3.5/library/decimal.html#module-decimal) заключается в том, что атрибут `Context.clamp` теперь является публичным. Это полезно при создании контекстов, соответствующих десятичным форматам обмена, указанным в IEEE 754 (см. [bpo-8540](https://python-all.ru/3.5/whatsnew/3.2.html)).978979(Авторы: Mark Dickinson и Raymond Hettinger.)980981### ftp982983Класс [`ftplib.FTP`](https://python-all.ru/3.5/library/ftplib.html#ftplib.FTP) теперь поддерживает протокол управления контекстом для безусловного поглощения исключений [`socket.error`](https://python-all.ru/3.5/library/socket.html#socket.error) и закрытия FTP-соединения по завершении:984985```python986>>> from ftplib import FTP987>>> with FTP("ftp1.at.proftpd.org") as ftp:988 ftp.login()989 ftp.dir()990991'230 Anonymous login ok, restrictions apply.'992dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 .993dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 ..994dr-xr-xr-x 5 ftp ftp 4096 May 6 10:43 CentOS995dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora996```997998Другие файлоподобные объекты, такие как [`mmap.mmap`](https://python-all.ru/3.5/library/mmap.html#mmap.mmap) и [`fileinput.input()`](https://python-all.ru/3.5/library/fileinput.html#fileinput.input), также получили автоматически закрываемые менеджеры контекста:9991000```python1001with fileinput.input(files=('log1.txt', 'log2.txt')) as f:1002 for line in f:1003 process(line)1004```10051006(Авторы: Tarek Ziadé и Giampaolo Rodolà в [bpo-4972](https://python-all.ru/3.5/whatsnew/3.2.html), и Georg Brandl в [bpo-8046](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-1286](https://python-all.ru/3.5/whatsnew/3.2.html).)10071008Класс [`FTP_TLS`](https://python-all.ru/3.5/library/ftplib.html#ftplib.FTP_TLS) теперь принимает параметр *context*, который является объектом [`ssl.SSLContext`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext), позволяющим объединять параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру.10091010(Автор: Giampaolo Rodolà; [bpo-8806](https://python-all.ru/3.5/whatsnew/3.2.html).)10111012### popen10131014Функции [`os.popen()`](https://python-all.ru/3.5/library/os.html#os.popen) и [`subprocess.Popen()`](https://python-all.ru/3.5/library/subprocess.html#subprocess.Popen) теперь поддерживают операторы [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with) для автоматического закрытия файловых дескрипторов.10151016(Авторы: Antoine Pitrou и Brian Curtin в [bpo-7461](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-10554](https://python-all.ru/3.5/whatsnew/3.2.html).)10171018### select10191020Модуль [`select`](https://python-all.ru/3.5/library/select.html#module-select) теперь предоставляет новый константный атрибут, [`PIPE_BUF`](https://python-all.ru/3.5/library/select.html#select.PIPE_BUF), который указывает минимальное количество байтов, которые гарантированно не будут блокироваться, когда [`select.select()`](https://python-all.ru/3.5/library/select.html#select.select) сообщает, что канал готов к записи.10211022```python1023>>> import select1024>>> select.PIPE_BUF10255121026```10271028(Доступно в системах Unix. Патч от Sébastien Sablé в [bpo-9862](https://python-all.ru/3.5/whatsnew/3.2.html))10291030### gzip и zipfile10311032[`gzip.GzipFile`](https://python-all.ru/3.5/library/gzip.html#gzip.GzipFile) теперь реализует [`io.BufferedIOBase`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase) [абстрактный базовый класс](https://python-all.ru/3.5/glossary.html#term-abstract-base-class) (за исключением `truncate()`). Он также имеет метод [`peek()`](https://python-all.ru/3.5/library/gzip.html#gzip.GzipFile.peek) и поддерживает непозиционируемые, а также дополненные нулями файловые объекты.10331034Модуль [`gzip`](https://python-all.ru/3.5/library/gzip.html#module-gzip) также получает функции [`compress()`](https://python-all.ru/3.5/library/gzip.html#gzip.compress) и [`decompress()`](https://python-all.ru/3.5/library/gzip.html#gzip.decompress) для более удобного сжатия и распаковки в памяти. Имейте в виду, что текст необходимо кодировать как [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) перед сжатием и распаковкой:10351036```python1037>>> import gzip1038>>> s = 'Three shall be the number thou shalt count, '1039>>> s += 'and the number of the counting shall be three'1040>>> b = s.encode() # преобразовать в utf-81041>>> len(b)1042891043>>> c = gzip.compress(b)1044>>> len(c)1045771046>>> gzip.decompress(c).decode()[:42] # распаковать и преобразовать в текст1047'Three shall be the number thou shalt count'1048```10491050(Авторы: Anand B. Pillai в [bpo-3488](https://python-all.ru/3.5/whatsnew/3.2.html); и Antoine Pitrou, Nir Aides и Brian Curtin в [bpo-9962](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-1675951](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-7471](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-2846](https://python-all.ru/3.5/whatsnew/3.2.html).)10511052Кроме того, класс `zipfile.ZipExtFile` был внутренне переработан для представления файлов, хранящихся внутри архива. Новая реализация значительно быстрее и может быть обёрнута в объект [`io.BufferedReader`](https://python-all.ru/3.5/library/io.html#io.BufferedReader) для дополнительного ускорения. Она также решает проблему, при которой чередующиеся вызовы *read* и *readline* давали неверные результаты.10531054(Патч предоставлен Nir Aides в [bpo-7610](https://python-all.ru/3.5/whatsnew/3.2.html).)10551056### tarfile10571058Класс [`TarFile`](https://python-all.ru/3.5/library/tarfile.html#tarfile.TarFile) теперь можно использовать как менеджер контекста. Кроме того, его метод [`add()`](https://python-all.ru/3.5/library/tarfile.html#tarfile.TarFile.add) получил новую опцию *filter*, которая управляет тем, какие файлы добавляются в архив, и позволяет редактировать метаданные файлов.10591060Новая опция *filter* заменяет старый, менее гибкий параметр *exclude*, который теперь устарел. Если указан, дополнительный параметр *filter* должен быть [именованным аргументом](https://python-all.ru/3.5/glossary.html#term-keyword-argument). Предоставленная пользователем функция фильтра принимает объект [`TarInfo`](https://python-all.ru/3.5/library/tarfile.html#tarfile.TarInfo) и возвращает обновлённый объект [`TarInfo`](https://python-all.ru/3.5/library/tarfile.html#tarfile.TarInfo), или, если нужно исключить файл, функция может вернуть `None`:10611062```python1063>>> import tarfile, glob10641065>>> def myfilter(tarinfo):1066... if tarinfo.isfile(): # сохранять только реальные файлы1067... tarinfo.uname = 'monty' # отредактировать имя пользователя1068... return tarinfo10691070>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:1071... for filename in glob.glob('*.txt'):1072... tf.add(filename, filter=myfilter)1073... tf.list()1074-rw-r--r-- monty/501 902 2011-01-26 17:59:11 annotations.txt1075-rw-r--r-- monty/501 123 2011-01-26 17:59:11 general_questions.txt1076-rw-r--r-- monty/501 3514 2011-01-26 17:59:11 prion.txt1077-rw-r--r-- monty/501 124 2011-01-26 17:59:11 py_todo.txt1078-rw-r--r-- monty/501 1399 2011-01-26 17:59:11 semaphore_notes.txt1079```10801081(Предложено Tarek Ziadé и реализовано Lars Gustäbel в [bpo-6856](https://python-all.ru/3.5/whatsnew/3.2.html).)10821083### hashlib10841085Модуль [`hashlib`](https://python-all.ru/3.5/library/hashlib.html#module-hashlib) имеет два новых константных атрибута, перечисляющих алгоритмы хеширования, гарантированно присутствующие во всех реализациях, и те, что доступны в текущей реализации:10861087```python1088>>> import hashlib10891090>>> hashlib.algorithms_guaranteed1091{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}10921093>>> hashlib.algorithms_available1094{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',1095'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',1096'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',1097'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}1098```10991100(Предложено Carl Chenet в [bpo-7418](https://python-all.ru/3.5/whatsnew/3.2.html).)11011102### ast11031104Модуль [`ast`](https://python-all.ru/3.5/library/ast.html#module-ast) имеет замечательный универсальный инструмент для безопасного вычисления строк выражений с использованием синтаксиса литералов Python. Функция [`ast.literal_eval()`](https://python-all.ru/3.5/library/ast.html#ast.literal_eval) служит безопасной альтернативой встроенной функции [`eval()`](https://python-all.ru/3.5/library/functions.html#eval), которую легко использовать во вред. Python 3.2 добавляет литералы [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) и [`set`](https://python-all.ru/3.5/library/stdtypes.html#set) в список поддерживаемых типов: строки, байты, числа, кортежи, списки, словари, множества, булевы значения и `None`.11051106```python1107>>> from ast import literal_eval11081109>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"1110>>> literal_eval(request)1111{'args': (2, 0.5), 'req': 3, 'func': 'pow'}11121113>>> request = "os.system('do something harmful')"1114>>> literal_eval(request)1115Traceback (most recent call last):1116 ...1117ValueError: malformed node or string: <_ast.Call object at 0x101739a10>1118```11191120(Реализовано Бенджамином Петерсоном и Георгом Брандлем.)11211122### os11231124Разные операционные системы используют различные кодировки для имён файлов и переменных окружения. Модуль [`os`](https://python-all.ru/3.5/library/os.html#module-os) предоставляет две новые функции, [`fsencode()`](https://python-all.ru/3.5/library/os.html#os.fsencode) и [`fsdecode()`](https://python-all.ru/3.5/library/os.html#os.fsdecode), для кодирования и декодирования имён файлов:11251126```python1127>>> import os1128>>> filename = 'Sehenswürdigkeiten'1129>>> os.fsencode(filename)1130b'Sehensw\xc3\xbcrdigkeiten'1131```11321133Некоторые операционные системы разрешают прямой доступ к закодированным байтам в окружении. Если это так, константа [`os.supports_bytes_environ`](https://python-all.ru/3.5/library/os.html#os.supports_bytes_environ) будет истинной.11341135Для прямого доступа к закодированным переменным окружения (если доступно) используйте новую функцию [`os.getenvb()`](https://python-all.ru/3.5/library/os.html#os.getenvb) или [`os.environb`](https://python-all.ru/3.5/library/os.html#os.environb), которая является байтовой версией [`os.environ`](https://python-all.ru/3.5/library/os.html#os.environ).11361137(Автор: Victor Stinner.)11381139### shutil11401141Функция [`shutil.copytree()`](https://python-all.ru/3.5/library/shutil.html#shutil.copytree) теперь имеет две новые опции:11421143- *ignore\_dangling\_symlinks*: когда `symlinks=False`, чтобы функция копировала файл, на который указывает символьная ссылка, а не саму ссылку. Эта опция подавляет ошибку, возникающую, если файл не существует.1144- *copy\_function*: вызываемый объект, используемый для копирования файлов. По умолчанию используется [`shutil.copy2()`](https://python-all.ru/3.5/library/shutil.html#shutil.copy2).11451146(Автор: Tarek Ziadé.)11471148Кроме того, модуль [`shutil`](https://python-all.ru/3.5/library/shutil.html#module-shutil) теперь поддерживает [архивацию](https://python-all.ru/3.5/library/shutil.html#archiving-operations) для zip-архивов, несжатых tar-архивов, tar-архивов со сжатием gzip и tar-архивов со сжатием bzip2. Также появились функции для регистрации дополнительных форматов архивов (например, tar-архивы со сжатием xz или пользовательские форматы).11491150Основные функции – [`make_archive()`](https://python-all.ru/3.5/library/shutil.html#shutil.make_archive) и [`unpack_archive()`](https://python-all.ru/3.5/library/shutil.html#shutil.unpack_archive). По умолчанию обе работают с текущей директорией (которую можно задать через [`os.chdir()`](https://python-all.ru/3.5/library/os.html#os.chdir)) и со всеми поддиректориями. Имя файла архива нужно указывать с полным путём. Архивация не разрушает исходные файлы (они остаются без изменений).11511152```python1153>>> import shutil, pprint11541155>>> os.chdir('mydata') # перейти в каталог исходного кода1156>>> f = shutil.make_archive('/var/backup/mydata',1157... 'zip') # архивировать текущий каталог1158>>> f # показать имя архива1159'/var/backup/mydata.zip'1160>>> os.chdir('tmp') # перейти к распаковке1161>>> shutil.unpack_archive('/var/backup/mydata.zip') # восстановить данные11621163>>> pprint.pprint(shutil.get_archive_formats()) # отобразить известные форматы1164[('bztar', "bzip2'ed tar-file"),1165 ('gztar', "gzip'ed tar-file"),1166 ('tar', 'uncompressed tar file'),1167 ('zip', 'ZIP file')]11681169>>> shutil.register_archive_format( # зарегистрировать новый формат архива1170... name='xz',1171... function=xz.compress, # вызываемая функция архивирования1172... extra_args=[('level', 8)], # аргументы функции1173... description='xz compression'1174... )1175```11761177(Автор: Tarek Ziadé.)11781179### sqlite311801181Модуль [`sqlite3`](https://python-all.ru/3.5/library/sqlite3.html#module-sqlite3) обновлён до версии pysqlite 2.6.0. У него появились две новые возможности.11821183- Атрибут `sqlite3.Connection.in_transit` истинен, если есть активная транзакция для незафиксированных изменений.1184- Методы [`sqlite3.Connection.enable_load_extension()`](https://python-all.ru/3.5/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`sqlite3.Connection.load_extension()`](https://python-all.ru/3.5/library/sqlite3.html#sqlite3.Connection.load_extension) позволяют загружать расширения SQLite из файлов «.so». Одним из известных расширений является расширение полнотекстового поиска, распространяемое с SQLite.11851186(Авторы: R. David Murray и Shashwat Anand; [bpo-8845](https://python-all.ru/3.5/whatsnew/3.2.html).)11871188### html11891190Появился новый модуль [`html`](https://python-all.ru/3.5/library/html.html#module-html) с единственной функцией [`escape()`](https://python-all.ru/3.5/library/html.html#html.escape), которая используется для экранирования зарезервированных символов в HTML-разметке:11911192```python1193>>> import html1194>>> html.escape('x > 2 && x < 7')1195'x > 2 && x < 7'1196```11971198### socket11991200В модуль [`socket`](https://python-all.ru/3.5/library/socket.html#module-socket) внесены два улучшения.12011202- У объектов сокетов появился метод [`detach()`](https://python-all.ru/3.5/library/socket.html#socket.socket.detach), который переводит сокет в закрытое состояние, не закрывая фактически базовый файловый дескриптор. Последний затем можно использовать для других целей. (Добавлено Antoine Pitrou; [bpo-8524](https://python-all.ru/3.5/whatsnew/3.2.html).)1203- [`socket.create_connection()`](https://python-all.ru/3.5/library/socket.html#socket.create_connection) теперь поддерживает протокол управления контекстом для безусловного поглощения исключений [`socket.error`](https://python-all.ru/3.5/library/socket.html#socket.error) и закрытия сокета по завершении. (Автор: Giampaolo Rodolà; [bpo-9794](https://python-all.ru/3.5/whatsnew/3.2.html).)12041205### ssl12061207Модуль [`ssl`](https://python-all.ru/3.5/library/ssl.html#module-ssl) добавил ряд возможностей для удовлетворения общих требований к защищённым (шифрованным, аутентифицированным) интернет-соединениям:12081209- Новый класс [`SSLContext`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext) служит контейнером для постоянных данных SSL, таких как настройки протокола, сертификаты, закрытые ключи и различные другие параметры. Он включает метод [`wrap_socket()`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext.wrap_socket) для создания SSL-сокета из SSL-контекста.1210- Новая функция [`ssl.match_hostname()`](https://python-all.ru/3.5/library/ssl.html#ssl.match_hostname) поддерживает проверку идентичности сервера для протоколов более высокого уровня, реализуя правила HTTPS (из [**RFC 2818**](https://python-all.ru/3.5/whatsnew/3.2.html)), которые также подходят для других протоколов.1211- Функция-конструктор [`ssl.wrap_socket()`](https://python-all.ru/3.5/library/ssl.html#ssl.wrap_socket) теперь принимает аргумент *ciphers*. Строка *ciphers* перечисляет разрешённые алгоритмы шифрования в формате, описанном в [документации OpenSSL](https://python-all.ru/3.5/whatsnew/3.2.html).1212- При компоновке с последними версиями OpenSSL модуль [`ssl`](https://python-all.ru/3.5/library/ssl.html#module-ssl) теперь поддерживает расширение Server Name Indication протокола TLS, что позволяет размещать несколько «виртуальных хостов» с разными сертификатами на одном IP-порту. Это расширение поддерживается только в клиентском режиме и активируется передачей аргумента *server\_hostname* в [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext.wrap_socket).1213- В модуль [`ssl`](https://python-all.ru/3.5/library/ssl.html#module-ssl) добавлены различные опции, такие как [`OP_NO_SSLv2`](https://python-all.ru/3.5/library/ssl.html#ssl.OP_NO_SSLv2), которая отключает небезопасный и устаревший протокол SSLv2.1214- Расширение теперь загружает все шифры и алгоритмы дайджестов OpenSSL. Если некоторые SSL-сертификаты не удаётся проверить, они сообщаются как ошибка «неизвестный алгоритм».1215- Версия используемого OpenSSL теперь доступна через атрибуты модуля [`ssl.OPENSSL_VERSION`](https://python-all.ru/3.5/library/ssl.html#ssl.OPENSSL_VERSION) (строка), [`ssl.OPENSSL_VERSION_INFO`](https://python-all.ru/3.5/library/ssl.html#ssl.OPENSSL_VERSION_INFO) (кортеж из 5 элементов) и [`ssl.OPENSSL_VERSION_NUMBER`](https://python-all.ru/3.5/library/ssl.html#ssl.OPENSSL_VERSION_NUMBER) (целое число).12161217(Предложено Антуаном Питру в [bpo-8850](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-1589](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-8322](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-5639](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-4870](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-8484](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-8321](https://python-all.ru/3.5/whatsnew/3.2.html).)12181219### nntp12201221Модуль [`nntplib`](https://python-all.ru/3.5/library/nntplib.html#module-nntplib) получил переработанную реализацию с улучшенной семантикой байтов и текста, а также более практичными API. Эти изменения нарушают совместимость с версией nntplib из Python 3.1, которая и сама по себе была частично неработоспособна.12221223Также добавлена поддержка защищённых соединений как через неявный (с использованием [`nntplib.NNTP_SSL`](https://python-all.ru/3.5/library/nntplib.html#nntplib.NNTP_SSL)), так и через явный (с использованием [`nntplib.NNTP.starttls()`](https://python-all.ru/3.5/library/nntplib.html#nntplib.NNTP.starttls)) TLS.12241225(Предложено Антуаном Питру в [bpo-9360](https://python-all.ru/3.5/whatsnew/3.2.html) и Эндрю Вантом в [bpo-1926](https://python-all.ru/3.5/whatsnew/3.2.html).)12261227### сертификаты12281229[`http.client.HTTPSConnection`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPSConnection), [`urllib.request.HTTPSHandler`](https://python-all.ru/3.5/library/urllib.request.html#urllib.request.HTTPSHandler) и [`urllib.request.urlopen()`](https://python-all.ru/3.5/library/urllib.request.html#urllib.request.urlopen) теперь принимают необязательные аргументы, позволяющие проверять сертификаты сервера на соответствие набору центров сертификации, как рекомендуется при публичном использовании HTTPS.12301231(Добавлено Антуаном Питру, [bpo-9003](https://python-all.ru/3.5/whatsnew/3.2.html).)12321233### imaplib12341235Поддержка явного TLS для стандартных IMAP4-соединений была добавлена через новый метод [`imaplib.IMAP4.starttls`](https://python-all.ru/3.5/library/imaplib.html#imaplib.IMAP4.starttls).12361237(Предложено Лоренцо М. Катуччи и Антуаном Питру, [bpo-4471](https://python-all.ru/3.5/whatsnew/3.2.html).)12381239### http.client12401241В модуле [`http.client`](https://python-all.ru/3.5/library/http.client.html#module-http.client) был сделан ряд небольших улучшений API. Простые ответы HTTP 0.9 старого стиля больше не поддерживаются, а параметр *strict* считается устаревшим во всех классах.12421243Классы [`HTTPConnection`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPSConnection) теперь имеют параметр *source\_address* – кортеж (host, port), указывающий, откуда устанавливается HTTP-соединение.12441245Поддержка проверки сертификатов и виртуальных хостов HTTPS была добавлена в [`HTTPSConnection`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPSConnection).12461247Метод [`request()`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPConnection.request) у объектов соединения допускал необязательный аргумент *body*, чтобы для содержимого запроса можно было использовать [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object). Удобно, что аргумент *body* теперь также принимает [итерируемый объект](https://python-all.ru/3.5/glossary.html#term-iterable) при условии, что он содержит явный заголовок `Content-Length`. Такой расширенный интерфейс стал гораздо гибче, чем раньше.12481249Для установления HTTPS-соединения через прокси-сервер появился новый метод [`set_tunnel()`](https://python-all.ru/3.5/library/http.client.html#http.client.HTTPConnection.set_tunnel), который задаёт хост и порт для туннелирования HTTP Connect.12501251Для согласованности с поведением [`http.server`](https://python-all.ru/3.5/library/http.server.html#module-http.server) библиотека HTTP-клиента теперь также кодирует заголовки в ISO-8859-1 (Latin-1). Ранее она уже так делала для входящих заголовков, поэтому теперь поведение одинаково для входящего и исходящего трафика. (См. работу Армина Ронахера в [bpo-10980](https://python-all.ru/3.5/whatsnew/3.2.html).)12521253### unittest12541255Модуль unittest получил ряд улучшений: поддержка обнаружения тестов для пакетов, более простое экспериментирование в интерактивной оболочке, новые методы тестовых случаев, улучшенные диагностические сообщения при сбоях тестов и более понятные имена методов.12561257- Вызов командной строки `python -m unittest` теперь может принимать пути к файлам вместо имен модулей для запуска конкретных тестов ([bpo-10620](https://python-all.ru/3.5/whatsnew/3.2.html)). Новый механизм обнаружения тестов может находить тесты внутри пакетов, находя любой тест, импортируемый из корневого каталога. Корневой каталог можно указать с помощью опции *-t*, шаблона для сопоставления файлов с `-p`, и каталога для начала поиска с `-s`:12581259 ```console1260 $ python -m unittest discover -s my_proj_dir -p _test.py1261 ```12621263 (Предложено Michael Foord.)1264- Экспериментирование в интерактивной оболочке стало проще, поскольку класс `unittest.case.TestCase` теперь можно создавать без аргументов:12651266 ```python1267 >>> from unittest import TestCase1268 >>> TestCase().assertEqual(pow(2, 3), 8)1269 ```12701271 (Предложено Michael Foord.)1272- Модуль [`unittest`](https://python-all.ru/3.5/library/unittest.html#module-unittest) содержит два новых метода, [`assertWarns()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertWarns) и [`assertWarnsRegex()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertWarnsRegex), для проверки того, что заданный тип предупреждения вызывается тестируемым кодом:12731274 ```python1275 with self.assertWarns(DeprecationWarning):1276 legacy_function('XYZ')1277 ```12781279 (Предложено Антуаном Питру, [bpo-9754](https://python-all.ru/3.5/whatsnew/3.2.html).)12801281 Ещё один новый метод, [`assertCountEqual()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertCountEqual), используется для сравнения двух итерируемых объектов с целью определить, равны ли их количества элементов (присутствуют ли одни и те же элементы с одинаковым числом вхождений независимо от порядка):12821283 ```python1284 def test_anagram(self):1285 self.assertCountEqual('algorithm', 'logarithm')1286 ```12871288 (Автор: Raymond Hettinger.)1289- Одна из основных особенностей модуля unittest – стремление выдавать содержательные диагностические сообщения при сбое теста. По возможности сбой записывается вместе с diff вывода. Это особенно полезно при анализе журналов неудачных тестовых запусков. Однако, поскольку diff может быть объёмным, появился новый атрибут [`maxDiff`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.maxDiff), задающий максимальную длину отображаемого diff.1290- Кроме того, имена методов в модуле были приведены в порядок.12911292 Например, [`assertRegex()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertRegex) – новое имя для `assertRegexpMatches()`, которое было названо неправильно, потому что тест использует [`re.search()`](https://python-all.ru/3.5/library/re.html#re.search), а не [`re.match()`](https://python-all.ru/3.5/library/re.html#re.match). Другие методы, использующие регулярные выражения, теперь именуются с использованием краткой формы «Regex» вместо «Regexp» – это соответствует именам, используемым в других реализациях unittest, соответствует старому названию модуля [`re`](https://python-all.ru/3.5/library/re.html#module-re) в Python и имеет однозначный верблюжий регистр.12931294 (Предложено Raymond Hettinger; реализовано Ezio Melotti.)1295- Чтобы повысить согласованность, некоторые давно существующие псевдонимы методов объявляются устаревшими; вместо них следует использовать предпочтительные имена:12961297 > | Старое имя | Предпочтительное имя |1298 > | --- | --- |1299 > | `assert_()` | [`assertTrue()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertTrue) |1300 > | `assertEquals()` | [`assertEqual()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertEqual) |1301 > | `assertNotEquals()` | [`assertNotEqual()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertNotEqual) |1302 > | `assertAlmostEquals()` | [`assertAlmostEqual()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertAlmostEqual) |1303 > | `assertNotAlmostEquals()` | [`assertNotAlmostEqual()`](https://python-all.ru/3.5/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |13041305 Аналогично, методы `TestCase.fail*`, объявленные устаревшими в Python 3.1, предположительно будут удалены в Python 3.3. Также см. раздел [Устаревшие псевдонимы](https://python-all.ru/3.5/library/unittest.html#deprecated-aliases) в документации [`unittest`](https://python-all.ru/3.5/library/unittest.html#module-unittest).13061307 (Предложено Ezio Melotti; [bpo-9424](https://python-all.ru/3.5/whatsnew/3.2.html).)1308- Метод `assertDictContainsSubset()` был объявлен устаревшим, потому что он был реализован с ошибкой: аргументы передавались в неправильном порядке. Это создавало трудно отлаживаемые оптические иллюзии, когда тесты вроде `TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})` завершались неудачей.13091310 (Автор: Raymond Hettinger.)13111312### random13131314Целочисленные методы модуля [`random`](https://python-all.ru/3.5/library/random.html#module-random) теперь лучше генерируют равномерные распределения. Раньше они вычисляли выборки с помощью `int(n*random())`, что давало небольшое смещение, когда *n* не было степенью двойки. Теперь производится несколько выборок из диапазона, размер которого равен ближайшей степени двойки, и выборка сохраняется только если она попадает в диапазон `0 <= x < n`. Затронутые функции и методы: [`randrange()`](https://python-all.ru/3.5/library/random.html#random.randrange), [`randint()`](https://python-all.ru/3.5/library/random.html#random.randint), [`choice()`](https://python-all.ru/3.5/library/random.html#random.choice), [`shuffle()`](https://python-all.ru/3.5/library/random.html#random.shuffle) и [`sample()`](https://python-all.ru/3.5/library/random.html#random.sample).13151316(Предложено Raymond Hettinger; [bpo-9025](https://python-all.ru/3.5/whatsnew/3.2.html).)13171318### poplib13191320Класс [`POP3_SSL`](https://python-all.ru/3.5/library/poplib.html#poplib.POP3_SSL) теперь принимает параметр *контекст*, который является объектом [`ssl.SSLContext`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext), позволяющим объединять параметры настройки SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру.13211322(Предложено Giampaolo Rodolà; [bpo-8807](https://python-all.ru/3.5/whatsnew/3.2.html).)13231324### asyncore13251326[`asyncore.dispatcher`](https://python-all.ru/3.5/library/asyncore.html#asyncore.dispatcher) теперь предоставляет метод [`handle_accepted()`](https://python-all.ru/3.5/library/asyncore.html#asyncore.dispatcher.handle_accepted), возвращающий пару *(sock, addr)*, которая вызывается при фактическом установлении соединения с новым удаленным узлом. Предполагается, что это будет использоваться как замена старому [`handle_accept()`](https://python-all.ru/3.5/library/asyncore.html#asyncore.dispatcher.handle_accept) и избавляет пользователя от необходимости вызывать [`accept()`](https://python-all.ru/3.5/library/asyncore.html#asyncore.dispatcher.accept) напрямую.13271328(Предложено Giampaolo Rodolà; [bpo-6706](https://python-all.ru/3.5/whatsnew/3.2.html).)13291330### tempfile13311332Модуль [`tempfile`](https://python-all.ru/3.5/library/tempfile.html#module-tempfile) теперь содержит новый менеджер контекста [`TemporaryDirectory`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryDirectory), который обеспечивает простое детерминированное удаление временных каталогов:13331334```python1335with tempfile.TemporaryDirectory() as tmpdirname:1336 print('created temporary dir:', tmpdirname)1337```13381339(Предложено Neil Schemenauer и Nick Coghlan; [bpo-5178](https://python-all.ru/3.5/whatsnew/3.2.html).)13401341### inspect13421343- Модуль [`inspect`](https://python-all.ru/3.5/library/inspect.html#module-inspect) содержит новую функцию [`getgeneratorstate()`](https://python-all.ru/3.5/library/inspect.html#inspect.getgeneratorstate) для простого определения текущего состояния генератора-итератора:13441345 ```python1346 >>> from inspect import getgeneratorstate1347 >>> def gen():1348 ... yield 'demo'1349 >>> g = gen()1350 >>> getgeneratorstate(g)1351 'GEN_CREATED'1352 >>> next(g)1353 'demo'1354 >>> getgeneratorstate(g)1355 'GEN_SUSPENDED'1356 >>> next(g, None)1357 >>> getgeneratorstate(g)1358 'GEN_CLOSED'1359 ```13601361 (Предложено Rodolpho Eckhardt и Nick Coghlan; [bpo-10220](https://python-all.ru/3.5/whatsnew/3.2.html).)1362- Для поддержки поиска без возможности активации динамического атрибута в модуле [`inspect`](https://python-all.ru/3.5/library/inspect.html#module-inspect) появилась новая функция [`getattr_static()`](https://python-all.ru/3.5/library/inspect.html#inspect.getattr_static). В отличие от [`hasattr()`](https://python-all.ru/3.5/library/functions.html#hasattr), это настоящий поиск только для чтения, который гарантированно не меняет состояние во время поиска:13631364 ```python1365 >>> class A:1366 ... @property1367 ... def f(self):1368 ... print('Running')1369 ... return 101370 ...1371 >>> a = A()1372 >>> getattr(a, 'f')1373 Running1374 101375 >>> inspect.getattr_static(a, 'f')1376 <property object at 0x1022bd788>1377 ```13781379> (Предложено Michael Foord.)13801381### pydoc13821383Модуль [`pydoc`](https://python-all.ru/3.5/library/pydoc.html#module-pydoc) теперь предоставляет значительно улучшенный интерфейс веб-сервера, а также новую опцию командной строки `-b` для автоматического открытия окна браузера для отображения этого сервера:13841385```console1386$ pydoc3.2 -b1387```13881389(Предложено Ron Adam; [bpo-2001](https://python-all.ru/3.5/whatsnew/3.2.html).)13901391### dis13921393Модуль [`dis`](https://python-all.ru/3.5/library/dis.html#module-dis) пополнился двумя новыми функциями для инспекции кода: [`code_info()`](https://python-all.ru/3.5/library/dis.html#dis.code_info) и [`show_code()`](https://python-all.ru/3.5/library/dis.html#dis.show_code). Обе предоставляют подробную информацию об объекте кода для переданной функции, метода, строки исходного кода или объекта кода. Первая возвращает строку, вторая выводит её:13941395```python1396>>> import dis, random1397>>> dis.show_code(random.choice)1398Name: choice1399Filename: /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py1400Argument count: 21401Kw-only arguments: 01402Number of locals: 31403Stack size: 111404Flags: OPTIMIZED, NEWLOCALS, NOFREE1405Constants:1406 0: 'Choose a random element from a non-empty sequence.'1407 1: 'Cannot choose from an empty sequence'1408Names:1409 0: _randbelow1410 1: len1411 2: ValueError1412 3: IndexError1413Variable names:1414 0: self1415 1: seq1416 2: i1417```14181419Кроме того, функция [`dis()`](https://python-all.ru/3.5/library/dis.html#dis.dis) теперь принимает строковые аргументы, так что распространённую идиому `dis(compile(s, '', 'eval'))` можно сократить до `dis(s)`:14201421```python1422>>> dis('3*x+1 if x%2==1 else x//2')1423 1 0 LOAD_NAME 0 (x)1424 3 LOAD_CONST 0 (2)1425 6 BINARY_MODULO1426 7 LOAD_CONST 1 (1)1427 10 COMPARE_OP 2 (==)1428 13 POP_JUMP_IF_FALSE 281429 16 LOAD_CONST 2 (3)1430 19 LOAD_NAME 0 (x)1431 22 BINARY_MULTIPLY1432 23 LOAD_CONST 1 (1)1433 26 BINARY_ADD1434 27 RETURN_VALUE1435 >> 28 LOAD_NAME 0 (x)1436 31 LOAD_CONST 0 (2)1437 34 BINARY_FLOOR_DIVIDE1438 35 RETURN_VALUE1439```14401441В совокупности эти улучшения упрощают изучение того, как реализован CPython, и позволяют самому увидеть, что делает синтаксис языка «под капотом».14421443(Предложено Nick Coghlan; [bpo-9147](https://python-all.ru/3.5/whatsnew/3.2.html).)14441445### dbm14461447Все модули баз данных теперь поддерживают методы `get()` и `setdefault()`.14481449(Предложено Рэем Алленом в [bpo-9523](https://python-all.ru/3.5/whatsnew/3.2.html).)14501451### ctypes14521453Новый тип [`ctypes.c_ssize_t`](https://python-all.ru/3.5/library/ctypes.html#ctypes.c_ssize_t) представляет тип данных C `ssize_t`.14541455### site14561457Модуль [`site`](https://python-all.ru/3.5/library/site.html#module-site) содержит три новые функции, полезные для вывода подробной информации об установке Python.14581459- [`getsitepackages()`](https://python-all.ru/3.5/library/site.html#site.getsitepackages) выводит список всех глобальных каталогов site-packages.1460- [`getuserbase()`](https://python-all.ru/3.5/library/site.html#site.getuserbase) сообщает базовый каталог пользователя, в котором могут храниться данные.1461- [`getusersitepackages()`](https://python-all.ru/3.5/library/site.html#site.getusersitepackages) показывает путь к каталогу site-packages для конкретного пользователя.14621463```python1464>>> import site1465>>> site.getsitepackages()1466['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',1467 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',1468 '/Library/Python/3.2/site-packages']1469>>> site.getuserbase()1470'/Users/raymondhettinger/Library/Python/3.2'1471>>> site.getusersitepackages()1472'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'1473```14741475Удобно, что часть функциональности site доступна напрямую из командной строки:14761477```console1478$ python -m site --user-base1479/Users/raymondhettinger/.local1480$ python -m site --user-site1481/Users/raymondhettinger/.local/lib/python3.2/site-packages1482```14831484(Добавлено Тареком Зиаде в [bpo-6693](https://python-all.ru/3.5/whatsnew/3.2.html).)14851486### sysconfig14871488Новый модуль [`sysconfig`](https://python-all.ru/3.5/library/sysconfig.html#module-sysconfig) упрощает обнаружение путей установки и переменных конфигурации, которые различаются в зависимости от платформы и настроек установки.14891490Модуль предоставляет простые функции доступа для получения информации о платформе и версии:14911492- [`get_platform()`](https://python-all.ru/3.5/library/sysconfig.html#sysconfig.get_platform) возвращает значения наподобие *linux-i586* или *macosx-10.6-ppc*.1493- [`get_python_version()`](https://python-all.ru/3.5/library/sysconfig.html#sysconfig.get_python_version) возвращает строку с номером версии Python, например «3.2».14941495Он также предоставляет доступ к путям и переменным, соответствующим одной из семи именованных схем, используемых в [`distutils`](https://python-all.ru/3.5/library/distutils.html#module-distutils). К ним относятся *posix\_prefix*, *posix\_home*, *posix\_user*, *nt*, *nt\_user*, *os2*, *os2\_home*:14961497- [`get_paths()`](https://python-all.ru/3.5/library/sysconfig.html#sysconfig.get_paths) создаёт словарь, содержащий пути установки для текущей схемы установки.1498- [`get_config_vars()`](https://python-all.ru/3.5/library/sysconfig.html#sysconfig.get_config_vars) возвращает словарь платформенно-зависимых переменных.14991500Также имеется удобный интерфейс командной строки:15011502```doscon1503C:\Python32>python -m sysconfig1504Platform: "win32"1505Python version: "3.2"1506Current installation scheme: "nt"15071508Paths:1509 data = "C:\Python32"1510 include = "C:\Python32\Include"1511 platinclude = "C:\Python32\Include"1512 platlib = "C:\Python32\Lib\site-packages"1513 platstdlib = "C:\Python32\Lib"1514 purelib = "C:\Python32\Lib\site-packages"1515 scripts = "C:\Python32\Scripts"1516 stdlib = "C:\Python32\Lib"15171518Variables:1519 BINDIR = "C:\Python32"1520 BINLIBDEST = "C:\Python32\Lib"1521 EXE = ".exe"1522 INCLUDEPY = "C:\Python32\Include"1523 LIBDEST = "C:\Python32\Lib"1524 SO = ".pyd"1525 VERSION = "32"1526 abiflags = ""1527 base = "C:\Python32"1528 exec_prefix = "C:\Python32"1529 platbase = "C:\Python32"1530 prefix = "C:\Python32"1531 projectbase = "C:\Python32"1532 py_version = "3.2"1533 py_version_nodot = "32"1534 py_version_short = "3.2"1535 srcdir = "C:\Python32"1536 userbase = "C:\Documents and Settings\Raymond\Application Data\Python"1537```15381539(Перенесено из Distutils Тареком Зиаде.)15401541### pdb15421543Модуль отладчика [`pdb`](https://python-all.ru/3.5/library/pdb.html#module-pdb) получил ряд улучшений в удобстве использования:15441545- `pdb.py` теперь имеет опцию `-c`, которая выполняет команды, заданные в файле сценария `.pdbrc`.1546- Файл сценария `.pdbrc` может содержать команды `continue` и `next`, которые продолжают отладку.1547- Конструктор класса `Pdb` теперь принимает аргумент *nosigint*.1548- Новые команды: `l(list)`, `ll(long list)` и `source` для вывода исходного кода.1549- Новые команды: `display` и `undisplay` для показа или скрытия значения выражения, если оно изменилось.1550- Новая команда: `interact` для запуска интерактивного интерпретатора, содержащего глобальные и локальные имена из текущей области видимости.1551- Точки останова можно удалять по номеру.15521553(Добавлено Георгом Брандлем, Антонио Куни и Ильёй Сандлером.)15541555### configparser15561557Модуль [`configparser`](https://python-all.ru/3.5/library/configparser.html#module-configparser) был изменён для повышения удобства использования и предсказуемости парсера по умолчанию и поддерживаемого им синтаксиса INI. Старый класс `ConfigParser` был удалён в пользу `SafeConfigParser`, который, в свою очередь, был переименован в [`ConfigParser`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser). Поддержка inline-комментариев теперь по умолчанию отключена, а дубликаты секций или опций не допускаются в одном источнике конфигурации.15581559Парсеры конфигураций получили новый API на основе протокола отображения:15601561```python1562>>> parser = ConfigParser()1563>>> parser.read_string("""1564... [DEFAULT]1565... location = upper left1566... visible = yes1567... editable = no1568... color = blue1569...1570... [main]1571... title = Main Menu1572... color = green1573...1574... [options]1575... title = Options1576... """)1577>>> parser['main']['color']1578'green'1579>>> parser['main']['editable']1580'no'1581>>> section = parser['options']1582>>> section['title']1583'Options'1584>>> section['title'] = 'Options (editable: %(editable)s)'1585>>> section['title']1586'Options (editable: no)'1587```15881589Новый API реализован поверх классического API, поэтому пользовательские подклассы парсеров должны иметь возможность использовать его без изменений.15901591Структура INI-файла, принимаемая парсерами конфигураций, теперь может быть настроена. Пользователи могут задавать альтернативные разделители опция/значение и префиксы комментариев, изменять имя секции *DEFAULT* или переключать синтаксис интерполяции.15921593Поддерживается подключаемая интерполяция, включая дополнительный обработчик интерполяции [`ExtendedInterpolation`](https://python-all.ru/3.5/library/configparser.html#configparser.ExtendedInterpolation):15941595```python1596>>> parser = ConfigParser(interpolation=ExtendedInterpolation())1597>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},1598... 'custom': {'prefix': '/usr/local'}})1599>>> parser.read_string("""1600... [buildout]1601... parts =1602... zope91603... instance1604... find-links =1605... ${buildout:directory}/downloads/dist1606...1607... [zope9]1608... recipe = plone.recipe.zope9install1609... location = /opt/zope1610...1611... [instance]1612... recipe = plone.recipe.zope9instance1613... zope9-location = ${zope9:location}1614... zope-conf = ${custom:prefix}/etc/zope.conf1615... """)1616>>> parser['buildout']['find-links']1617'\n/home/ambv/zope9/downloads/dist'1618>>> parser['instance']['zope-conf']1619'/usr/local/etc/zope.conf'1620>>> instance = parser['instance']1621>>> instance['zope-conf']1622'/usr/local/etc/zope.conf'1623>>> instance['zope9-location']1624'/opt/zope'1625```16261627Был также введён ряд небольших возможностей, таких как поддержка указания кодировки в операциях чтения, указание значений по умолчанию для get-функций или чтение напрямую из словарей и строк.16281629(Все изменения предоставлены Łukasz Langa.)16301631### urllib.parse16321633Для модуля [`urllib.parse`](https://python-all.ru/3.5/library/urllib.parse.html#module-urllib.parse) был сделан ряд улучшений удобства использования.16341635Функция [`urlparse()`](https://python-all.ru/3.5/library/urllib.parse.html#urllib.parse.urlparse) теперь поддерживает адреса [IPv6](https://python-all.ru/3.5/whatsnew/3.2.html), как описано в [**RFC 2732**](https://python-all.ru/3.5/whatsnew/3.2.html):16361637```python1638>>> import urllib.parse1639>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/') # doctest: +NORMALIZE_WHITESPACE1640ParseResult(scheme='http',1641 netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',1642 path='/foo/',1643 params='',1644 query='',1645 fragment='')1646```16471648Функция [`urldefrag()`](https://python-all.ru/3.5/library/urllib.parse.html#urllib.parse.urldefrag) теперь возвращает [именованный кортеж](https://python-all.ru/3.5/glossary.html#term-named-tuple):16491650```python1651>>> r = urllib.parse.urldefrag('http://python.org/about/#target')1652>>> r1653DefragResult(url='http://python.org/about/', fragment='target')1654>>> r[0]1655'http://python.org/about/'1656>>> r.fragment1657'target'1658```16591660Кроме того, функция [`urlencode()`](https://python-all.ru/3.5/library/urllib.parse.html#urllib.parse.urlencode) теперь стала гораздо более гибкой, принимая аргумент *query* как строкового, так и байтового типа. Если это строка, то параметры *safe*, *encoding* и *error* передаются в [`quote_plus()`](https://python-all.ru/3.5/library/urllib.parse.html#urllib.parse.quote_plus) для кодирования:16611662```python1663>>> urllib.parse.urlencode([1664... ('type', 'telenovela'),1665... ('name', '¿Dónde Está Elisa?')],1666... encoding='latin-1')1667'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'1668```16691670Как подробно описано в [Parsing ASCII Encoded Bytes](https://python-all.ru/3.5/library/urllib.parse.html#parsing-ascii-encoded-bytes), все функции [`urllib.parse`](https://python-all.ru/3.5/library/urllib.parse.html#module-urllib.parse) теперь принимают на вход ASCII-кодированные байтовые строки, при условии, что они не смешиваются с обычными строками. Если в качестве параметров указаны ASCII-кодированные байтовые строки, возвращаемые типы также будут ASCII-кодированными байтовыми строками:16711672```python1673>>> urllib.parse.urlparse(b'http://www.python.org:80/about/') # doctest: +NORMALIZE_WHITESPACE1674ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',1675 path=b'/about/', params=b'', query=b'', fragment=b'')1676```16771678(Работа Nick Coghlan, Dan Mahn и Senthil Kumaran в [bpo-2987](https://python-all.ru/3.5/whatsnew/3.2.html), [bpo-5468](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-9873](https://python-all.ru/3.5/whatsnew/3.2.html).)16791680### mailbox16811682Благодаря согласованным усилиям R. David Murray, модуль [`mailbox`](https://python-all.ru/3.5/library/mailbox.html#module-mailbox) был исправлен для Python 3.2. Сложность заключалась в том, что mailbox изначально был спроектирован с текстовым интерфейсом, но email-сообщения лучше представлять с помощью [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes), поскольку различные части сообщения могут иметь разные кодировки.16831684Решение использовало двоичную поддержку пакета [`email`](https://python-all.ru/3.5/library/email.html#module-email) для разбора произвольных email-сообщений. Кроме того, решение потребовало ряда изменений API.16851686Как и ожидалось, метод [`add()`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Mailbox.add) для объектов [`mailbox.Mailbox`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Mailbox) теперь принимает двоичные входные данные.16871688[`StringIO`](https://python-all.ru/3.5/library/io.html#io.StringIO) и ввод из текстового файла устарели. Кроме того, строковый ввод будет выдавать ошибку на раннем этапе, если используются не-ASCII символы. Ранее ошибка возникала при обработке email на более позднем шаге.16891690Также поддерживается двоичный вывод. Метод [`get_file()`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Mailbox.get_file) теперь возвращает файл в двоичном режиме (ранее он некорректно устанавливал файл в текстовый режим). Также появился новый метод [`get_bytes()`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Mailbox.get_bytes), который возвращает [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes)-представление сообщения, соответствующего заданному *ключу*.16911692Всё ещё возможно получить недвоичный вывод, используя метод [`get_string()`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Mailbox.get_string) старого API, но такой подход не очень полезен. Вместо этого лучше извлекать сообщения из объекта [`Message`](https://python-all.ru/3.5/library/mailbox.html#mailbox.Message) или загружать их из двоичного ввода.16931694(Предоставлено R. David Murray, при участии Steffen Daode Nurpmeso и начального патча от Victor Stinner в [bpo-9124](https://python-all.ru/3.5/whatsnew/3.2.html).)16951696### turtledemo16971698Демонстрационный код для модуля [`turtle`](https://python-all.ru/3.5/library/turtle.html#module-turtle) был перенесён из каталога *Demo* в основную библиотеку. Он включает более десятка примеров скриптов с наглядными демонстрациями. Находясь в [`sys.path`](https://python-all.ru/3.5/library/sys.html#sys.path), его теперь можно запускать напрямую из командной строки:16991700```console1701$ python -m turtledemo1702```17031704(Перенесён из каталога Demo Alexander Belopolsky в [bpo-10199](https://python-all.ru/3.5/whatsnew/3.2.html).)17051706## Многопоточность17071708- Механизм сериализации выполнения одновременно работающих потоков Python (обычно известный как [GIL](https://python-all.ru/3.5/glossary.html#term-gil) или [Глобальная блокировка интерпретатора](https://python-all.ru/3.5/glossary.html#term-global-interpreter-lock)) был переписан. Среди целей были более предсказуемые интервалы переключения и уменьшение накладных расходов из-за конкуренции за блокировку и количества последующих системных вызовов. Понятие «интервал проверки» для разрешения переключения потоков было отброшено и заменено абсолютной длительностью, выраженной в секундах. Этот параметр настраивается через [`sys.setswitchinterval()`](https://python-all.ru/3.5/library/sys.html#sys.setswitchinterval). В настоящее время по умолчанию он равен 5 миллисекундам.17091710 Дополнительные сведения о реализации можно прочитать в [сообщении в списке рассылки python-dev](https://python-all.ru/3.5/whatsnew/3.2.html) (однако, «приоритетные запросы», как описано в этом сообщении, не были сохранены для включения).17111712 (Предоставлено Antoine Pitrou.)1713- Обычные и рекурсивные блокировки теперь принимают необязательный аргумент *timeout* для своего метода [`acquire()`](https://python-all.ru/3.5/library/threading.html#threading.Lock.acquire). (Предоставлено Antoine Pitrou; [bpo-7316](https://python-all.ru/3.5/whatsnew/3.2.html).)1714- Аналогично, [`threading.Semaphore.acquire()`](https://python-all.ru/3.5/library/threading.html#threading.Semaphore.acquire) также получил аргумент *timeout*. (Предоставлено Torsten Landschoff; [bpo-850728](https://python-all.ru/3.5/whatsnew/3.2.html).)1715- Обычные и рекурсивные захваты блокировки теперь можно прерывать сигналами на платформах, использующих Pthreads. Это означает, что программы Python, которые взаимоблокируются при захвате блокировок, можно успешно завершить, многократно отправляя процессу SIGINT (нажав `Ctrl+C` в большинстве оболочек). (Автор: Reid Kleckner; [bpo-8844](https://python-all.ru/3.5/whatsnew/3.2.html).)17161717## Оптимизации17181719Добавлено несколько небольших улучшений производительности:17201721- Оптимизатор «глазка» Python теперь распознает шаблоны, такие как `x in {1, 2, 3}`, как проверку принадлежности к набору констант. Оптимизатор перестраивает [`set`](https://python-all.ru/3.5/library/stdtypes.html#set) в [`frozenset`](https://python-all.ru/3.5/library/stdtypes.html#frozenset) и сохраняет предварительно построенную константу.17221723 Теперь, когда замедление устранено, стало практичным начать писать проверки принадлежности с использованием set-нотации. Этот стиль одновременно ясен семантически и быстр в работе:17241725 ```python1726 extension = name.rpartition('.')[2]1727 if extension in {'xml', 'html', 'xhtml', 'css'}:1728 handle(name)1729 ```17301731 (Патч и дополнительные тесты предоставлены Дэйвом Малкольмом; [bpo-6690](https://python-all.ru/3.5/whatsnew/3.2.html)).1732- Сериализация и десериализация данных с использованием модуля [`pickle`](https://python-all.ru/3.5/library/pickle.html#module-pickle) теперь работает в несколько раз быстрее.17331734 (Предоставлено Александром Вассалотти, Антуаном Питру и командой Unladen Swallow в [bpo-9410](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-3873](https://python-all.ru/3.5/whatsnew/3.2.html).)1735- Алгоритм [Timsort](https://python-all.ru/3.5/whatsnew/3.2.html), используемый в [`list.sort()`](https://python-all.ru/3.5/library/stdtypes.html#list.sort) и [`sorted()`](https://python-all.ru/3.5/library/functions.html#sorted), теперь работает быстрее и использует меньше памяти при вызове с [функцией ключа](https://python-all.ru/3.5/glossary.html#term-key-function). Ранее каждый элемент списка оборачивался временным объектом, который запоминал значение ключа для каждого элемента. Теперь два массива ключей и значений сортируются параллельно. Это экономит память, потребляемую обёртками сортировки, и время, затрачиваемое на делегирование сравнений.17361737 (Патч от Дэниела Штуцбаха в [bpo-9915](https://python-all.ru/3.5/whatsnew/3.2.html).)1738- Производительность декодирования JSON улучшена, а потребление памяти снижено, когда одна и та же строка повторяется для нескольких ключей. Кроме того, кодирование JSON теперь использует ускорения на C, когда аргумент `sort_keys` равен true.17391740 (Предоставлено Антуаном Питру в [bpo-7451](https://python-all.ru/3.5/whatsnew/3.2.html) и Рэймондом Хеттингером и Антуаном Питру в [bpo-10314](https://python-all.ru/3.5/whatsnew/3.2.html).)1741- Рекурсивные блокировки (созданные с помощью API [`threading.RLock()`](https://python-all.ru/3.5/library/threading.html#threading.RLock)) теперь выигрывают от реализации на C, которая делает их такими же быстрыми, как обычные блокировки, и в 10–15 раз быстрее, чем их предыдущая чистая реализация на Python.17421743 (Предоставлено Антуаном Питру; [bpo-3001](https://python-all.ru/3.5/whatsnew/3.2.html).)1744- Алгоритм быстрого поиска в stringlib теперь используется методами `split()`, `rsplit()`, `splitlines()` и `replace()` на объектах [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes), [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray) и [`str`](https://python-all.ru/3.5/library/stdtypes.html#str). Аналогично, алгоритм используется и в `rfind()`, `rindex()`, `rsplit()` и `rpartition()`.17451746 (Патч от Флорана Ксиклуна в [bpo-7622](https://python-all.ru/3.5/whatsnew/3.2.html) и [bpo-7462](https://python-all.ru/3.5/whatsnew/3.2.html).)1747- Преобразования целых чисел в строки теперь работают с двумя «цифрами» за раз, сокращая количество операций деления и взятия остатка.17481749 ([bpo-6713](https://python-all.ru/3.5/whatsnew/3.2.html) от Гавейна Болтона, Марка Дикинсона и Виктора Стиннера.)17501751Было сделано несколько других незначительных оптимизаций. Разность множеств теперь работает быстрее, когда один операнд намного больше другого (патч от Андреса Беннетта в [bpo-8685](https://python-all.ru/3.5/whatsnew/3.2.html)). Метод `array.repeat()` получил более быструю реализацию ([bpo-1569291](https://python-all.ru/3.5/whatsnew/3.2.html) от Александра Белопольского). `BaseHTTPRequestHandler` имеет более эффективную буферизацию ([bpo-3709](https://python-all.ru/3.5/whatsnew/3.2.html) от Эндрю Шаафа). Функция [`operator.attrgetter()`](https://python-all.ru/3.5/library/operator.html#operator.attrgetter) была ускорена ([bpo-10160](https://python-all.ru/3.5/whatsnew/3.2.html) от Христоса Георгиу). И `ConfigParser` загружает многострочные аргументы немного быстрее ([bpo-7113](https://python-all.ru/3.5/whatsnew/3.2.html) от Лукаша Ланги).17521753## Юникод17541755Python был обновлён до [Unicode 6.0.0](https://python-all.ru/3.5/whatsnew/3.2.html). Обновление стандарта добавляет более 2000 новых символов, включая [эмодзи](https://python-all.ru/3.5/whatsnew/3.2.html), которые важны для мобильных телефонов.17561757Кроме того, обновлённый стандарт изменил свойства символов для двух символов каннада (U+0CF1, U+0CF2) и одного числового символа New Tai Lue (U+19DA), сделав первые допустимыми для использования в идентификаторах, а последний – недопустимым. Подробнее см. [Unicode Character Database Changes](https://python-all.ru/3.5/whatsnew/3.2.html).17581759## Кодеки17601761Добавлена поддержка арабской DOS-кодировки *cp720* ([bpo-1616979](https://python-all.ru/3.5/whatsnew/3.2.html)).17621763Кодировка MBCS больше не игнорирует аргумент обработчика ошибок. В режиме строгой обработки по умолчанию она возбуждает [`UnicodeDecodeError`](https://python-all.ru/3.5/library/exceptions.html#UnicodeDecodeError) при обнаружении не декодируемой последовательности байтов и [`UnicodeEncodeError`](https://python-all.ru/3.5/library/exceptions.html#UnicodeEncodeError) для не кодируемого символа.17641765Кодек MBCS поддерживает обработчики ошибок `'strict'` и `'ignore'` для декодирования, и `'strict'` и `'replace'` для кодирования.17661767Для эмуляции кодировки MBCS Python 3.1 выберите обработчик `'ignore'` для декодирования и `'replace'` для кодирования.17681769На Mac OS X Python декодирует аргументы командной строки с помощью `'utf-8'`, а не кодировки локали.17701771По умолчанию [`tarfile`](https://python-all.ru/3.5/library/tarfile.html#module-tarfile) использует кодировку `'utf-8'` в Windows (вместо `'mbcs'`) и обработчик ошибок `'surrogateescape'` на всех операционных системах.17721773## Документация17741775Документация продолжает улучшаться.17761777- Таблица быстрых ссылок добавлена в начало длинных разделов, таких как [Встроенные функции](https://python-all.ru/3.5/library/functions.html#built-in-funcs). В случае с [`itertools`](https://python-all.ru/3.5/library/itertools.html#module-itertools) ссылки сопровождаются таблицами сводок в стиле шпаргалок, чтобы дать обзор и освежить память без необходимости читать всю документацию.1778- В некоторых случаях чистый исходный код на Python может быть полезным дополнением к документации, поэтому теперь многие модули имеют быстрые ссылки на последнюю версию исходного кода. Например, документация модуля [`functools`](https://python-all.ru/3.5/library/functools.html#module-functools) имеет быструю ссылку вверху с пометкой:17791780 > **Исходный код** [Lib/functools.py](https://python-all.ru/src/3.5/Lib/functools.py).17811782 (Автор: Raymond Hettinger; см. [обоснование](https://python-all.ru/3.5/whatsnew/3.2.html).)1783- Документация теперь содержит больше примеров и рецептов. В частности, в модуле [`re`](https://python-all.ru/3.5/library/re.html#module-re) есть обширный раздел [«Примеры регулярных выражений»](https://python-all.ru/3.5/library/re.html#re-examples). Точно так же модуль [`itertools`](https://python-all.ru/3.5/library/itertools.html#module-itertools) продолжает пополняться новыми [«Рецептами itertools»](https://python-all.ru/3.5/library/itertools.html#itertools-recipes).1784- Модуль [`datetime`](https://python-all.ru/3.5/library/datetime.html#module-datetime) теперь имеет вспомогательную реализацию на чистом Python. Функциональность не изменилась. Это просто предоставляет более читабельную альтернативную реализацию.17851786 (Автор: Alexander Belopolsky; [bpo-9528](https://python-all.ru/3.5/whatsnew/3.2.html).)1787- Необслуживаемый каталог `Demo` был удалён. Некоторые демонстрационные примеры были включены в документацию, некоторые перемещены в каталог `Tools/demo`, а остальные удалены полностью.17881789 (Автор: Georg Brandl; [bpo-7962](https://python-all.ru/3.5/whatsnew/3.2.html).)17901791## IDLE17921793- Меню «Формат» теперь содержит опцию для очистки исходных файлов путём удаления замыкающих пробелов.17941795 (Автор: Raymond Hettinger; [bpo-5150](https://python-all.ru/3.5/whatsnew/3.2.html).)1796- IDLE на Mac OS X теперь работает как с Carbon AquaTk, так и с Cocoa AquaTk.17971798 (Авторы: Kevin Walzer, Ned Deily и Ronald Oussoren; [bpo-6075](https://python-all.ru/3.5/whatsnew/3.2.html).)17991800## Репозиторий кода18011802В дополнение к существующему репозиторию Subversion по адресу [http://svn.python.org](https://python-all.ru/3.5/whatsnew/3.2.html) теперь также доступен репозиторий [Mercurial](https://python-all.ru/3.5/whatsnew/3.2.html) по адресу [https://hg.python.org/](https://python-all.ru/3.5/whatsnew/3.2.html).18031804После выхода версии 3.2 планируется перейти на Mercurial в качестве основного репозитория. Эта распределённая система управления версиями должна упростить членам сообщества создание и обмен внешними наборами изменений. Подробнее см. [**PEP 385**](https://python-all.ru/3.5/whatsnew/3.2.html).18051806Чтобы научиться пользоваться новой системой контроля версий, посмотрите [учебник Джоэла Спольски](https://python-all.ru/3.5/whatsnew/3.2.html) или [Руководство по рабочим процессам в Mercurial](https://python-all.ru/3.5/whatsnew/3.2.html).18071808## Изменения в сборке и C API18091810Изменения процесса сборки Python и C API включают:18111812- Сценарии *idle*, *pydoc* и *2to3* теперь устанавливаются с суффиксом, соответствующим версии, на `make altinstall` ([bpo-10679](https://python-all.ru/3.5/whatsnew/3.2.html)).1813- C-функции, обращающиеся к базе данных Unicode, теперь принимают и возвращают символы из всего диапазона Unicode, даже в сборках с узкими юникодными строками (Py\_UNICODE\_TOLOWER, Py\_UNICODE\_ISDECIMAL и другие). Видимое различие в Python заключается в том, что [`unicodedata.numeric()`](https://python-all.ru/3.5/library/unicodedata.html#unicodedata.numeric) теперь возвращает корректное значение для больших кодовых точек, а [`repr()`](https://python-all.ru/3.5/library/functions.html#repr) может считать больше символов печатаемыми.18141815 (Сообщил Bupjoe Lee, исправил Amaury Forgeot D’Arc; [bpo-5127](https://python-all.ru/3.5/whatsnew/3.2.html).)1816- Вычисляемые переходы (computed gotos) теперь включены по умолчанию на поддерживаемых компиляторах (которые обнаруживаются сценарием configure). Их по-прежнему можно выборочно отключить, указав `--without-computed-gotos`.18171818 (Автор: Antoine Pitrou; [bpo-9203](https://python-all.ru/3.5/whatsnew/3.2.html).)1819- Опция `--with-wctype-functions` была удалена. Встроенная база данных Unicode теперь используется для всех функций.18201821 (Автор: Amaury Forgeot D’Arc; [bpo-9210](https://python-all.ru/3.5/whatsnew/3.2.html).)1822- Хеш-значения теперь являются значениями нового типа, `Py_hash_t`, который определён как имеющий тот же размер, что и указатель. Ранее они были типа long, который на некоторых 64-битных операционных системах всё ещё имеет длину всего 32 бита. В результате этого исправления [`set`](https://python-all.ru/3.5/library/stdtypes.html#set) и [`dict`](https://python-all.ru/3.5/library/stdtypes.html#dict) теперь могут содержать более `2**32` записей в сборках с 64-битными указателями (ранее они могли вырасти до такого размера, но их производительность катастрофически падала).18231824 (Предложено Raymond Hettinger, реализовано Benjamin Peterson; [bpo-9778](https://python-all.ru/3.5/whatsnew/3.2.html).)1825- Новый макрос `Py_VA_COPY` копирует состояние списка аргументов переменной длины. Он эквивалентен *va\_copy* из C99, но доступен на всех платформах Python ([bpo-2443](https://python-all.ru/3.5/whatsnew/3.2.html)).1826- Новая функция C API [`PySys_SetArgvEx()`](https://python-all.ru/3.5/c-api/init.html#c.PySys_SetArgvEx) позволяет встроенному интерпретатору устанавливать [`sys.argv`](https://python-all.ru/3.5/library/sys.html#sys.argv) без изменения [`sys.path`](https://python-all.ru/3.5/library/sys.html#sys.path) ([bpo-5753](https://python-all.ru/3.5/whatsnew/3.2.html)).1827- `PyEval_CallObject` теперь доступен только в форме макроса. Объявление функции, которое сохранялось по причинам обратной совместимости, теперь удалено – макрос был введён в 1997 году ([bpo-8276](https://python-all.ru/3.5/whatsnew/3.2.html)).1828- Появилась новая функция [`PyLong_AsLongLongAndOverflow()`](https://python-all.ru/3.5/c-api/long.html#c.PyLong_AsLongLongAndOverflow), которая аналогична [`PyLong_AsLongAndOverflow()`](https://python-all.ru/3.5/c-api/long.html#c.PyLong_AsLongAndOverflow). Обе служат для преобразования Python [`int`](https://python-all.ru/3.5/library/functions.html#int) в нативный тип фиксированной ширины, с обнаружением случаев, когда преобразование не помещается ([bpo-7767](https://python-all.ru/3.5/whatsnew/3.2.html)).1829- Функция [`PyUnicode_CompareWithASCIIString()`](https://python-all.ru/3.5/c-api/unicode.html#c.PyUnicode_CompareWithASCIIString) теперь возвращает *не равно*, если Python-строка завершается *NUL*.1830- Появилась новая функция [`PyErr_NewExceptionWithDoc()`](https://python-all.ru/3.5/c-api/exceptions.html#c.PyErr_NewExceptionWithDoc), которая подобна [`PyErr_NewException()`](https://python-all.ru/3.5/c-api/exceptions.html#c.PyErr_NewException), но позволяет указать строку документации. Это даёт исключениям на C те же возможности самодокументирования, что и их аналогам на чистом Python ([bpo-7033](https://python-all.ru/3.5/whatsnew/3.2.html)).1831- При компиляции с опцией `--with-valgrind` распределитель pymalloc будет автоматически отключаться при работе под Valgrind. Это обеспечивает улучшенное обнаружение утечек памяти при работе под Valgrind, сохраняя преимущества pymalloc в остальное время ([bpo-2422](https://python-all.ru/3.5/whatsnew/3.2.html)).1832- Удалён формат `O?` из функций *PyArg\_Parse*. Формат больше не используется и никогда не был документирован ([bpo-8837](https://python-all.ru/3.5/whatsnew/3.2.html)).18331834Было внесено множество других мелких изменений в C-API. Полный список см. в файле [Misc/NEWS](https://python-all.ru/3.5/whatsnew/3.2.html).18351836Также был обновлён процесс сборки для Mac OS X; подробности см. в [Mac/BuildScript/README.txt](https://python-all.ru/src/3.5/Mac/BuildScript/README.txt). Для пользователей, использующих 32/64-битную сборку, существует известная проблема с Tcl/Tk по умолчанию в Mac OS X 10.6. В связи с этим рекомендуется установить обновлённую альтернативу, например [ActiveState Tcl/Tk 8.5.9](https://python-all.ru/3.5/whatsnew/3.2.html). Дополнительные сведения см. на [https://www.python.org/download/mac/tcltk/](https://python-all.ru/3.5/whatsnew/3.2.html).18371838## Переход на Python 3.218391840В этом разделе перечислены описанные ранее изменения и другие исправления ошибок, которые могут потребовать доработки вашего кода:18411842- Модуль [`configparser`](https://python-all.ru/3.5/library/configparser.html#module-configparser) претерпел ряд исправлений. Самое существенное изменение – замена старого класса `ConfigParser` на давно рекомендуемую альтернативу `SafeConfigParser`. Кроме того, имеется ряд более мелких несовместимостей:18431844 - Синтаксис интерполяции теперь проверяется при операциях [`get()`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser.get) и [`set()`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser.set). В схеме интерполяции по умолчанию допустимы только два токена с символом процента: `%(name)s` и `%%` (последний – экранированный знак процента).1845 - Методы [`set()`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser.set) и [`add_section()`](https://python-all.ru/3.5/library/configparser.html#configparser.ConfigParser.add_section) теперь проверяют, что значения являются строками. Раньше неподдерживаемые типы могли быть вставлены непреднамеренно.1846 - Повторяющиеся секции или параметры из одного источника теперь вызывают [`DuplicateSectionError`](https://python-all.ru/3.5/library/configparser.html#configparser.DuplicateSectionError) или [`DuplicateOptionError`](https://python-all.ru/3.5/library/configparser.html#configparser.DuplicateOptionError). Раньше дубликаты молча перезаписывали предыдущую запись.1847 - Встрочные комментарии теперь по умолчанию отключены, поэтому символ **;** теперь можно безопасно использовать в значениях.1848 - Комментарии теперь можно располагать с отступом. Следовательно, чтобы **;** или **#** оказались в начале строки в многострочных значениях, их нужно интерполировать. Это предотвращает ошибочную интерпретацию префиксных символов комментариев в значениях как комментариев.1849 - `""` теперь является допустимым значением и больше не преобразуется автоматически в пустую строку. Для пустых строк используйте `"option ="` в строке.1850- Модуль [`nntplib`](https://python-all.ru/3.5/library/nntplib.html#module-nntplib) был существенно переработан, поэтому его API часто несовместимы с API версии 3.1.1851- Объекты [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray) больше нельзя использовать в качестве имён файлов; вместо этого их следует преобразовывать в [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes).1852- `array.tostring()` и `array.fromstring()` переименованы в `array.tobytes()` и `array.frombytes()` для ясности. Старые названия признаны устаревшими. (См. [bpo-8990](https://python-all.ru/3.5/whatsnew/3.2.html).)1853- Функции `PyArg_Parse*()`:18541855 - Формат «t#» удалён: используйте «s#» или «s\*»1856 - Форматы «w» и «w#» удалены: используйте «w\*»1857- Тип `PyCObject`, объявленный устаревшим в 3.1, удалён. Для обёртывания непрозрачных C-указателей в объекты Python следует использовать API [`PyCapsule`](https://python-all.ru/3.5/c-api/capsule.html#c.PyCapsule); новый тип имеет чётко определённый интерфейс для передачи информации о типобезопасности и менее сложную сигнатуру вызова деструктора.1858- Функция `sys.setfilesystemencoding()` удалена, так как имела ошибочную архитектуру.1859- Функция и метод [`random.seed()`](https://python-all.ru/3.5/library/random.html#random.seed) теперь солят строковые начальные значения с помощью хеш-функции sha512. Чтобы получить доступ к предыдущей версии *seed* для воспроизведения последовательностей Python 3.1, установите аргумент *version* в *1*, `random.seed(s, version=1)`.1860- Ранее объявленная устаревшей функция `string.maketrans()` удалена в пользу статических методов [`bytes.maketrans()`](https://python-all.ru/3.5/library/stdtypes.html#bytes.maketrans) и [`bytearray.maketrans()`](https://python-all.ru/3.5/library/stdtypes.html#bytearray.maketrans). Это изменение устраняет путаницу с тем, какие типы поддерживаются модулем [`string`](https://python-all.ru/3.5/library/string.html#module-string). Теперь [`str`](https://python-all.ru/3.5/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray) имеют собственные методы **maketrans** и **translate** с промежуточными таблицами перевода соответствующего типа.18611862 (Предложено Georg Brandl; [bpo-5675](https://python-all.ru/3.5/whatsnew/3.2.html).)1863- Ранее объявленная устаревшей функция `contextlib.nested()` удалена в пользу обычного оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), который может принимать несколько менеджеров контекста. Последний способ быстрее (поскольку встроен) и лучше завершает несколько менеджеров контекста, если один из них вызывает исключение:18641865 ```python1866 with open('mylog.txt') as infile, open('a.out', 'w') as outfile:1867 for line in infile:1868 if '<critical>' in line:1869 outfile.write(line)1870 ```18711872 (Предложено Georg Brandl и Mattias Brändström; [appspot issue 53094](https://python-all.ru/3.5/whatsnew/3.2.html).)1873- [`struct.pack()`](https://python-all.ru/3.5/library/struct.html#struct.pack) теперь допускает только байты для кода упаковки строк `s`. Раньше он принимал текстовые аргументы и неявно кодировал их в байты через UTF-8. Это было проблематично, так как строило предположения о верной кодировке и потому что кодировка с переменной длиной может дать сбой при записи в сегмент структуры фиксированной длины.18741875 Код вида `struct.pack('<6sHHBBB', 'GIF87a', x, y)` следует переписать с использованием байтов вместо текста: `struct.pack('<6sHHBBB', b'GIF87a', x, y)`.18761877 (Обнаружено David Beazley, исправлено Victor Stinner; [bpo-10783](https://python-all.ru/3.5/whatsnew/3.2.html).)1878- Класс [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) теперь вызывает [`xml.etree.ElementTree.ParseError`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ParseError) при неудачном разборе. Ранее вызывалось [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.5/library/pyexpat.html#xml.parsers.expat.ExpatError).1879- Новое, более длинное значение [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) для чисел с плавающей точкой может нарушить doctest-тесты, которые полагаются на старый формат вывода.1880- В [`subprocess.Popen`](https://python-all.ru/3.5/library/subprocess.html#subprocess.Popen) значение по умолчанию для *close\_fds* теперь равно `True` в Unix; в Windows оно равно `True`, если три стандартных потока установлены в `None`, и `False` в противном случае. Раньше *close\_fds* всегда было `False` по умолчанию, что приводило к трудноуловимым ошибкам или состояниям гонки, когда открытые файловые дескрипторы просачивались в дочерний процесс.1881- Поддержка устаревшего HTTP 0.9 удалена из [`urllib.request`](https://python-all.ru/3.5/library/urllib.request.html#module-urllib.request) и [`http.client`](https://python-all.ru/3.5/library/http.client.html#module-http.client). Такая поддержка по-прежнему присутствует на стороне сервера (в [`http.server`](https://python-all.ru/3.5/library/http.server.html#module-http.server)).18821883 (Предложено Antoine Pitrou, [bpo-10711](https://python-all.ru/3.5/whatsnew/3.2.html).)1884- SSL-сокеты в режиме тайм-аута теперь вызывают [`socket.timeout`](https://python-all.ru/3.5/library/socket.html#socket.timeout) при возникновении тайм-аута, а не общее [`SSLError`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLError).18851886 (Автор: Антуан Питу, [bpo-10272](https://python-all.ru/3.5/whatsnew/3.2.html).)1887- Вводящие в заблуждение функции [`PyEval_AcquireLock()`](https://python-all.ru/3.5/c-api/init.html#c.PyEval_AcquireLock) и [`PyEval_ReleaseLock()`](https://python-all.ru/3.5/c-api/init.html#c.PyEval_ReleaseLock) официально устарели. Вместо них следует использовать API, учитывающие состояние потока (например, [`PyEval_SaveThread()`](https://python-all.ru/3.5/c-api/init.html#c.PyEval_SaveThread) и [`PyEval_RestoreThread()`](https://python-all.ru/3.5/c-api/init.html#c.PyEval_RestoreThread)).1888- Из соображений безопасности `asyncore.handle_accept()` объявлен устаревшим, и добавлена новая функция `asyncore.handle_accepted()` для его замены.18891890 (Автор: Джампаоло Родола, [bpo-6706](https://python-all.ru/3.5/whatsnew/3.2.html).)1891- Из-за новой реализации [GIL](https://python-all.ru/3.5/glossary.html#term-gil) [`PyEval_InitThreads()`](https://python-all.ru/3.5/c-api/init.html#c.PyEval_InitThreads) больше нельзя вызывать до [`Py_Initialize()`](https://python-all.ru/3.5/c-api/init.html#c.Py_Initialize).1892