Документация Python неофициальный перевод

3.2.md

1875 строк · 183.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/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.4/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.4/whatsnew/3.2.html) - Определение стабильного ABI**27>28> PEP написан Мартином фон Лёвисом.2930## PEP 389: Модуль разбора командной строки argparse3132Новый модуль для разбора командной строки, [`argparse`](https://python-all.ru/3.4/library/argparse.html#module-argparse), был представлен, чтобы преодолеть ограничения [`optparse`](https://python-all.ru/3.4/library/optparse.html#module-optparse), который не обеспечивал поддержку позиционных аргументов (не только опций), подкоманд, обязательных опций и других распространённых шаблонов задания и проверки опций.3334Этот модуль уже получил широкое распространение в сообществе как сторонний модуль. Будучи более функциональным, чем его предшественник, модуль [`argparse`](https://python-all.ru/3.4/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.4/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')   # first subgroup97parser_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',        # second subgroup101                                 aliases=('steer', 'turn'))         # equivalent names102parser_m.add_argument('-c', '--course', type=int, required=True)103parser_m.add_argument('-s', '--speed', type=int, default=0)104105$ ./helm.py --help                         # top level help (launch and move)106$ ./helm.py launch --help                  # help for launch options107$ ./helm.py launch --missiles              # set missiles=True and torpedos=False108$ ./helm.py steer --course 180 --speed 5   # set movement parameters109```110111> **См. также**112>113> **[**PEP 389**](https://python-all.ru/3.4/whatsnew/3.2.html) - Новый модуль разбора командной строки**114>115> PEP написан Стивеном Бетардом.116>117> [*Обновление кода optparse*](https://python-all.ru/3.4/library/argparse.html#upgrading-optparse-code) – подробнее о различиях с [`optparse`](https://python-all.ru/3.4/library/optparse.html#module-optparse).118119## PEP 391: Конфигурация логирования на основе словарей120121Модуль [`logging`](https://python-all.ru/3.4/library/logging.html#module-logging) предлагал два вида конфигурации: один стиль с вызовами функций для каждой опции, другой стиль на основе внешнего файла, сохранённого в формате `ConfigParser`. Эти варианты не обеспечивали гибкости для создания конфигураций из файлов JSON или YAML, а также не поддерживали инкрементальную конфигурацию, которая необходима для указания параметров логгера из командной строки.122123Для поддержки более гибкого стиля модуль теперь предлагает [`logging.config.dictConfig()`](https://python-all.ru/3.4/library/logging.config.html#logging.config.dictConfig) для задания конфигурации логирования с помощью обычных словарей Python. Параметры конфигурации включают форматтеры, обработчики, фильтры и логгеры. Вот рабочий пример словаря конфигурации:124125```python126{"version": 1,127 "formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},128                "full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}129                },130 "handlers": {"console": {131                   "class": "logging.StreamHandler",132                   "formatter": "brief",133                   "level": "INFO",134                   "stream": "ext://sys.stdout"},135              "console_priority": {136                   "class": "logging.StreamHandler",137                   "formatter": "full",138                   "level": "ERROR",139                   "stream": "ext://sys.stderr"}140              },141 "root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}142```143144Если этот словарь сохранён в файле с именем `conf.json`, его можно загрузить и вызвать с помощью такого кода:145146```python147>>> import json, logging.config148>>> with open('conf.json') as f:149        conf = json.load(f)150>>> logging.config.dictConfig(conf)151>>> logging.info("Transaction completed normally")152INFO    : root           : Transaction completed normally153>>> logging.critical("Abnormal termination")1542011-02-17 11:14:36,694 root            CRITICAL Abnormal termination155```156157> **См. также**158>159> **[**PEP 391**](https://python-all.ru/3.4/whatsnew/3.2.html) – Конфигурация логирования на основе словарей**160>161> PEP написан Винаем Саджипом.162163## PEP 3148: Модуль `concurrent.futures`164165Код для создания параллельного выполнения и управления им собирается в новом пространстве имён верхнего уровня *concurrent*. Первый его компонент – пакет *futures*, предоставляющий единый высокоуровневый интерфейс для управления потоками и процессами.166167Дизайн [`concurrent.futures`](https://python-all.ru/3.4/library/concurrent.futures.html#module-concurrent.futures) был вдохновлён пакетом *java.util.concurrent*. В этой модели выполняющийся вызов и его результат представлены объектом [`Future`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.Future), который абстрагирует возможности, общие для потоков, процессов и удалённых вызовов процедур. Этот объект поддерживает проверку состояния (выполняется или завершён), тайм-ауты, отмены, добавление колбэков, а также доступ к результатам или исключениям.168169Основная часть нового модуля – два класса исполнителей для запуска и управления вызовами. Цель исполнителей – упростить использование существующих инструментов для параллельных вызовов. Они избавляют от необходимости настраивать пул ресурсов, запускать вызовы, создавать очередь результатов, добавлять обработку таймаутов и ограничивать общее количество потоков, процессов или удалённых вызовов.170171В идеале каждое приложение должно использовать один общий исполнитель для нескольких компонентов, чтобы ограничения на процессы и потоки управлялись централизованно. Это решает проблему проектирования, возникающую, когда у каждого компонента своя конкурирующая стратегия управления ресурсами.172173Оба класса имеют общий интерфейс с тремя методами: [`submit()`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.Executor.submit) для планирования вызываемого объекта и возврата объекта [`Future`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.Future); [`map()`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.Executor.map) для планирования множества асинхронных вызовов за раз, и [`shutdown()`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.Executor.shutdown) для освобождения ресурсов. Класс является [*менеджером контекста*](https://python-all.ru/3.4/glossary.html#term-context-manager) и может использоваться в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), чтобы гарантировать автоматическое освобождение ресурсов, когда текущие ожидающие future завершат выполнение.174175Простой пример [`ThreadPoolExecutor`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) – это запуск четырёх параллельных потоков для копирования файлов:176177```python178import concurrent.futures, shutil179with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:180    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')181    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')182    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')183    e.submit(shutil.copy, 'src3.txt', 'dest4.txt')184```185186> **См. также**187>188> **[**PEP 3148**](https://python-all.ru/3.4/whatsnew/3.2.html) – Futures – асинхронное выполнение вычислений**189>190> PEP написан Брайаном Куинланом.191>192> [*Код для параллельного чтения URL в потоках*](https://python-all.ru/3.4/library/concurrent.futures.html#threadpoolexecutor-example) – пример использования потоков для параллельной загрузки нескольких веб-страниц.193>194> [*Код для вычисления простых чисел параллельно*](https://python-all.ru/3.4/library/concurrent.futures.html#processpoolexecutor-example), пример, демонстрирующий [`ProcessPoolExecutor`](https://python-all.ru/3.4/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor).195196## PEP 3147: Директории репозитория PYC197198Схема кэширования байт-кода Python в файлы *.pyc* плохо работала в средах с несколькими интерпретаторами Python. Если один интерпретатор встречал кэшированный файл, созданный другим, он перекомпилировал исходный код и перезаписывал кэш, теряя преимущества кэширования.199200Проблема «pyc-войн» стала более заметной, поскольку в дистрибутивах Linux стало обычным делом поставлять несколько версий Python. Эти конфликты возникают и с альтернативными реализациями CPython, такими как Unladen Swallow.201202Чтобы решить эту проблему, механизм импорта Python был расширен для использования разных имён файлов для каждого интерпретатора. Вместо того чтобы Python 3.2, Python 3.3 и Unladen Swallow конкурировали за файл с именем «mymodule.pyc», теперь они будут искать «mymodule.cpython-32.pyc», «mymodule.cpython-33.pyc» и «mymodule.unladen10.pyc». А чтобы все эти новые файлы не засоряли исходные каталоги, файлы *pyc* теперь собираются в каталог «\_\_pycache\_\_», расположенный внутри каталога пакета.203204Помимо имён файлов и целевых каталогов, новая схема имеет несколько аспектов, видимых программисту:205206- Импортированные модули теперь имеют атрибут [`__cached__`](https://python-all.ru/3.4/reference/import.html#__cached__), который хранит имя файла, который был фактически импортирован:207208  ```python209  >>> import collections210  >>> collections.__cached__211  'c:/py32/lib/__pycache__/collections.cpython-32.pyc'212  ```213- Тег, уникальный для каждого интерпретатора, доступен из модуля [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp):214215  ```python216  >>> import imp217  >>> imp.get_tag()218  'cpython-32'219  ```220- Скрипты, которые пытаются определить имя исходного файла из импортированного файла, теперь должны быть умнее. Больше недостаточно просто удалить букву «c» из имени файла «.pyc». Вместо этого используйте новые функции в модуле [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp):221222  ```python223  >>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')224  'c:/py32/lib/collections.py'225  >>> imp.cache_from_source('c:/py32/lib/collections.py')226  'c:/py32/lib/__pycache__/collections.cpython-32.pyc'227  ```228- Модули [`py_compile`](https://python-all.ru/3.4/library/py_compile.html#module-py_compile) и [`compileall`](https://python-all.ru/3.4/library/compileall.html#module-compileall) были обновлены для отражения нового соглашения об именовании и целевого каталога. Командная строка вызова *compileall* имеет новые опции: `-i` для указания списка файлов и каталогов для компиляции и `-b`, которая приводит к записи байт-кода в их устаревшее расположение, а не в *\_\_pycache\_\_*.229- Модуль [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc) был обновлён и теперь содержит новые [*абстрактные базовые классы*](https://python-all.ru/3.4/glossary.html#term-abstract-base-class) для загрузки файлов байт-кода. Устаревшие ABC, `PyLoader` и `PyPycLoader`, объявлены устаревшими (инструкции по сохранению совместимости с Python 3.1 включены в документацию).230231> **См. также**232>233> **[**PEP 3147**](https://python-all.ru/3.4/whatsnew/3.2.html) – Директории репозитория PYC**234>235> PEP написан Барри Варшавой.236237## PEP 3149: .so-файлы с тегом версии ABI238239Директория репозитория PYC позволяет размещать несколько кэшированных файлов байт-кода в одном месте. Этот PEP реализует аналогичный механизм для разделяемых объектных файлов, помещая их в общую директорию с разными именами для каждой версии.240241Общая директория называется «pyshared», а имена файлов различаются указанием реализации Python (например, CPython, PyPy, Jython и т.д.), номерами старшей и младшей версии, а также необязательными флагами сборки (например, «d» для отладки, «m» для pymalloc, «u» для wide-unicode). Для произвольного пакета «foo» при установке дистрибутивного пакета можно увидеть такие файлы:242243```python244/usr/share/pyshared/foo.cpython-32m.so245/usr/share/pyshared/foo.cpython-33md.so246```247248В самом Python теги доступны из функций модуля [`sysconfig`](https://python-all.ru/3.4/library/sysconfig.html#module-sysconfig):249250```python251>>> import sysconfig252>>> sysconfig.get_config_var('SOABI')       # найти тег версии253'cpython-32mu'254>>> sysconfig.get_config_var('EXT_SUFFIX')  # найти полное расширение имени файла255'.cpython-32mu.so'256```257258> **См. также**259>260> **[**PEP 3149**](https://python-all.ru/3.4/whatsnew/3.2.html) – файлы .so с тегами версии ABI**261>262> PEP написан Барри Варшавой.263264## PEP 3333: Python Web Server Gateway Interface v1.0.1265266Этот информационный PEP проясняет, как проблемы байтов/текста должны обрабатываться протоколом WSGI. Сложность в том, что обработка строк в Python 3 наиболее удобно выполняется с помощью типа [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), хотя сам протокол HTTP ориентирован на байты.267268PEP различает так называемые *нативные строки*, используемые для заголовков и метаданных запросов/ответов, и *байтовые строки*, используемые для тел запросов и ответов.269270*Нативные строки* всегда имеют тип [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), но ограничены кодовыми точками от *U+0000* до *U+00FF*, которые преобразуются в байты с помощью кодировки *Latin-1*. Эти строки используются для ключей и значений в словаре окружения, а также для заголовков ответа и статусов в функции `start_response()`. Они должны следовать [**RFC 2616**](https://python-all.ru/3.4/whatsnew/3.2.html) в отношении кодировки. То есть они должны быть либо символами *ISO-8859-1*, либо использовать [**RFC 2047**](https://python-all.ru/3.4/whatsnew/3.2.html) кодировку MIME.271272Для разработчиков, переносящих WSGI-приложения с Python 2, вот ключевые моменты:273274- Если приложение уже использовало строки для заголовков в Python 2, никаких изменений не требуется.275- Если же приложение кодировало выходные заголовки или декодировало входные заголовки, то заголовки необходимо будет перекодировать в Latin-1. Например, выходной заголовок, закодированный в utf-8 с использованием `h.encode('utf-8')`, теперь нужно преобразовать из байтов в нативные строки с помощью `h.encode('utf-8').decode('latin-1')`.276- Значения, возвращаемые приложением или отправляемые с помощью метода `write()`, должны быть байтовыми строками. Функция `start_response()` и переменная environ должны использовать нативные строки. Их нельзя смешивать.277278Для разработчиков серверов, пишущих шлюзы CGI-to-WSGI или другие протоколы в стиле CGI, пользователи должны иметь возможность доступа к окружению с помощью нативных строк, даже если базовая платформа использует другие соглашения. Чтобы устранить этот разрыв, модуль [`wsgiref`](https://python-all.ru/3.4/library/wsgiref.html#module-wsgiref) содержит новую функцию [`wsgiref.handlers.read_environ()`](https://python-all.ru/3.4/library/wsgiref.html#wsgiref.handlers.read_environ) для перекодирования переменных CGI из [`os.environ`](https://python-all.ru/3.4/library/os.html#os.environ) в нативные строки и возврата нового словаря.279280> **См. также**281>282> **[**PEP 3333**](https://python-all.ru/3.4/whatsnew/3.2.html) – Python Web Server Gateway Interface v1.0.1**283>284> PEP написан Филлипом Иби.285286## Прочие изменения языка287288Некоторые небольшие изменения, внесённые в ядро языка Python:289290- Форматирование строк для [`format()`](https://python-all.ru/3.4/library/functions.html#format) и [`str.format()`](https://python-all.ru/3.4/library/stdtypes.html#str.format) получило новые возможности для символа формата **#**. Ранее для целых чисел в двоичной, восьмеричной или шестнадцатеричной системе он приводил к добавлению префикса '0b', '0o' или '0x' соответственно. Теперь он также может обрабатывать числа с плавающей запятой, комплексные и Decimal, что приводит к тому, что вывод всегда содержит десятичную точку, даже если после неё нет цифр.291292  ```python293  >>> format(20, '#o')294  '0o24'295  >>> format(12.34, '#5.0f')296  '  12.'297  ```298299  (Предложено Марком Дикинсоном и реализовано Эриком Смитом в [issue 7094](https://python-all.ru/3.4/whatsnew/3.2.html).)300- Также появился новый метод [`str.format_map()`](https://python-all.ru/3.4/library/stdtypes.html#str.format_map), который расширяет возможности существующего метода [`str.format()`](https://python-all.ru/3.4/library/stdtypes.html#str.format), принимая произвольные объекты [*mapping*](https://python-all.ru/3.4/glossary.html#term-mapping) (отображения). Этот новый метод позволяет использовать форматирование строк с любыми словареподобными объектами Python, такими как [`defaultdict`](https://python-all.ru/3.4/library/collections.html#collections.defaultdict), [`Shelf`](https://python-all.ru/3.4/library/shelve.html#shelve.Shelf), [`ConfigParser`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser) или [`dbm`](https://python-all.ru/3.4/library/dbm.html#module-dbm). Он также полезен с пользовательскими подклассами [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict), которые нормализуют ключи перед поиском или предоставляют метод [`__missing__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__missing__) для неизвестных ключей:301302  ```python303  >>> import shelve304  >>> d = shelve.open('tmp.shl')305  >>> 'The {project_name} status is {status} as of {date}'.format_map(d)306  'The testing project status is green as of February 15, 2011'307308  >>> class LowerCasedDict(dict):309          def __getitem__(self, key):310              return dict.__getitem__(self, key.lower())311  >>> lcd = LowerCasedDict(part='widgets', quantity=10)312  >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd)313  'There are 10 widgets in stock'314315  >>> class PlaceholderDict(dict):316          def __missing__(self, key):317              return '<{}>'.format(key)318  >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict())319  'Hello <name>, welcome to <location>'320  ```321322> (Предложено Рэймондом Хеттингером и реализовано Эриком Смитом в323>324> [issue 6081](https://python-all.ru/3.4/whatsnew/3.2.html)325>326> .)327328- Интерпретатор теперь можно запускать с тихой опцией `-q`, чтобы предотвратить отображение информации об авторских правах и версии в интерактивном режиме. Эту опцию можно проверить с помощью атрибута [`sys.flags`](https://python-all.ru/3.4/library/sys.html#sys.flags):329330  ```python331  $ python -q332  >>> sys.flags333  sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,334  optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,335  ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)336  ```337338  (Предложено Марчином Войдыром в [issue 1772833](https://python-all.ru/3.4/whatsnew/3.2.html)).339- Функция [`hasattr()`](https://python-all.ru/3.4/library/functions.html#hasattr) работает путём вызова [`getattr()`](https://python-all.ru/3.4/library/functions.html#getattr) и определения, возникает ли исключение. Этот метод позволяет ей обнаруживать методы, созданные динамически с помощью [`__getattr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattribute__), которые в противном случае отсутствовали бы в словаре класса. Ранее *hasattr* перехватывал любое исключение, возможно маскируя настоящие ошибки. Теперь *hasattr* был сужен и перехватывает только [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError), позволяя другим исключениям проходить:340341  ```python342  >>> class A:343          @property344          def f(self):345              return 1 // 0346347  >>> a = A()348  >>> hasattr(a, 'f')349  Traceback (most recent call last):350    ...351  ZeroDivisionError: integer division or modulo by zero352  ```353354  (Обнаружено Юрием Селивановым и исправлено Бенджамином Петерсоном; [issue 9666](https://python-all.ru/3.4/whatsnew/3.2.html).)355- Результат [`str()`](https://python-all.ru/3.4/library/stdtypes.html#str) для числа с плавающей точкой или комплексного числа теперь совпадает с его [`repr()`](https://python-all.ru/3.4/library/functions.html#repr). Ранее форма [`str()`](https://python-all.ru/3.4/library/stdtypes.html#str) была короче, но это лишь вызывало путаницу и больше не нужно, поскольку теперь по умолчанию отображается максимально короткое [`repr()`](https://python-all.ru/3.4/library/functions.html#repr):356357  ```python358  >>> import math359  >>> repr(math.pi)360  '3.141592653589793'361  >>> str(math.pi)362  '3.141592653589793'363  ```364365  (Предложено и реализовано Марком Дикинсоном; [issue 9337](https://python-all.ru/3.4/whatsnew/3.2.html).)366- Объекты [`memoryview`](https://python-all.ru/3.4/library/stdtypes.html#memoryview) теперь имеют метод [`release()`](https://python-all.ru/3.4/library/stdtypes.html#memoryview.release), а также поддерживают протокол управления контекстом. Это позволяет своевременно освобождать любые ресурсы, полученные при запросе буфера от исходного объекта.367368  ```python369  >>> with memoryview(b'abcdefgh') as v:370          print(v.tolist())371  [97, 98, 99, 100, 101, 102, 103, 104]372  ```373374  (Добавлено Антуаном Питру; [issue 9757](https://python-all.ru/3.4/whatsnew/3.2.html).)375- Ранее было запрещено удалять имя из локального пространства имён, если оно встречается как свободная переменная во вложенном блоке:376377  ```python378  def outer(x):379      def inner():380         return x381      inner()382      del x383  ```384385  Теперь это разрешено. Помните, что цель предложения [`except`](https://python-all.ru/3.4/reference/compound_stmts.html#except) очищается, так что этот код, который работал в Python 2.6, вызывал [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError) в Python 3.1, а теперь снова работает:386387  ```python388  def f():389      def print_error():390         print(e)391      try:392         something393      except Exception as e:394         print_error()395         # неявное "del e" здесь396  ```397398  (См. [issue 4617](https://python-all.ru/3.4/whatsnew/3.2.html).)399- Внутренний инструмент `structsequence` теперь создаёт подклассы tuple. Это означает, что C-структуры, такие как возвращаемые [`os.stat()`](https://python-all.ru/3.4/library/os.html#os.stat), [`time.gmtime()`](https://python-all.ru/3.4/library/time.html#time.gmtime) и [`sys.version_info`](https://python-all.ru/3.4/library/sys.html#sys.version_info), теперь работают как [*именованный кортеж*](https://python-all.ru/3.4/glossary.html#term-named-tuple) и взаимодействуют с функциями и методами, ожидающими кортеж в качестве аргумента. Это большой шаг вперёд в деле придания C-структурам такой же гибкости, как у их аналогов на чистом Python:400401  ```python402  >>> isinstance(sys.version_info, tuple)403  True404  >>> 'Version %d.%d.%d %s(%d)' % sys.version_info405  'Version 3.2.0 final(0)'406  ```407408  (Предложено Арфревером Фретесом Тайферсаром Арахезисом и реализовано Бенджамином Петерсоном в [issue 8413](https://python-all.ru/3.4/whatsnew/3.2.html).)409- Предупреждения теперь легче контролировать с помощью переменной окружения [`PYTHONWARNINGS`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONWARNINGS) в качестве альтернативы использованию `-W` в командной строке:410411  ```python412  $ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'413  ```414415  (Предложено Барри Варшавой и реализовано Филипом Дженви в [issue 7301](https://python-all.ru/3.4/whatsnew/3.2.html).)416- Добавлена новая категория предупреждений [`ResourceWarning`](https://python-all.ru/3.4/library/exceptions.html#ResourceWarning). Она возникает при обнаружении потенциальных проблем с потреблением ресурсов или очисткой. По умолчанию она отключена в обычных сборках, но может быть включена средствами модуля [`warnings`](https://python-all.ru/3.4/library/warnings.html#module-warnings) или из командной строки.417418  [`ResourceWarning`](https://python-all.ru/3.4/library/exceptions.html#ResourceWarning) выдаётся при завершении интерпретатора, если список [`gc.garbage`](https://python-all.ru/3.4/library/gc.html#gc.garbage) не пуст, и если установлен [`gc.DEBUG_UNCOLLECTABLE`](https://python-all.ru/3.4/library/gc.html#gc.DEBUG_UNCOLLECTABLE), то выводятся все несобираемые объекты. Это предназначено для того, чтобы программист осознавал, что его код содержит проблемы с финализацией объектов.419420  [`ResourceWarning`](https://python-all.ru/3.4/library/exceptions.html#ResourceWarning) также выдаётся, когда [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object) уничтожается без явного закрытия. Хотя деаллокатор такого объекта гарантирует закрытие базового ресурса операционной системы (обычно файлового дескриптора), задержка в деаллокации может вызвать различные проблемы, особенно в Windows. Вот пример включения предупреждения из командной строки:421422  ```python423  $ python -q -Wdefault424  >>> f = open("foo", "wb")425  >>> del f426  __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>427  ```428429  (Добавлено Антуаном Питру и Георгом Брандлем в [issue 10093](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 477863](https://python-all.ru/3.4/whatsnew/3.2.html).)430- Объекты [`range`](https://python-all.ru/3.4/library/stdtypes.html#range) теперь поддерживают методы *index* и *count*. Это часть усилий по обеспечению полной реализации `collections.Sequence` [*абстрактного базового класса*](https://python-all.ru/3.4/glossary.html#term-abstract-base-class). В результате язык будет иметь более единообразный API. Кроме того, объекты [`range`](https://python-all.ru/3.4/library/stdtypes.html#range) теперь поддерживают срезы и отрицательные индексы, даже со значениями больше [`sys.maxsize`](https://python-all.ru/3.4/library/sys.html#sys.maxsize). Это делает *range* более совместимым со списками:431432  ```python433  >>> range(0, 100, 2).count(10)434  1435  >>> range(0, 100, 2).index(10)436  5437  >>> range(0, 100, 2)[5]438  10439  >>> range(0, 100, 2)[0:5]440  range(0, 10, 2)441  ```442443  (Предложено Дэниелом Штуцбахом в [issue 9213](https://python-all.ru/3.4/whatsnew/3.2.html), Александром Белопольским в [issue 2690](https://python-all.ru/3.4/whatsnew/3.2.html) и Ником Коглан в [issue 10889](https://python-all.ru/3.4/whatsnew/3.2.html).)444- Встроенная функция [`callable()`](https://python-all.ru/3.4/library/functions.html#callable) из Py2.x была воскрешена. Она предоставляет краткую, читаемую альтернативу использованию [*абстрактного базового класса*](https://python-all.ru/3.4/glossary.html#term-abstract-base-class) в выражении вида `isinstance(x, collections.Callable)`:445446  ```python447  >>> callable(max)448  True449  >>> callable(20)450  False451  ```452453  (См. [issue 10518](https://python-all.ru/3.4/whatsnew/3.2.html).)454- Механизм импорта Python теперь может загружать модули, установленные в каталогах, в именах путей которых есть не-ASCII символы. Это решило давнюю проблему с домашними каталогами пользователей, имеющих не-ASCII символы в именах.455456> (Потребовало обширной работы Виктора Стиннера в457>458> [issue 9425](https://python-all.ru/3.4/whatsnew/3.2.html)459>460> .)461462## Новые, улучшенные и устаревшие модули463464Стандартная библиотека Python прошла значительную работу по сопровождению и улучшению качества.465466Самая большая новость для Python 3.2 в том, что пакет [`email`](https://python-all.ru/3.4/library/email.html#module-email), модули [`mailbox`](https://python-all.ru/3.4/library/mailbox.html#module-mailbox) и [`nntplib`](https://python-all.ru/3.4/library/nntplib.html#module-nntplib) теперь корректно работают с моделью bytes/text в Python 3. Впервые обеспечена правильная обработка сообщений со смешанными кодировками.467468По всей стандартной библиотеке уделено больше внимания вопросам кодировок и различиям между текстом и байтами. В частности, взаимодействие с операционной системой теперь лучше обменивается не-ASCII данными, используя кодировку Windows MBCS, локаль-зависимые кодировки или UTF-8.469470Ещё одно важное достижение – добавление значительно улучшенной поддержки *SSL*-соединений и сертификатов безопасности.471472Кроме того, больше классов теперь реализуют [*менеджер контекста*](https://python-all.ru/3.4/glossary.html#term-context-manager) для поддержки удобной и надёжной очистки ресурсов с помощью оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with).473474### email475476Удобство использования пакета [`email`](https://python-all.ru/3.4/library/email.html#module-email) в Python 3 было в значительной степени восстановлено благодаря обширным усилиям Р. Дэвида Мюррея. Проблема заключалась в том, что электронные письма обычно читаются и хранятся в виде [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), а не [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) текста, и они могут содержать несколько кодировок в одном письме. Поэтому пакет email пришлось расширить для разбора и генерации сообщений в формате bytes.477478- Новые функции [`message_from_bytes()`](https://python-all.ru/3.4/library/email.parser.html#email.message_from_bytes) и [`message_from_binary_file()`](https://python-all.ru/3.4/library/email.parser.html#email.message_from_binary_file), а также новые классы [`BytesFeedParser`](https://python-all.ru/3.4/library/email.parser.html#email.parser.BytesFeedParser) и [`BytesParser`](https://python-all.ru/3.4/library/email.parser.html#email.parser.BytesParser) позволяют разбирать двоичные данные сообщений в объекты модели.479- При вводе байтов в модель [`get_payload()`](https://python-all.ru/3.4/library/email.message.html#email.message.Message.get_payload) по умолчанию будет декодировать тело сообщения с *Content-Transfer-Encoding* равным *8bit*, используя кодировку, указанную в MIME-заголовках, и вернёт результирующую строку.480- При вводе байтов в модель [`Generator`](https://python-all.ru/3.4/library/email.generator.html#email.generator.Generator) будет преобразовывать тела сообщений с *Content-Transfer-Encoding* равным *8bit*, чтобы вместо него использовалось *7bit* *Content-Transfer-Encoding*.481482  Заголовки с незакодированными не-ASCII байтами считаются закодированными по [**RFC 2047**](https://python-all.ru/3.4/whatsnew/3.2.html) с использованием набора символов *unknown-8bit*.483- Новый класс [`BytesGenerator`](https://python-all.ru/3.4/library/email.generator.html#email.generator.BytesGenerator) создаёт вывод в виде байтов, сохраняя любые неизменённые не-ASCII данные, присутствовавшие во входных данных, использованных для построения модели, включая тела сообщений с *Content-Transfer-Encoding* равным *8bit*.484- Класс [`smtplib`](https://python-all.ru/3.4/library/smtplib.html#module-smtplib) [`SMTP`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP) теперь принимает строку байтов в качестве аргумента *msg* для метода [`sendmail()`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP.sendmail), а новый метод [`send_message()`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP.send_message) принимает объект [`Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message) и может опционально получать адреса *from\_addr* и *to\_addrs* непосредственно из объекта.485486(Предложено и реализовано Р. Дэвидом Мюрреем, [issue 4661](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 10321](https://python-all.ru/3.4/whatsnew/3.2.html).)487488### elementtree489490Пакет [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) и его аналог `xml.etree.cElementTree` были обновлены до версии 1.3.491492Добавлено несколько новых полезных функций и методов:493494- [`xml.etree.ElementTree.fromstringlist()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstringlist) – строит XML-документ из последовательности фрагментов495- [`xml.etree.ElementTree.register_namespace()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace) для регистрации глобального префикса пространства имён496- [`xml.etree.ElementTree.tostringlist()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostringlist) для строкового представления, включающего все подсписки497- [`xml.etree.ElementTree.Element.extend()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.extend) для добавления последовательности из нуля или более элементов498- [`xml.etree.ElementTree.Element.iterfind()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind) ищет элемент и дочерние элементы499- [`xml.etree.ElementTree.Element.itertext()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext) создаёт итератор текста по элементу и его дочерним элементам500- [`xml.etree.ElementTree.TreeBuilder.end()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.end) закрывает текущий элемент501- [`xml.etree.ElementTree.TreeBuilder.doctype()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) обрабатывает объявление doctype502503Два метода устарели:504505- `xml.etree.ElementTree.getchildren()` используйте `list(elem)` вместо этого.506- `xml.etree.ElementTree.getiterator()` используйте `Element.iter` вместо этого.507508Подробнее об обновлении см. в статье [Introducing ElementTree](https://python-all.ru/3.4/whatsnew/3.2.html) на сайте Фредрика Лунда.509510(Предложено Florent Xicluna и Fredrik Lundh, [issue 6472](https://python-all.ru/3.4/whatsnew/3.2.html).)511512### functools513514- Модуль [`functools`](https://python-all.ru/3.4/library/functools.html#module-functools) включает новый декоратор для кэширования вызовов функций. [`functools.lru_cache()`](https://python-all.ru/3.4/library/functools.html#functools.lru_cache) позволяет сохранять результаты повторных запросов к внешнему ресурсу, если ожидается, что они будут одинаковыми.515516  Например, добавление декоратора кеширования к функции запроса к базе данных может сократить количество обращений к базе данных для популярных поисковых запросов:517518  ```python519  >>> import functools520  >>> @functools.lru_cache(maxsize=300)521  >>> def get_phone_number(name):522          c = conn.cursor()523          c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))524          return c.fetchone()[0]525  ```526527  ```python528  >>> for name in user_requests:529          get_phone_number(name)        # cached lookup530  ```531532  Чтобы помочь с выбором эффективного размера кеша, обёрнутая функция оснащается средствами отслеживания статистики кеша:533534  ```python535  >>> get_phone_number.cache_info()536  CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)537  ```538539  Если таблица phonelist обновляется, устаревшее содержимое кеша можно очистить с помощью:540541  ```python542  >>> get_phone_number.cache_clear()543  ```544545  (Предложено Raymond Hettinger с использованием идей дизайна от Jim Baker, Miki Tebeka и Nick Coghlan; см. [recipe 498245](https://python-all.ru/3.4/whatsnew/3.2.html), [recipe 577479](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 10586](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 10593](https://python-all.ru/3.4/whatsnew/3.2.html).)546- Декоратор [`functools.wraps()`](https://python-all.ru/3.4/library/functools.html#functools.wraps) теперь добавляет атрибут `__wrapped__`, указывающий на исходную вызываемую функцию. Это позволяет интроспектировать обёрнутые функции. Он также копирует `__annotations__`, если она определена. И теперь он корректно пропускает отсутствующие атрибуты, такие как `__doc__`, которые могут быть не определены для обёрнутой вызываемой функции.547548  В приведённом выше примере кеш можно удалить, восстановив исходную функцию:549550  ```python551  >>> get_phone_number = get_phone_number.__wrapped__    # некэшированная функция552  ```553554  (Авторы: Nick Coghlan и Terrence Cole; [issue 9567](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 3445](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 8814](https://python-all.ru/3.4/whatsnew/3.2.html).)555- Чтобы упростить написание классов с методами расширенного сравнения, новый декоратор [`functools.total_ordering()`](https://python-all.ru/3.4/library/functools.html#functools.total_ordering) использует существующие методы равенства и неравенства для заполнения остальных методов.556557  Например, указание *\_\_eq\_\_* и *\_\_lt\_\_* позволит [`total_ordering()`](https://python-all.ru/3.4/library/functools.html#functools.total_ordering) добавить *\_\_le\_\_*, *\_\_gt\_\_* и *\_\_ge\_\_*:558559  ```python560  @total_ordering561  class Student:562      def __eq__(self, other):563          return ((self.lastname.lower(), self.firstname.lower()) ==564                  (other.lastname.lower(), other.firstname.lower()))565      def __lt__(self, other):566          return ((self.lastname.lower(), self.firstname.lower()) <567                  (other.lastname.lower(), other.firstname.lower()))568  ```569570  С помощью декоратора *total\_ordering* остальные методы сравнения заполняются автоматически.571572  (Автор: Raymond Hettinger.)573- Чтобы облегчить перенос программ с Python 2, функция [`functools.cmp_to_key()`](https://python-all.ru/3.4/library/functools.html#functools.cmp_to_key) преобразует старую функцию сравнения в современную [*функцию ключа*](https://python-all.ru/3.4/glossary.html#term-key-function):574575  ```python576  >>> # порядок сортировки с учётом локали577  >>> sorted(iterable, key=cmp_to_key(locale.strcoll))578  ```579580  Примеры сортировки и краткое руководство по сортировке см. в руководстве [Sorting HowTo](https://python-all.ru/3.4/whatsnew/3.2.html).581582  (Автор: Raymond Hettinger.)583584### itertools585586- Модуль [`itertools`](https://python-all.ru/3.4/library/itertools.html#module-itertools) имеет новую функцию [`accumulate()`](https://python-all.ru/3.4/library/itertools.html#itertools.accumulate), созданную по образцу оператора *scan* из APL и функции *accumulate* из Numpy:587588  ```python589  >>> from itertools import accumulate590  >>> list(accumulate([8, 2, 50]))591  [8, 10, 60]592  ```593594  ```python595  >>> prob_dist = [0.1, 0.4, 0.2, 0.3]596  >>> list(accumulate(prob_dist))      # кумулятивное распределение вероятностей597  [0.1, 0.5, 0.7, 1.0]598  ```599600  Пример использования [`accumulate()`](https://python-all.ru/3.4/library/itertools.html#itertools.accumulate) см. в [*примерах для модуля random*](https://python-all.ru/3.4/library/random.html#random-examples).601602  (Автор: Raymond Hettinger с учётом предложений по дизайну от Mark Dickinson.)603604### collections605606- Класс [`collections.Counter`](https://python-all.ru/3.4/library/collections.html#collections.Counter) теперь имеет две формы вычитания на месте: существующий оператор *-=* для [насыщающего вычитания](https://python-all.ru/3.4/whatsnew/3.2.html) и новый метод [`subtract()`](https://python-all.ru/3.4/library/collections.html#collections.Counter.subtract) для обычного вычитания. Первый подходит для [мультимножеств](https://python-all.ru/3.4/whatsnew/3.2.html), которые имеют только положительные счётчики, а второй больше подходит для случаев, допускающих отрицательные счётчики:607608  ```python609  >>> tally = Counter(dogs=5, cat=3)610  >>> tally -= Counter(dogs=2, cats=8)    # насыщающее вычитание611  >>> tally612  Counter({'dogs': 3})613  ```614615  ```python616  >>> tally = Counter(dogs=5, cats=3)617  >>> tally.subtract(dogs=2, cats=8)      # обычное вычитание618  >>> tally619  Counter({'dogs': 3, 'cats': -5})620  ```621622  (Автор: Raymond Hettinger.)623- Класс [`collections.OrderedDict`](https://python-all.ru/3.4/library/collections.html#collections.OrderedDict) имеет новый метод [`move_to_end()`](https://python-all.ru/3.4/library/collections.html#collections.OrderedDict.move_to_end), который принимает существующий ключ и перемещает его в первую или последнюю позицию упорядоченной последовательности.624625  По умолчанию элемент перемещается в последнюю позицию. Это эквивалентно обновлению записи с помощью `od[k] = od.pop(k)`.626627  Быстрая операция перемещения в конец полезна для изменения порядка следования записей. Например, упорядоченный словарь можно использовать для отслеживания порядка доступа, упорядочивая записи от самых старых к самым недавно запрошенным.628629  ```python630  >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])631  >>> list(d)632  ['a', 'b', 'X', 'd', 'e']633  >>> d.move_to_end('X')634  >>> list(d)635  ['a', 'b', 'd', 'e', 'X']636  ```637638  (Автор: Raymond Hettinger.)639- Класс [`collections.deque`](https://python-all.ru/3.4/library/collections.html#collections.deque) получил два новых метода: [`count()`](https://python-all.ru/3.4/library/collections.html#collections.deque.count) и [`reverse()`](https://python-all.ru/3.4/library/collections.html#collections.deque.reverse), что делает их более взаимозаменяемыми с объектами [`list`](https://python-all.ru/3.4/library/stdtypes.html#list):640641  ```python642  >>> d = deque('simsalabim')643  >>> d.count('s')644  2645  >>> d.reverse()646  >>> d647  deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])648  ```649650  (Автор: Raymond Hettinger.)651652### threading653654Модуль [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) имеет новый класс синхронизации [`Barrier`](https://python-all.ru/3.4/library/threading.html#threading.Barrier), который заставляет несколько потоков ждать, пока все они не достигнут общей точки барьера. Барьеры полезны для того, чтобы задача с несколькими предусловиями не запускалась, пока все предшествующие задачи не будут завершены.655656Барьеры могут работать с произвольным числом потоков. Это обобщение механизма [рандеву](https://python-all.ru/3.4/whatsnew/3.2.html), который определён только для двух потоков.657658Реализованные как двухфазный циклический барьер, объекты [`Barrier`](https://python-all.ru/3.4/library/threading.html#threading.Barrier) подходят для использования в циклах. Отдельные фазы *заполнения* и *опустошения* гарантируют, что все потоки будут освобождены (опустошены) до того, как любой из них сможет вернуться и войти в барьер снова. Барьер полностью сбрасывается после каждого цикла.659660Пример использования барьеров:661662```python663from threading import Barrier, Thread664665def get_votes(site):666    ballots = conduct_election(site)667    all_polls_closed.wait()        # не подсчитывать, пока все голосования не закрыты668    totals = summarize(ballots)669    publish(site, totals)670671all_polls_closed = Barrier(len(sites))672for site in sites:673    Thread(target=get_votes, args=(site,)).start()674```675676В этом примере барьер обеспечивает правило, что голоса не могут быть подсчитаны на любом избирательном участке, пока все участки не закроются. Обратите внимание, что решение с барьером похоже на решение с [`threading.Thread.join()`](https://python-all.ru/3.4/library/threading.html#threading.Thread.join), но потоки остаются живыми и продолжают работать (подводить итоги голосования) после пересечения точки барьера.677678Если какая-либо из предшествующих задач может зависнуть или быть задержана, барьер можно создать с необязательным параметром *timeout*. Тогда, если время ожидания истечёт до того, как все предшествующие задачи достигнут точки барьера, все ожидающие потоки освобождаются и возбуждается исключение [`BrokenBarrierError`](https://python-all.ru/3.4/library/threading.html#threading.BrokenBarrierError):679680```python681def get_votes(site):682    ballots = conduct_election(site)683    try:684        all_polls_closed.wait(timeout = midnight - time.now())685    except BrokenBarrierError:686        lockbox = seal_ballots(ballots)687        queue.put(lockbox)688    else:689        totals = summarize(ballots)690        publish(site, totals)691```692693В этом примере барьер обеспечивает более надежное правило. Если некоторые избирательные участки не заканчивают работу до полуночи, барьер срабатывает по тайм-ауту, и бюллетени опечатываются и помещаются в очередь для последующей обработки.694695Смотрите [Barrier Synchronization Patterns](https://python-all.ru/3.4/whatsnew/3.2.html) для получения дополнительных примеров использования барьеров в параллельных вычислениях. Кроме того, простое и подробное объяснение барьеров приведено в [The Little Book of Semaphores](https://python-all.ru/3.4/whatsnew/3.2.html), *раздел 3.6*.696697(Предложено Kristján Valur Jónsson с проверкой API от Jeffrey Yasskin в [issue 8777](https://python-all.ru/3.4/whatsnew/3.2.html).)698699### datetime and time700701- Модуль [`datetime`](https://python-all.ru/3.4/library/datetime.html#module-datetime) теперь имеет новый тип [`timezone`](https://python-all.ru/3.4/library/datetime.html#datetime.timezone), который реализует интерфейс [`tzinfo`](https://python-all.ru/3.4/library/datetime.html#datetime.tzinfo), возвращая фиксированное смещение UTC и название часового пояса. Это упрощает создание объектов datetime с учётом часового пояса:702703  ```python704  >>> from datetime import datetime, timezone705706  >>> datetime.now(timezone.utc)707  datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)708709  >>> datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")710  datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)711  ```712- Кроме того, объекты [`timedelta`](https://python-all.ru/3.4/library/datetime.html#datetime.timedelta) теперь можно умножать на [`float`](https://python-all.ru/3.4/library/functions.html#float) и делить на [`float`](https://python-all.ru/3.4/library/functions.html#float) и [`int`](https://python-all.ru/3.4/library/functions.html#int). И объекты [`timedelta`](https://python-all.ru/3.4/library/datetime.html#datetime.timedelta) теперь можно делить друг на друга.713- Метод [`datetime.date.strftime()`](https://python-all.ru/3.4/library/datetime.html#datetime.date.strftime) больше не ограничен годами после 1900. Новый поддерживаемый диапазон лет – от 1000 до 9999 включительно.714- Всякий раз, когда в кортеже времени используется двузначный год, его интерпретация определялась `time.accept2dyear`. Значение по умолчанию – *True*, что означает, что для двузначного года век определяется по правилам POSIX, управляющим форматом strptime `%y`.715716  Начиная с Py3.2, использование эвристики определения века будет выдавать [`DeprecationWarning`](https://python-all.ru/3.4/library/exceptions.html#DeprecationWarning). Вместо этого рекомендуется установить `time.accept2dyear` в *False*, чтобы можно было использовать большие диапазоны дат без догадок:717718  ```python719  >>> import time, warnings720  >>> warnings.resetwarnings()      # удалить фильтры предупреждений по умолчанию721722  >>> time.accept2dyear = True      # угадать, означает ли 11 число 11 или 2011723  >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))724  Warning (from warnings module):725    ...726  DeprecationWarning: Century info guessed for a 2-digit year.727  'Fri Jan  1 12:34:56 2011'728729  >>> time.accept2dyear = False     # использовать полный диапазон допустимых дат730  >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))731  'Fri Jan  1 12:34:56 11'732  ```733734  Несколько функций теперь имеют значительно расширенные диапазоны дат. Когда `time.accept2dyear` равно false, функция [`time.asctime()`](https://python-all.ru/3.4/library/time.html#time.asctime) будет принимать любой год, помещающийся в int в C, в то время как функции [`time.mktime()`](https://python-all.ru/3.4/library/time.html#time.mktime) и [`time.strftime()`](https://python-all.ru/3.4/library/time.html#time.strftime) будут принимать полный диапазон, поддерживаемый соответствующими функциями операционной системы.735736(Предложено Александром Белопольским и Виктором Штиннером в [выпуске 1289118](https://python-all.ru/3.4/whatsnew/3.2.html), [выпуске 5094](https://python-all.ru/3.4/whatsnew/3.2.html), [выпуске 6641](https://python-all.ru/3.4/whatsnew/3.2.html), [выпуске 2706](https://python-all.ru/3.4/whatsnew/3.2.html), [выпуске 1777412](https://python-all.ru/3.4/whatsnew/3.2.html), [выпуске 8013](https://python-all.ru/3.4/whatsnew/3.2.html), и [выпуске 10827](https://python-all.ru/3.4/whatsnew/3.2.html).)737738### math739740Модуль [`math`](https://python-all.ru/3.4/library/math.html#module-math) был обновлён и теперь содержит шесть новых функций, вдохновлённых стандартом C99.741742Функция [`isfinite()`](https://python-all.ru/3.4/library/math.html#math.isfinite) предоставляет надёжный и быстрый способ обнаружения особых значений. Она возвращает *True* для обычных чисел и *False* для *Nan* или *Infinity*:743744```python745>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]746[True, True, False, False]747```748749Функция [`expm1()`](https://python-all.ru/3.4/library/math.html#math.expm1) вычисляет `e**x-1` для малых значений *x* без потери точности, которая обычно сопровождает вычитание почти равных величин:750751```python752>>> expm1(0.013671875)   # более точный способ вычисления e**x-1 для малых x7530.013765762467652909754```755756Функция [`erf()`](https://python-all.ru/3.4/library/math.html#math.erf) вычисляет интеграл вероятности или [функцию ошибок Гаусса](https://python-all.ru/3.4/whatsnew/3.2.html). Дополнительная функция ошибок, [`erfc()`](https://python-all.ru/3.4/library/math.html#math.erfc), равна `1 - erf(x)`:757758```python759>>> erf(1.0/sqrt(2.0))   # доля нормального распределения в пределах одного стандартного отклонения7600.682689492137086761>>> erfc(1.0/sqrt(2.0))  # доля нормального распределения за пределами одного стандартного отклонения7620.31731050786291404763>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))7641.0765```766767Функция [`gamma()`](https://python-all.ru/3.4/library/math.html#math.gamma) является непрерывным расширением факториала. Подробнее см. [http://en.wikipedia.org/wiki/Gamma\_function](https://python-all.ru/3.4/whatsnew/3.2.html). Поскольку функция связана с факториалами, она быстро растёт даже при малых значениях *x*, поэтому существует также функция [`lgamma()`](https://python-all.ru/3.4/library/math.html#math.lgamma) для вычисления натурального логарифма гамма-функции:768769```python770>>> gamma(7.0)           # шесть факториал771720.0772>>> lgamma(801.0)        # логарифм факториала 8007734551.950730698041774```775776(Автор: Mark Dickinson.)777778### abc779780Модуль [`abc`](https://python-all.ru/3.4/library/abc.html#module-abc) теперь поддерживает [`abstractclassmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractclassmethod) и [`abstractstaticmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractstaticmethod).781782Эти инструменты позволяют определить [*абстрактный базовый класс*](https://python-all.ru/3.4/glossary.html#term-abstract-base-class), который требует реализации определённого [`classmethod()`](https://python-all.ru/3.4/library/functions.html#classmethod) или [`staticmethod()`](https://python-all.ru/3.4/library/functions.html#staticmethod):783784```python785class Temperature(metaclass=abc.ABCMeta):786    @abc.abstractclassmethod787    def from_fahrenheit(cls, t):788        ...789    @abc.abstractclassmethod790    def from_celsius(cls, t):791        ...792```793794(Патч предоставлен Дэниелом Урбаном; [выпуск 5867](https://python-all.ru/3.4/whatsnew/3.2.html).)795796### io797798У [`io.BytesIO`](https://python-all.ru/3.4/library/io.html#io.BytesIO) появился новый метод [`getbuffer()`](https://python-all.ru/3.4/library/io.html#io.BytesIO.getbuffer), который предоставляет функциональность, аналогичную [`memoryview()`](https://python-all.ru/3.4/library/stdtypes.html#memoryview). Он создаёт редактируемое представление данных без создания копии. Произвольный доступ к буферу и поддержка срезов хорошо подходят для редактирования на месте:799800```python801>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11802803>>> def change_location(buffer, record_number, location):804        start = record_number * REC_LEN + LOC_START805        buffer[start: start+LOC_LEN] = location806807>>> import io808809>>> byte_stream = io.BytesIO(810    b'G3805  storeroom  Main chassis    '811    b'X7899  shipping   Reserve cog     '812    b'L6988  receiving  Primary sprocket'813)814>>> buffer = byte_stream.getbuffer()815>>> change_location(buffer, 1, b'warehouse  ')816>>> change_location(buffer, 0, b'showroom   ')817>>> print(byte_stream.getvalue())818b'G3805  showroom   Main chassis    '819b'X7899  warehouse  Reserve cog     '820b'L6988  receiving  Primary sprocket'821```822823(Предложено Антуаном Питру в [выпуске 5506](https://python-all.ru/3.4/whatsnew/3.2.html).)824825### reprlib826827При написании метода [`__repr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__repr__) для пользовательского контейнера легко забыть обработать случай, когда элемент ссылается обратно на сам контейнер. Встроенные объекты Python, такие как [`list`](https://python-all.ru/3.4/library/stdtypes.html#list) и [`set`](https://python-all.ru/3.4/library/stdtypes.html#set), обрабатывают самоссылки, отображая ”...” в рекурсивной части строки представления.828829Чтобы упростить написание таких методов [`__repr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__repr__), в модуле [`reprlib`](https://python-all.ru/3.4/library/reprlib.html#module-reprlib) появился новый декоратор [`recursive_repr()`](https://python-all.ru/3.4/library/reprlib.html#reprlib.recursive_repr) для обнаружения рекурсивных вызовов [`__repr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__repr__) и подстановки вместо них строки-заполнителя:830831```python832>>> class MyList(list):833        @recursive_repr()834        def __repr__(self):835            return '<' + '|'.join(map(repr, self)) + '>'836837>>> m = MyList('abc')838>>> m.append(m)839>>> m.append('x')840>>> print(m)841<'a'|'b'|'c'|...|'x'>842```843844(Предложено Рэймондом Хеттингером в [выпуске 9826](https://python-all.ru/3.4/whatsnew/3.2.html) и [выпуске 9840](https://python-all.ru/3.4/whatsnew/3.2.html).)845846### logging847848В дополнение к описанной выше конфигурации на основе словаря пакет [`logging`](https://python-all.ru/3.4/library/logging.html#module-logging) содержит множество других улучшений.849850Документация по logging была дополнена [*базовым руководством*](https://python-all.ru/3.4/howto/logging.html#logging-basic-tutorial), [*продвинутым руководством*](https://python-all.ru/3.4/howto/logging.html#logging-advanced-tutorial) и [*поваренной книгой*](https://python-all.ru/3.4/howto/logging-cookbook.html#logging-cookbook) с рецептами логирования. Эти документы – самый быстрый способ изучить логирование.851852Функция настройки [`logging.basicConfig()`](https://python-all.ru/3.4/library/logging.html#logging.basicConfig) получила аргумент *style* для поддержки трёх различных типов форматирования строк. По умолчанию используется “%” для традиционного %-форматирования, может быть установлено “{” для нового стиля [`str.format()`](https://python-all.ru/3.4/library/stdtypes.html#str.format), или “$” для форматирования в стиле оболочки, предоставляемого [`string.Template`](https://python-all.ru/3.4/library/string.html#string.Template). Следующие три конфигурации эквивалентны:853854```python855>>> from logging import basicConfig856>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")857>>> basicConfig(style='{', format="{name} -> {levelname} {message}")858>>> basicConfig(style='$', format="$name -> $levelname: $message")859```860861Если до возникновения события логирования не задана конфигурация, теперь используется конфигурация по умолчанию с [`StreamHandler`](https://python-all.ru/3.4/library/logging.handlers.html#logging.StreamHandler), направленным в [`sys.stderr`](https://python-all.ru/3.4/library/sys.html#sys.stderr), для событий уровня `WARNING` и выше. Ранее событие, возникшее до настройки конфигурации, либо вызывало исключение, либо молча отбрасывалось в зависимости от значения `logging.raiseExceptions`. Новый обработчик по умолчанию хранится в [`logging.lastResort`](https://python-all.ru/3.4/library/logging.html#logging.lastResort).862863Использование фильтров было упрощено. Вместо создания объекта [`Filter`](https://python-all.ru/3.4/library/logging.html#logging.Filter) предикатом может быть любой вызываемый объект Python, возвращающий *True* или *False*.864865Было сделано множество других улучшений, повышающих гибкость и упрощающих конфигурацию. Полный список изменений в Python 3.2 смотрите в документации модуля.866867### csv868869Модуль [`csv`](https://python-all.ru/3.4/library/csv.html#module-csv) теперь поддерживает новый диалект, [`unix_dialect`](https://python-all.ru/3.4/library/csv.html#csv.unix_dialect), который применяет кавычки для всех полей и использует традиционный стиль Unix с `'\n'` в качестве разделителя строк. Зарегистрированное имя диалекта – `unix`.870871У [`csv.DictWriter`](https://python-all.ru/3.4/library/csv.html#csv.DictWriter) появился новый метод [`writeheader()`](https://python-all.ru/3.4/library/csv.html#csv.DictWriter.writeheader) для записи начальной строки с названиями полей:872873```python874>>> import csv, sys875>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')876>>> w.writeheader()877"name","dept"878>>> w.writerows([879        {'name': 'tom', 'dept': 'accounting'},880        {'name': 'susan', 'dept': 'Salesl'}])881"tom","accounting"882"susan","sales"883```884885(Новый диалект предложен Джеем Талботом в [выпуске 5975](https://python-all.ru/3.4/whatsnew/3.2.html), а новый метод предложен Эдом Абрахамом в [выпуске 1537721](https://python-all.ru/3.4/whatsnew/3.2.html).)886887### contextlib888889Появился новый и немного умопомрачительный инструмент [`ContextDecorator`](https://python-all.ru/3.4/library/contextlib.html#contextlib.ContextDecorator), который полезен для создания [*менеджера контекста*](https://python-all.ru/3.4/glossary.html#term-context-manager), выполняющего двойную роль декоратора функции.890891Для удобства эта новая функциональность используется [`contextmanager()`](https://python-all.ru/3.4/library/contextlib.html#contextlib.contextmanager), поэтому не требуется дополнительных усилий для поддержки обеих ролей.892893Основная идея в том, что и менеджеры контекста, и декораторы функций могут использоваться для обёрток до и после действия. Менеджеры контекста оборачивают группу инструкций с помощью оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), а декораторы функций оборачивают группу инструкций, заключённых в функцию. Поэтому иногда возникает необходимость написать обёртку до или после действия, которую можно использовать в любой роли.894895Например, иногда полезно оборачивать функции или группы инструкций логгером, который может отслеживать время входа и время выхода. Вместо того чтобы писать и декоратор функции, и менеджер контекста для этой задачи, [`contextmanager()`](https://python-all.ru/3.4/library/contextlib.html#contextlib.contextmanager) предоставляет обе возможности в одном определении:896897```python898from contextlib import contextmanager899import logging900901logging.basicConfig(level=logging.INFO)902903@contextmanager904def track_entry_and_exit(name):905    logging.info('Entering: {}'.format(name))906    yield907    logging.info('Exiting: {}'.format(name))908```909910Ранее это можно было использовать только как менеджер контекста:911912```python913with track_entry_and_exit('widget loader'):914    print('Some time consuming activity goes here')915    load_widget()916```917918Теперь его можно использовать и как декоратор:919920```python921@track_entry_and_exit('widget loader')922def activity():923    print('Some time consuming activity goes here')924    load_widget()925```926927Попытка выполнять две роли одновременно накладывает некоторые ограничения на технику. Менеджеры контекста обычно имеют возможность возвращать аргумент, используемый оператором [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), но для декораторов функций такой аналогии нет.928929В приведённом выше примере нет чистого способа для менеджера контекста *track\_entry\_and\_exit* вернуть экземпляр логгера для использования в теле вложенных операторов.930931(Предложено Майклом Фордом в [выпуске 9110](https://python-all.ru/3.4/whatsnew/3.2.html).)932933### decimal and fractions934935Марк Дикинсон разработал элегантную и эффективную схему, гарантирующую, что разные числовые типы данных будут иметь одинаковое хэш-значение всякий раз, когда их фактические значения равны ([выпуск 8188](https://python-all.ru/3.4/whatsnew/3.2.html)):936937```python938assert hash(Fraction(3, 2)) == hash(1.5) == \939       hash(Decimal("1.5")) == hash(complex(1.5, 0))940```941942Некоторые детали хэширования раскрываются через новый атрибут [`sys.hash_info`](https://python-all.ru/3.4/library/sys.html#sys.hash_info), который описывает разрядность хэш-значения, простой модуль, хэш-значения для *бесконечности* и *nan*, а также множитель, используемый для мнимой части числа:943944```python945>>> sys.hash_info946sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)947```948949Раннее решение ограничить совместимость различных числовых типов было смягчено. По-прежнему не поддерживается (и не рекомендуется) неявное смешивание в арифметических выражениях, таких как `Decimal('1.1') + float('1.1')`, поскольку последнее теряет информацию в процессе построения двоичного числа с плавающей точкой. Однако, поскольку существующее значение с плавающей точкой может быть без потерь преобразовано в десятичное или рациональное представление, имеет смысл добавить их в конструктор и поддерживать сравнения смешанных типов.950951- Конструктор [`decimal.Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal) теперь принимает объекты [`float`](https://python-all.ru/3.4/library/functions.html#float) напрямую, поэтому больше нет необходимости использовать метод [`from_float()`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal.from_float) ([выпуск 8257](https://python-all.ru/3.4/whatsnew/3.2.html)).952- Сравнения смешанных типов теперь полностью поддерживаются, так что объекты [`Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal) можно напрямую сравнивать с [`float`](https://python-all.ru/3.4/library/functions.html#float) и [`fractions.Fraction`](https://python-all.ru/3.4/library/fractions.html#fractions.Fraction) ([выпуск 2531](https://python-all.ru/3.4/whatsnew/3.2.html) и [выпуск 8188](https://python-all.ru/3.4/whatsnew/3.2.html)).953954Аналогичные изменения были внесены в [`fractions.Fraction`](https://python-all.ru/3.4/library/fractions.html#fractions.Fraction), поэтому методы [`from_float()`](https://python-all.ru/3.4/library/fractions.html#fractions.Fraction.from_float) и [`from_decimal()`](https://python-all.ru/3.4/library/fractions.html#fractions.Fraction.from_decimal) больше не нужны ([issue 8294](https://python-all.ru/3.4/whatsnew/3.2.html)):955956```python957>>> Decimal(1.1)958Decimal('1.100000000000000088817841970012523233890533447265625')959>>> Fraction(1.1)960Fraction(2476979795053773, 2251799813685248)961```962963Ещё одно полезное изменение для модуля [`decimal`](https://python-all.ru/3.4/library/decimal.html#module-decimal) заключается в том, что атрибут `Context.clamp` теперь стал общедоступным. Это полезно для создания контекстов, соответствующих форматам обмена десятичными числами, определённым в IEEE 754 (см. [issue 8540](https://python-all.ru/3.4/whatsnew/3.2.html)).964965(Авторы: Mark Dickinson и Raymond Hettinger.)966967### ftp968969Класс [`ftplib.FTP`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP) теперь поддерживает протокол управления контекстом для безусловного перехвата исключений [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error) и закрытия FTP-соединения по завершении:970971```python972>>> from ftplib import FTP973>>> with FTP("ftp1.at.proftpd.org") as ftp:974        ftp.login()975        ftp.dir()976977'230 Anonymous login ok, restrictions apply.'978dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .979dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..980dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS981dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora982```983984Other file-like objects such as [`mmap.mmap`](https://python-all.ru/3.4/library/mmap.html#mmap.mmap) and [`fileinput.input()`](https://python-all.ru/3.4/library/fileinput.html#fileinput.input) also grew auto-closing context managers:985986```python987with fileinput.input(files=('log1.txt', 'log2.txt')) as f:988    for line in f:989        process(line)990```991992(Авторы: Tarek Ziadé и Giampaolo Rodolà ([issue 4972](https://python-all.ru/3.4/whatsnew/3.2.html)), а также Georg Brandl ([issue 8046](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 1286](https://python-all.ru/3.4/whatsnew/3.2.html)).)993994Класс [`FTP_TLS`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP_TLS) теперь принимает параметр *context*, который является объектом [`ssl.SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), позволяющим объединять параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру.995996(Автор: Giampaolo Rodolà; [issue 8806](https://python-all.ru/3.4/whatsnew/3.2.html).)997998### popen9991000Функции [`os.popen()`](https://python-all.ru/3.4/library/os.html#os.popen) и [`subprocess.Popen()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) теперь поддерживают оператор [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) для автоматического закрытия файловых дескрипторов.10011002(Авторы: Antoine Pitrou и Brian Curtin в [issue 7461](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 10554](https://python-all.ru/3.4/whatsnew/3.2.html).)10031004### select10051006Модуль [`select`](https://python-all.ru/3.4/library/select.html#module-select) теперь предоставляет новый постоянный атрибут [`PIPE_BUF`](https://python-all.ru/3.4/library/select.html#select.PIPE_BUF), который указывает минимальное количество байтов, гарантированно не вызывающих блокировку, когда [`select.select()`](https://python-all.ru/3.4/library/select.html#select.select) сообщает, что канал готов к записи.10071008```python1009>>> import select1010>>> select.PIPE_BUF10115121012```10131014(Доступно в Unix-системах. Патч от Sébastien Sablé в [issue 9862](https://python-all.ru/3.4/whatsnew/3.2.html))10151016### gzip и zipfile10171018[`gzip.GzipFile`](https://python-all.ru/3.4/library/gzip.html#gzip.GzipFile) теперь реализует [`io.BufferedIOBase`](https://python-all.ru/3.4/library/io.html#io.BufferedIOBase) [*абстрактный базовый класс*](https://python-all.ru/3.4/glossary.html#term-abstract-base-class) (за исключением `truncate()`). Он также имеет метод [`peek()`](https://python-all.ru/3.4/library/gzip.html#gzip.GzipFile.peek) и поддерживает непозиционируемые и дополненные нулями файловые объекты.10191020Модуль [`gzip`](https://python-all.ru/3.4/library/gzip.html#module-gzip) также обзавёлся функциями [`compress()`](https://python-all.ru/3.4/library/gzip.html#gzip.compress) и [`decompress()`](https://python-all.ru/3.4/library/gzip.html#gzip.decompress) для более удобного сжатия и распаковки в памяти. Имейте в виду, что текст должен быть закодирован как [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) перед сжатием и распаковкой:10211022```python1023>>> s = 'Three shall be the number thou shalt count, '1024>>> s += 'and the number of the counting shall be three'1025>>> b = s.encode()                        # преобразовать в utf-81026>>> len(b)1027891028>>> c = gzip.compress(b)1029>>> len(c)1030771031>>> gzip.decompress(c).decode()[:42]      # распаковать и преобразовать в текст1032'Three shall be the number thou shalt count,'1033```10341035(Авторы: Anand B. Pillai ([issue 3488](https://python-all.ru/3.4/whatsnew/3.2.html)); а также Antoine Pitrou, Nir Aides и Brian Curtin ([issue 9962](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 1675951](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 7471](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 2846](https://python-all.ru/3.4/whatsnew/3.2.html)).)10361037Кроме того, класс `zipfile.ZipExtFile` был внутренне переработан для представления файлов, хранящихся в архиве. Новая реализация значительно быстрее и может быть обёрнута в объект [`io.BufferedReader`](https://python-all.ru/3.4/library/io.html#io.BufferedReader) для дополнительного ускорения. Она также решает проблему, когда чередующиеся вызовы *read* и *readline* давали неверные результаты.10381039(Патч предоставлен Nir Aides в [issue 7610](https://python-all.ru/3.4/whatsnew/3.2.html).)10401041### tarfile10421043Класс [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) теперь можно использовать как менеджер контекста. Кроме того, его метод [`add()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.add) получил новую опцию *filter*, которая управляет тем, какие файлы добавляются в архив, и позволяет редактировать метаданные файлов.10441045Новая опция *filter* заменяет старый, менее гибкий параметр *exclude*, который теперь считается устаревшим. Если указан, необязательный параметр *filter* должен быть [*именованным аргументом*](https://python-all.ru/3.4/glossary.html#term-keyword-argument). Предоставленная пользователем функция фильтрации принимает объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) и возвращает обновлённый объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo); если файл нужно исключить, функция может вернуть *None*:10461047```python1048>>> import tarfile, glob10491050>>> def myfilter(tarinfo):1051       if tarinfo.isfile():             # only save real files1052            tarinfo.uname = 'monty'     # redact the user name1053            return tarinfo10541055>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:1056        for filename in glob.glob('*.txt'):1057            tf.add(filename, filter=myfilter)1058        tf.list()1059-rw-r--r-- monty/501        902 2011-01-26 17:59:11 annotations.txt1060-rw-r--r-- monty/501        123 2011-01-26 17:59:11 general_questions.txt1061-rw-r--r-- monty/501       3514 2011-01-26 17:59:11 prion.txt1062-rw-r--r-- monty/501        124 2011-01-26 17:59:11 py_todo.txt1063-rw-r--r-- monty/501       1399 2011-01-26 17:59:11 semaphore_notes.txt1064```10651066(Предложено Tarek Ziadé, реализовано Lars Gustäbel в [issue 6856](https://python-all.ru/3.4/whatsnew/3.2.html).)10671068### hashlib10691070Модуль [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib) имеет два новых постоянных атрибута, перечисляющих алгоритмы хеширования, которые гарантированно присутствуют во всех реализациях, и те, что доступны в текущей реализации:10711072```python1073>>> import hashlib10741075>>> hashlib.algorithms_guaranteed1076{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}10771078>>> hashlib.algorithms_available1079{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',1080'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',1081'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',1082'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}1083```10841085(Предложено Carl Chenet в [issue 7418](https://python-all.ru/3.4/whatsnew/3.2.html).)10861087### ast10881089Модуль [`ast`](https://python-all.ru/3.4/library/ast.html#module-ast) содержит замечательный универсальный инструмент для безопасного вычисления строк выражений с использованием синтаксиса литералов Python. Функция [`ast.literal_eval()`](https://python-all.ru/3.4/library/ast.html#ast.literal_eval) служит безопасной альтернативой встроенной функции [`eval()`](https://python-all.ru/3.4/library/functions.html#eval), которой легко злоупотребить. Python 3.2 добавляет литералы [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) в список поддерживаемых типов: строки, байты, числа, кортежи, списки, словари, множества, булевы значения и None.10901091```python1092>>> from ast import literal_eval10931094>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"1095>>> literal_eval(request)1096{'args': (2, 0.5), 'req': 3, 'func': 'pow'}10971098>>> request = "os.system('do something harmful')"1099>>> literal_eval(request)1100Traceback (most recent call last):1101  ...1102ValueError: malformed node or string: <_ast.Call object at 0x101739a10>1103```11041105(Реализовано Бенджамином Петерсоном и Георгом Брандлем.)11061107### os11081109В разных операционных системах используются различные кодировки для имён файлов и переменных окружения. Модуль [`os`](https://python-all.ru/3.4/library/os.html#module-os) предоставляет две новые функции, [`fsencode()`](https://python-all.ru/3.4/library/os.html#os.fsencode) и [`fsdecode()`](https://python-all.ru/3.4/library/os.html#os.fsdecode), для кодирования и декодирования имён файлов:11101111```python1112>>> filename = 'Sehenswürdigkeiten'1113>>> os.fsencode(filename)1114b'Sehensw\xc3\xbcrdigkeiten'1115```11161117Некоторые операционные системы разрешают прямой доступ к закодированным байтам в окружении. В таком случае константа [`os.supports_bytes_environ`](https://python-all.ru/3.4/library/os.html#os.supports_bytes_environ) будет равна true.11181119For direct access to encoded environment variables (if available), use the new [`os.getenvb()`](https://python-all.ru/3.4/library/os.html#os.getenvb) function or use [`os.environb`](https://python-all.ru/3.4/library/os.html#os.environb) which is a bytes version of [`os.environ`](https://python-all.ru/3.4/library/os.html#os.environ).11201121(Автор: Victor Stinner.)11221123### shutil11241125Функция [`shutil.copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree) получила две новые опции:11261127- *ignore\_dangling\_symlinks*: когда `symlinks=False`, функция копирует файл, на который указывает символическая ссылка, а не саму ссылку. Эта опция подавляет ошибку, возникающую, если файл не существует.1128- *copy\_function*: вызываемый объект, который будет использоваться для копирования файлов. По умолчанию используется [`shutil.copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2).11291130(Автор: Tarek Ziadé.)11311132Кроме того, модуль [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) теперь поддерживает [*операции архивирования*](https://python-all.ru/3.4/library/shutil.html#archiving-operations) для файлов ZIP, несжатых файлов TAR, а также файлов TAR, сжатых с помощью gzip и bzip2. Также есть функции для регистрации дополнительных форматов архивов (например, файлов TAR, сжатых с помощью xz, или пользовательских форматов).11331134Основными функциями являются [`make_archive()`](https://python-all.ru/3.4/library/shutil.html#shutil.make_archive) и [`unpack_archive()`](https://python-all.ru/3.4/library/shutil.html#shutil.unpack_archive). По умолчанию обе работают с текущим каталогом (который можно задать с помощью [`os.chdir()`](https://python-all.ru/3.4/library/os.html#os.chdir)) и со всеми подкаталогами. Имя файла архива должно быть указано с полным путём. Операция архивирования не является разрушительной (исходные файлы остаются без изменений).11351136```python1137>>> import shutil, pprint11381139>>> os.chdir('mydata')                               # перейти в каталог исходного кода1140>>> f = shutil.make_archive('/var/backup/mydata',1141                            'zip')                   # archive the current directory1142>>> f                                                # показать имя архива1143'/var/backup/mydata.zip'1144>>> os.chdir('tmp')                                  # перейти к распаковке1145>>> shutil.unpack_archive('/var/backup/mydata.zip')  # восстановить данные11461147>>> pprint.pprint(shutil.get_archive_formats())      # отобразить известные форматы1148[('bztar', "bzip2'ed tar-file"),1149 ('gztar', "gzip'ed tar-file"),1150 ('tar', 'uncompressed tar file'),1151 ('zip', 'ZIP file')]11521153>>> shutil.register_archive_format(                  # зарегистрировать новый формат архива1154        name = 'xz',1155        function = xz.compress,                      # callable archiving function1156        extra_args = [('level', 8)],                 # arguments to the function1157        description = 'xz compression'1158)1159```11601161(Автор: Tarek Ziadé.)11621163### sqlite311641165Модуль [`sqlite3`](https://python-all.ru/3.4/library/sqlite3.html#module-sqlite3) был обновлён до версии pysqlite 2.6.0. У него появились две новые возможности.11661167- Атрибут `sqlite3.Connection.in_transit` равен true, если есть активная транзакция с незафиксированными изменениями.1168- Методы [`sqlite3.Connection.enable_load_extension()`](https://python-all.ru/3.4/library/sqlite3.html#sqlite3.Connection.enable_load_extension) и [`sqlite3.Connection.load_extension()`](https://python-all.ru/3.4/library/sqlite3.html#sqlite3.Connection.load_extension) позволяют загружать расширения SQLite из файлов ”.so”. Одно из известных расширений – это расширение полнотекстового поиска, распространяемое вместе с SQLite.11691170(Авторы: R. David Murray и Shashwat Anand; [issue 8845](https://python-all.ru/3.4/whatsnew/3.2.html).)11711172### html11731174Был добавлен новый модуль [`html`](https://python-all.ru/3.4/library/html.html#module-html) с единственной функцией [`escape()`](https://python-all.ru/3.4/library/html.html#html.escape), которая используется для экранирования зарезервированных символов в HTML-разметке:11751176```python1177>>> import html1178>>> html.escape('x > 2 && x < 7')1179'x &gt; 2 &amp;&amp; x &lt; 7'1180```11811182### socket11831184В модуле [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) появилось два улучшения.11851186- У объектов сокетов теперь есть метод [`detach()`](https://python-all.ru/3.4/library/socket.html#socket.socket.detach), который переводит сокет в закрытое состояние без фактического закрытия нижележащего файлового дескриптора. Последний затем можно использовать повторно для других целей. (Добавлено Antoine Pitrou; [issue 8524](https://python-all.ru/3.4/whatsnew/3.2.html).)1187- [`socket.create_connection()`](https://python-all.ru/3.4/library/socket.html#socket.create_connection) теперь поддерживает протокол менеджера контекста, чтобы безусловно перехватывать исключения [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error) и закрывать сокет по завершении. (Автор: Giampaolo Rodolà; [issue 9794](https://python-all.ru/3.4/whatsnew/3.2.html).)11881189### ssl11901191Модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl) добавил ряд возможностей для удовлетворения общих требований безопасных (шифрованных, аутентифицированных) интернет-соединений:11921193- Новый класс [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) служит контейнером для постоянных данных SSL, таких как настройки протокола, сертификаты, закрытые ключи и различные другие параметры. Он включает метод [`wrap_socket()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.wrap_socket) для создания SSL-сокета из SSL-контекста.1194- Новая функция [`ssl.match_hostname()`](https://python-all.ru/3.4/library/ssl.html#ssl.match_hostname) поддерживает проверку подлинности сервера для протоколов более высокого уровня, реализуя правила HTTPS (из [**RFC 2818**](https://python-all.ru/3.4/whatsnew/3.2.html)), которые также подходят для других протоколов.1195- Функция-конструктор [`ssl.wrap_socket()`](https://python-all.ru/3.4/library/ssl.html#ssl.wrap_socket) теперь принимает аргумент *ciphers*. Строка *ciphers* перечисляет разрешённые алгоритмы шифрования в формате, описанном в [документации OpenSSL](https://python-all.ru/3.4/whatsnew/3.2.html).1196- При сборке с новыми версиями OpenSSL модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl) теперь поддерживает расширение Server Name Indication протокола TLS, позволяющее использовать несколько «виртуальных хостов» с разными сертификатами на одном IP-порту. Это расширение поддерживается только в режиме клиента и активируется передачей аргумента *server\_hostname* в [`ssl.SSLContext.wrap_socket()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.wrap_socket).1197- В модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl) были добавлены различные параметры, такие как [`OP_NO_SSLv2`](https://python-all.ru/3.4/library/ssl.html#ssl.OP_NO_SSLv2), который отключает небезопасный и устаревший протокол SSLv2.1198- Расширение теперь загружает все шифры и алгоритмы дайджестов OpenSSL. Если некоторые SSL-сертификаты не удаётся проверить, они сообщаются как ошибка «неизвестный алгоритм».1199- Версию используемой OpenSSL теперь можно получить через атрибуты модуля [`ssl.OPENSSL_VERSION`](https://python-all.ru/3.4/library/ssl.html#ssl.OPENSSL_VERSION) (строка), [`ssl.OPENSSL_VERSION_INFO`](https://python-all.ru/3.4/library/ssl.html#ssl.OPENSSL_VERSION_INFO) (кортеж из 5 элементов) и [`ssl.OPENSSL_VERSION_NUMBER`](https://python-all.ru/3.4/library/ssl.html#ssl.OPENSSL_VERSION_NUMBER) (целое число).12001201(Автор: Antoine Pitrou; [issue 8850](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 1589](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 8322](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 5639](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 4870](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 8484](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 8321](https://python-all.ru/3.4/whatsnew/3.2.html).)12021203### nntp12041205Модуль [`nntplib`](https://python-all.ru/3.4/library/nntplib.html#module-nntplib) получил переработанную реализацию с улучшенной семантикой байтов и текста, а также более практичными API. Эти улучшения нарушают совместимость с версией nntplib в Python 3.1, которая сама по себе была частично неработоспособной.12061207Также была добавлена поддержка безопасных соединений как через неявный (с помощью [`nntplib.NNTP_SSL`](https://python-all.ru/3.4/library/nntplib.html#nntplib.NNTP_SSL)), так и явный (с помощью [`nntplib.NNTP.starttls()`](https://python-all.ru/3.4/library/nntplib.html#nntplib.NNTP.starttls)) TLS.12081209(Авторы: Antoine Pitrou ([issue 9360](https://python-all.ru/3.4/whatsnew/3.2.html)) и Andrew Vant ([issue 1926](https://python-all.ru/3.4/whatsnew/3.2.html)).)12101211### сертификаты12121213[`http.client.HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection), [`urllib.request.HTTPSHandler`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.HTTPSHandler) и [`urllib.request.urlopen()`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.urlopen) теперь принимают необязательные аргументы для проверки сертификата сервера относительно набора центров сертификации, как рекомендуется при публичном использовании HTTPS.12141215(Добавлено Antoine Pitrou, [issue 9003](https://python-all.ru/3.4/whatsnew/3.2.html).)12161217### imaplib12181219Поддержка явного TLS для стандартных IMAP4-соединений была добавлена через новый метод [`imaplib.IMAP4.starttls`](https://python-all.ru/3.4/library/imaplib.html#imaplib.IMAP4.starttls).12201221(Авторы: Lorenzo M. Catucci и Antoine Pitrou, [issue 4471](https://python-all.ru/3.4/whatsnew/3.2.html).)12221223### http.client12241225В модуле [`http.client`](https://python-all.ru/3.4/library/http.client.html#module-http.client) был сделан ряд небольших улучшений API. Устаревшие простые ответы HTTP 0.9 больше не поддерживаются, а параметр *strict* объявлен устаревшим во всех классах.12261227Классы [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection) теперь имеют параметр *source\_address*, представляющий собой кортеж (host, port), указывающий, откуда устанавливается HTTP-соединение.12281229Добавлена поддержка проверки сертификатов и виртуальных хостов HTTPS в [`HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection).12301231Метод [`request()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection.request) у объектов соединения принимал необязательный аргумент *body*, чтобы можно было использовать [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object) для передачи содержимого запроса. Теперь же аргумент *body* также принимает [*итерируемый объект*](https://python-all.ru/3.4/glossary.html#term-iterable), при условии, что он содержит явный заголовок `Content-Length`. Этот расширенный интерфейс стал гораздо более гибким.12321233Для установки HTTPS-соединения через прокси-сервер появился новый метод [`set_tunnel()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection.set_tunnel), который задаёт хост и порт для туннелирования HTTP Connect.12341235Для соответствия поведению [`http.server`](https://python-all.ru/3.4/library/http.server.html#module-http.server) библиотека HTTP-клиента теперь также кодирует заголовки в кодировке ISO-8859-1 (Latin-1). Для входящих заголовков она уже это делала, так что теперь поведение согласовано для входящего и исходящего трафика. (См. работу Armin Ronacher в [issue 10980](https://python-all.ru/3.4/whatsnew/3.2.html).)12361237### unittest12381239Модуль unittest получил ряд улучшений: поддержка обнаружения тестов для пакетов, более простое экспериментирование в интерактивной оболочке, новые методы тестовых случаев, улучшенные диагностические сообщения при сбоях тестов и более понятные имена методов.12401241- Вызов из командной строки `python -m unittest` теперь может принимать пути к файлам вместо имён модулей для запуска конкретных тестов ([issue 10620](https://python-all.ru/3.4/whatsnew/3.2.html)). Новая система обнаружения тестов может находить тесты внутри пакетов, находя любой тест, импортируемый из корневой директории. Корневая директория может быть задана опцией *-t*, шаблон для сопоставления файлов – с помощью `-p`, а директория для начала поиска – с помощью `-s`:12421243  ```python1244  $ python -m unittest discover -s my_proj_dir -p _test.py1245  ```12461247  (Предложено Michael Foord.)1248- Экспериментировать в интерактивной оболочке стало проще, поскольку класс `unittest.case.TestCase` теперь можно создавать без аргументов:12491250  ```python1251  >>> TestCase().assertEqual(pow(2, 3), 8)1252  ```12531254  (Предложено Michael Foord.)1255- В модуле [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) появились два новых метода: [`assertWarns()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertWarns) и [`assertWarnsRegex()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertWarnsRegex), которые проверяют, что заданный тип предупреждения вызывается тестируемым кодом:12561257  ```python1258  with self.assertWarns(DeprecationWarning):1259      legacy_function('XYZ')1260  ```12611262  (Автор: Antoine Pitrou, [issue 9754](https://python-all.ru/3.4/whatsnew/3.2.html).)12631264  Ещё один новый метод, [`assertCountEqual()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertCountEqual), используется для сравнения двух итерируемых объектов, чтобы определить, равны ли количества их элементов (то есть одинаковые ли элементы присутствуют с одинаковым числом вхождений, независимо от порядка):12651266  ```python1267  def test_anagram(self):1268      self.assertCountEqual('algorithm', 'logarithm')1269  ```12701271  (Автор: Raymond Hettinger.)1272- Одной из ключевых особенностей модуля unittest является стремление выдавать информативную диагностику при сбое теста. Когда это возможно, сбой записывается вместе с diff (разницей) вывода. Это особенно полезно при анализе логов неудачных тестовых запусков. Однако, поскольку diff'ы могут быть объёмными, появился новый атрибут [`maxDiff`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.maxDiff), который задаёт максимальную длину отображаемых diff'ов.1273- Кроме того, имена методов в модуле были приведены в порядок.12741275  Например, [`assertRegex()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertRegex) – это новое имя для `assertRegexpMatches()`, которое было названо неправильно, потому что тест использует [`re.search()`](https://python-all.ru/3.4/library/re.html#re.search), а не [`re.match()`](https://python-all.ru/3.4/library/re.html#re.match). Другие методы, использующие регулярные выражения, теперь названы с краткой формой «Regex» вместо «Regexp» – это соответствует именам в других реализациях unittest, совпадает со старым названием модуля [`re`](https://python-all.ru/3.4/library/re.html#module-re) в Python и имеет однозначное верблюжье написание.12761277  (Предложено Raymond Hettinger; реализовано Ezio Melotti.)1278- Чтобы повысить согласованность, некоторые давно существующие псевдонимы методов объявляются устаревшими; вместо них следует использовать предпочтительные имена:12791280  > | Старое имя | Предпочтительное имя |1281  > | --- | --- |1282  > | `assert_()` | [`assertTrue()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertTrue) |1283  > | `assertEquals()` | [`assertEqual()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertEqual) |1284  > | `assertNotEquals()` | [`assertNotEqual()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotEqual) |1285  > | `assertAlmostEquals()` | [`assertAlmostEqual()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertAlmostEqual) |1286  > | `assertNotAlmostEquals()` | [`assertNotAlmostEqual()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertNotAlmostEqual) |12871288  Аналогично, методы `TestCase.fail*`, устаревшие в Python 3.1, как ожидается, будут удалены в Python 3.3. См. также раздел [*Deprecated aliases*](https://python-all.ru/3.4/library/unittest.html#deprecated-aliases) в документации [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest).12891290  (Автор: Ezio Melotti; [issue 9424](https://python-all.ru/3.4/whatsnew/3.2.html).)1291- Метод `assertDictContainsSubset()` был помечен как устаревший, потому что он был неправильно реализован: аргументы были в неверном порядке. Это создавало трудноотлаживаемые оптические иллюзии, когда тесты вроде `TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})` завершались неудачей.12921293  (Автор: Raymond Hettinger.)12941295### random12961297Целочисленные методы модуля [`random`](https://python-all.ru/3.4/library/random.html#module-random) теперь лучше обеспечивают равномерное распределение. Ранее они вычисляли выборки с помощью `int(n*random())`, что давало небольшое смещение, когда *n* не являлось степенью двойки. Теперь несколько выборок делаются из диапазона до следующей степени двойки, и выборка сохраняется только в том случае, если она попадает в диапазон `0 <= x < n`. Затронутые функции и методы: [`randrange()`](https://python-all.ru/3.4/library/random.html#random.randrange), [`randint()`](https://python-all.ru/3.4/library/random.html#random.randint), [`choice()`](https://python-all.ru/3.4/library/random.html#random.choice), [`shuffle()`](https://python-all.ru/3.4/library/random.html#random.shuffle) и [`sample()`](https://python-all.ru/3.4/library/random.html#random.sample).12981299(Автор: Raymond Hettinger; [issue 9025](https://python-all.ru/3.4/whatsnew/3.2.html).)13001301### poplib13021303Класс [`POP3_SSL`](https://python-all.ru/3.4/library/poplib.html#poplib.POP3_SSL) теперь принимает параметр *context*, который является объектом [`ssl.SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), позволяющим объединять параметры конфигурации SSL, сертификаты и закрытые ключи в одну (потенциально долгоживущую) структуру.13041305(Автор: Giampaolo Rodolà; [issue 8807](https://python-all.ru/3.4/whatsnew/3.2.html).)13061307### asyncore13081309[`asyncore.dispatcher`](https://python-all.ru/3.4/library/asyncore.html#asyncore.dispatcher) теперь предоставляет метод [`handle_accepted()`](https://python-all.ru/3.4/library/asyncore.html#asyncore.dispatcher.handle_accepted), возвращающий пару *(sock, addr)*. Этот метод вызывается при фактическом установлении соединения с новым удалённым узлом. Он предназначен для замены устаревшего метода [`handle_accept()`](https://python-all.ru/3.4/library/asyncore.html#asyncore.dispatcher.handle_accept) и избавляет пользователя от необходимости напрямую вызывать [`accept()`](https://python-all.ru/3.4/library/asyncore.html#asyncore.dispatcher.accept).13101311(Автор: Giampaolo Rodolà; [issue 6706](https://python-all.ru/3.4/whatsnew/3.2.html).)13121313### tempfile13141315Модуль [`tempfile`](https://python-all.ru/3.4/library/tempfile.html#module-tempfile) получил новый контекстный менеджер [`TemporaryDirectory`](https://python-all.ru/3.4/library/tempfile.html#tempfile.TemporaryDirectory), обеспечивающий простое и детерминированное удаление временных каталогов:13161317```python1318with tempfile.TemporaryDirectory() as tmpdirname:1319    print('created temporary dir:', tmpdirname)1320```13211322(Авторы: Neil Schemenauer и Nick Coghlan; [issue 5178](https://python-all.ru/3.4/whatsnew/3.2.html).)13231324### inspect13251326- Модуль [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) содержит новую функцию [`getgeneratorstate()`](https://python-all.ru/3.4/library/inspect.html#inspect.getgeneratorstate) для простого определения текущего состояния генератора-итератора:13271328  ```python1329  >>> from inspect import getgeneratorstate1330  >>> def gen():1331          yield 'demo'1332  >>> g = gen()1333  >>> getgeneratorstate(g)1334  'GEN_CREATED'1335  >>> next(g)1336  'demo'1337  >>> getgeneratorstate(g)1338  'GEN_SUSPENDED'1339  >>> next(g, None)1340  >>> getgeneratorstate(g)1341  'GEN_CLOSED'1342  ```13431344  (Авторы: Rodolpho Eckhardt и Nick Coghlan, [issue 10220](https://python-all.ru/3.4/whatsnew/3.2.html).)1345- Для поддержки поиска без возможности активации динамического атрибута модуль [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) содержит новую функцию [`getattr_static()`](https://python-all.ru/3.4/library/inspect.html#inspect.getattr_static). В отличие от [`hasattr()`](https://python-all.ru/3.4/library/functions.html#hasattr), это настоящий поиск только для чтения, который гарантированно не изменяет состояние во время поиска:13461347  ```python1348  >>> class A:1349          @property1350          def f(self):1351              print('Running')1352              return 1013531354  >>> a = A()1355  >>> getattr(a, 'f')1356  Running1357  101358  >>> inspect.getattr_static(a, 'f')1359  <property object at 0x1022bd788>1360  ```13611362> (Предложено Michael Foord.)13631364### pydoc13651366Модуль [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc) теперь предоставляет значительно улучшенный интерфейс веб-сервера, а также новый параметр командной строки `-b` для автоматического открытия окна браузера для отображения этого сервера:13671368```python1369$ pydoc3.2 -b1370```13711372(Автор: Ron Adam; [issue 2001](https://python-all.ru/3.4/whatsnew/3.2.html).)13731374### dis13751376Модуль [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) получил две новые функции для инспекции кода: [`code_info()`](https://python-all.ru/3.4/library/dis.html#dis.code_info) и [`show_code()`](https://python-all.ru/3.4/library/dis.html#dis.show_code). Обе предоставляют подробную информацию об объекте кода для переданной функции, метода, строки исходного кода или объекта кода. Первая возвращает строку, вторая выводит её:13771378```python1379>>> import dis, random1380>>> dis.show_code(random.choice)1381Name:              choice1382Filename:          /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py1383Argument count:    21384Kw-only arguments: 01385Number of locals:  31386Stack size:        111387Flags:             OPTIMIZED, NEWLOCALS, NOFREE1388Constants:1389   0: 'Choose a random element from a non-empty sequence.'1390   1: 'Cannot choose from an empty sequence'1391Names:1392   0: _randbelow1393   1: len1394   2: ValueError1395   3: IndexError1396Variable names:1397   0: self1398   1: seq1399   2: i1400```14011402Кроме того, функция [`dis()`](https://python-all.ru/3.4/library/dis.html#dis.dis) теперь принимает строковые аргументы, так что распространённую идиому `dis(compile(s, '', 'eval'))` можно сократить до `dis(s)`:14031404```python1405>>> dis('3*x+1 if x%2==1 else x//2')1406  1           0 LOAD_NAME                0 (x)1407              3 LOAD_CONST               0 (2)1408              6 BINARY_MODULO1409              7 LOAD_CONST               1 (1)1410             10 COMPARE_OP               2 (==)1411             13 POP_JUMP_IF_FALSE       281412             16 LOAD_CONST               2 (3)1413             19 LOAD_NAME                0 (x)1414             22 BINARY_MULTIPLY1415             23 LOAD_CONST               1 (1)1416             26 BINARY_ADD1417             27 RETURN_VALUE1418        >>   28 LOAD_NAME                0 (x)1419             31 LOAD_CONST               0 (2)1420             34 BINARY_FLOOR_DIVIDE1421             35 RETURN_VALUE1422```14231424В совокупности эти улучшения упрощают изучение того, как реализован CPython, и позволяют самому увидеть, что делает синтаксис языка «под капотом».14251426(Автор: Nick Coghlan, [issue 9147](https://python-all.ru/3.4/whatsnew/3.2.html).)14271428### dbm14291430Все модули баз данных теперь поддерживают методы `get()` и `setdefault()`.14311432(Предложено Ray Allen в [issue 9523](https://python-all.ru/3.4/whatsnew/3.2.html).)14331434### ctypes14351436Новый тип [`ctypes.c_ssize_t`](https://python-all.ru/3.4/library/ctypes.html#ctypes.c_ssize_t) представляет тип данных C `ssize_t`.14371438### site14391440Модуль [`site`](https://python-all.ru/3.4/library/site.html#module-site) содержит три новые функции для вывода подробной информации об установке Python.14411442- [`getsitepackages()`](https://python-all.ru/3.4/library/site.html#site.getsitepackages) выводит список всех глобальных каталогов site-packages.1443- [`getuserbase()`](https://python-all.ru/3.4/library/site.html#site.getuserbase) сообщает базовый каталог пользователя, в котором могут храниться данные.1444- [`getusersitepackages()`](https://python-all.ru/3.4/library/site.html#site.getusersitepackages) показывает путь к каталогу site-packages для текущего пользователя.14451446```python1447>>> import site1448>>> site.getsitepackages()1449['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',1450 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',1451 '/Library/Python/3.2/site-packages']1452>>> site.getuserbase()1453'/Users/raymondhettinger/Library/Python/3.2'1454>>> site.getusersitepackages()1455'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'1456```14571458Удобно, что часть функциональности site доступна напрямую из командной строки:14591460```python1461$ python -m site --user-base1462/Users/raymondhettinger/.local1463$ python -m site --user-site1464/Users/raymondhettinger/.local/lib/python3.2/site-packages1465```14661467(Автор: Tarek Ziadé, [issue 6693](https://python-all.ru/3.4/whatsnew/3.2.html).)14681469### sysconfig14701471Новый модуль [`sysconfig`](https://python-all.ru/3.4/library/sysconfig.html#module-sysconfig) упрощает поиск путей установки и переменных конфигурации, которые различаются между платформами и установками.14721473Модуль предоставляет простые функции доступа для получения информации о платформе и версии:14741475- [`get_platform()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_platform) возвращает такие значения, как *linux-i586* или *macosx-10.6-ppc*.1476- [`get_python_version()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_python_version) возвращает строку версии Python, например «3.2».14771478Он также предоставляет доступ к путям и переменным, соответствующим одной из семи именованных схем, используемых [`distutils`](https://python-all.ru/3.4/library/distutils.html#module-distutils). К ним относятся *posix\_prefix*, *posix\_home*, *posix\_user*, *nt*, *nt\_user*, *os2*, *os2\_home*:14791480- [`get_paths()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_paths) создаёт словарь, содержащий пути установки для текущей схемы установки.1481- [`get_config_vars()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_config_vars) возвращает словарь переменных, зависящих от платформы.14821483Также имеется удобный интерфейс командной строки:14841485```python1486C:\Python32>python -m sysconfig1487Platform: "win32"1488Python version: "3.2"1489Current installation scheme: "nt"14901491Paths:1492        data = "C:\Python32"1493        include = "C:\Python32\Include"1494        platinclude = "C:\Python32\Include"1495        platlib = "C:\Python32\Lib\site-packages"1496        platstdlib = "C:\Python32\Lib"1497        purelib = "C:\Python32\Lib\site-packages"1498        scripts = "C:\Python32\Scripts"1499        stdlib = "C:\Python32\Lib"15001501Variables:1502        BINDIR = "C:\Python32"1503        BINLIBDEST = "C:\Python32\Lib"1504        EXE = ".exe"1505        INCLUDEPY = "C:\Python32\Include"1506        LIBDEST = "C:\Python32\Lib"1507        SO = ".pyd"1508        VERSION = "32"1509        abiflags = ""1510        base = "C:\Python32"1511        exec_prefix = "C:\Python32"1512        platbase = "C:\Python32"1513        prefix = "C:\Python32"1514        projectbase = "C:\Python32"1515        py_version = "3.2"1516        py_version_nodot = "32"1517        py_version_short = "3.2"1518        srcdir = "C:\Python32"1519        userbase = "C:\Documents and Settings\Raymond\Application Data\Python"1520```15211522(Перенесено из Distutils Тареком Зиаде.)15231524### pdb15251526Модуль отладчика [`pdb`](https://python-all.ru/3.4/library/pdb.html#module-pdb) получил ряд улучшений удобства использования:15271528- `pdb.py` теперь имеет опцию `-c`, которая выполняет команды, заданные в файле сценария `.pdbrc`.1529- Файл сценария `.pdbrc` может содержать команды `continue` и `next`, которые продолжают отладку.1530- Конструктор класса `Pdb` теперь принимает аргумент *nosigint*.1531- Новые команды: `l(list)`, `ll(long list)` и `source` для просмотра исходного кода.1532- Новые команды: `display` и `undisplay` для отображения или скрытия значения выражения, если оно изменилось.1533- Новая команда: `interact` для запуска интерактивного интерпретатора, содержащего глобальные и локальные имена, найденные в текущей области видимости.1534- Точки останова можно удалять по номеру.15351536(Добавлено Георгом Брандлем, Антонио Куни и Ильёй Сандлером.)15371538### configparser15391540Модуль [`configparser`](https://python-all.ru/3.4/library/configparser.html#module-configparser) был изменён для улучшения удобства использования и предсказуемости парсера по умолчанию и поддерживаемого им синтаксиса INI. Старый класс `ConfigParser` был удалён в пользу `SafeConfigParser`, который, в свою очередь, был переименован в [`ConfigParser`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser). Поддержка строчных комментариев теперь отключена по умолчанию, а дублирование разделов или опций не допускается в одном источнике конфигурации.15411542Парсеры конфигураций получили новый API на основе протокола отображения:15431544```python1545>>> parser = ConfigParser()1546>>> parser.read_string("""1547[DEFAULT]1548location = upper left1549visible = yes1550editable = no1551color = blue15521553[main]1554title = Main Menu1555color = green15561557[options]1558title = Options1559""")1560>>> parser['main']['color']1561'green'1562>>> parser['main']['editable']1563'no'1564>>> section = parser['options']1565>>> section['title']1566'Options'1567>>> section['title'] = 'Options (editable: %(editable)s)'1568>>> section['title']1569'Options (editable: no)'1570```15711572Новый API реализован поверх классического API, поэтому пользовательские подклассы парсеров должны иметь возможность использовать его без изменений.15731574Структура INI-файла, принимаемая парсерами конфигураций, теперь может быть настроена. Пользователи могут задавать альтернативные разделители опция/значение и префиксы комментариев, изменять имя секции *DEFAULT* или переключать синтаксис интерполяции.15751576Реализована поддержка подключаемой интерполяции, включая дополнительный обработчик интерполяции [`ExtendedInterpolation`](https://python-all.ru/3.4/library/configparser.html#configparser.ExtendedInterpolation):15771578```python1579>>> parser = ConfigParser(interpolation=ExtendedInterpolation())1580>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},1581                      'custom': {'prefix': '/usr/local'}})1582>>> parser.read_string("""1583    [buildout]1584    parts =1585      zope91586      instance1587    find-links =1588      ${buildout:directory}/downloads/dist15891590    [zope9]1591    recipe = plone.recipe.zope9install1592    location = /opt/zope15931594    [instance]1595    recipe = plone.recipe.zope9instance1596    zope9-location = ${zope9:location}1597    zope-conf = ${custom:prefix}/etc/zope.conf1598    """)1599>>> parser['buildout']['find-links']1600'\n/home/ambv/zope9/downloads/dist'1601>>> parser['instance']['zope-conf']1602'/usr/local/etc/zope.conf'1603>>> instance = parser['instance']1604>>> instance['zope-conf']1605'/usr/local/etc/zope.conf'1606>>> instance['zope9-location']1607'/opt/zope'1608```16091610Был также введён ряд небольших возможностей, таких как поддержка указания кодировки в операциях чтения, указание значений по умолчанию для get-функций или чтение напрямую из словарей и строк.16111612(Все изменения предоставлены Łukasz Langa.)16131614### urllib.parse16151616Для модуля [`urllib.parse`](https://python-all.ru/3.4/library/urllib.parse.html#module-urllib.parse) был внесён ряд улучшений удобства использования.16171618Функция [`urlparse()`](https://python-all.ru/3.4/library/urllib.parse.html#urllib.parse.urlparse) теперь поддерживает адреса [IPv6](https://python-all.ru/3.4/whatsnew/3.2.html), как описано в [**RFC 2732**](https://python-all.ru/3.4/whatsnew/3.2.html):16191620```python1621>>> import urllib.parse1622>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')1623ParseResult(scheme='http',1624            netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',1625            path='/foo/',1626            params='',1627            query='',1628            fragment='')1629```16301631Функция [`urldefrag()`](https://python-all.ru/3.4/library/urllib.parse.html#urllib.parse.urldefrag) теперь возвращает [*именованный кортеж*](https://python-all.ru/3.4/glossary.html#term-named-tuple):16321633```python1634>>> r = urllib.parse.urldefrag('http://python.org/about/#target')1635>>> r1636DefragResult(url='http://python.org/about/', fragment='target')1637>>> r[0]1638'http://python.org/about/'1639>>> r.fragment1640'target'1641```16421643Кроме того, функция [`urlencode()`](https://python-all.ru/3.4/library/urllib.parse.html#urllib.parse.urlencode) теперь стала гораздо более гибкой: она принимает аргумент *query* как строку, так и тип bytes. Если это строка, то параметры *safe*, *encoding* и *error* передаются в [`quote_plus()`](https://python-all.ru/3.4/library/urllib.parse.html#urllib.parse.quote_plus) для кодирования:16441645```python1646>>> urllib.parse.urlencode([1647         ('type', 'telenovela'),1648         ('name', '¿Dónde Está Elisa?')],1649         encoding='latin-1')1650'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'1651```16521653Как подробно описано в [*Parsing ASCII Encoded Bytes*](https://python-all.ru/3.4/library/urllib.parse.html#parsing-ascii-encoded-bytes), все функции [`urllib.parse`](https://python-all.ru/3.4/library/urllib.parse.html#module-urllib.parse) теперь принимают на вход ASCII-закодированные байтовые строки, при условии, что они не смешиваются с обычными строками. Если в качестве параметров заданы ASCII-закодированные байтовые строки, возвращаемые типы также будут ASCII-закодированными байтовыми строками:16541655```python1656>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')1657ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',1658                 path=b'/about/', params=b'', query=b'', fragment=b'')1659```16601661(Работа Ника Коглана, Дэна Мана и Сентила Кумарана в [issue 2987](https://python-all.ru/3.4/whatsnew/3.2.html), [issue 5468](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 9873](https://python-all.ru/3.4/whatsnew/3.2.html).)16621663### mailbox16641665Благодаря согласованным усилиям Р. Дэвида Мюррея, модуль [`mailbox`](https://python-all.ru/3.4/library/mailbox.html#module-mailbox) был исправлен для Python 3.2. Проблема заключалась в том, что mailbox изначально был спроектирован с текстовым интерфейсом, но email-сообщения лучше представлять через [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), поскольку разные части сообщения могут иметь разные кодировки.16661667Решение задействовало двоичную поддержку пакета [`email`](https://python-all.ru/3.4/library/email.html#module-email) для разбора произвольных email-сообщений. Кроме того, решение потребовало ряда изменений API.16681669Как и ожидалось, метод [`add()`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Mailbox.add) для объектов [`mailbox.Mailbox`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Mailbox) теперь принимает двоичный ввод.16701671[`StringIO`](https://python-all.ru/3.4/library/io.html#io.StringIO) и ввод из текстового файла устарели. Кроме того, строковый ввод будет завершаться ошибкой на раннем этапе, если используются символы не в ASCII. Ранее ошибка возникала при обработке письма на более позднем этапе.16721673Также добавлена поддержка двоичного вывода. Метод [`get_file()`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Mailbox.get_file) теперь возвращает файл в двоичном режиме (ранее он некорректно устанавливал текстовый режим). Кроме того, появился новый метод [`get_bytes()`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Mailbox.get_bytes), который возвращает [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)-представление сообщения, соответствующее заданному *key*.16741675По-прежнему можно получить недвоичный вывод с помощью метода старого API [`get_string()`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Mailbox.get_string), но такой подход не очень полезен. Вместо этого лучше извлекать сообщения из объекта [`Message`](https://python-all.ru/3.4/library/mailbox.html#mailbox.Message) или загружать их из двоичного ввода.16761677(Предоставлено Р. Дэвидом Мюрреем, при участии Штеффена Даоде Нурпмезо и начального патча от Виктора Стиннера в [issue 9124](https://python-all.ru/3.4/whatsnew/3.2.html).)16781679### turtledemo16801681Демонстрационный код для модуля [`turtle`](https://python-all.ru/3.4/library/turtle.html#module-turtle) был перемещён из каталога *Demo* в основную библиотеку. Он включает более десятка примеров сценариев с живыми отображениями. Находясь в [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path), его теперь можно запускать напрямую из командной строки:16821683```python1684$ python -m turtledemo1685```16861687(Перемещено из каталога Demo Александром Белопольским в [issue 10199](https://python-all.ru/3.4/whatsnew/3.2.html).)16881689## Многопоточность16901691- Механизм сериализации выполнения одновременно работающих потоков Python (обычно известный как [*GIL*](https://python-all.ru/3.4/glossary.html#term-gil) или [*Глобальная блокировка интерпретатора*](https://python-all.ru/3.4/glossary.html#term-global-interpreter-lock)) был переписан. Среди целей были более предсказуемые интервалы переключения и снижение накладных расходов из-за конкуренции за блокировку и количества последующих системных вызовов. Понятие «интервал проверки» для разрешения переключения потоков было отброшено и заменено абсолютной длительностью, выраженной в секундах. Этот параметр настраивается через [`sys.setswitchinterval()`](https://python-all.ru/3.4/library/sys.html#sys.setswitchinterval). В настоящее время по умолчанию он равен 5 миллисекундам.16921693  Дополнительные сведения о реализации можно прочитать в [сообщении в списке рассылки python-dev](https://python-all.ru/3.4/whatsnew/3.2.html) (однако, «приоритетные запросы», как описано в этом сообщении, не были сохранены для включения).16941695  (Предоставлено Antoine Pitrou.)1696- Обычные и рекурсивные блокировки теперь принимают необязательный аргумент *timeout* для своего метода [`acquire()`](https://python-all.ru/3.4/library/threading.html#threading.Lock.acquire). (Автор: Antoine Pitrou; [issue 7316](https://python-all.ru/3.4/whatsnew/3.2.html).)1697- Аналогично, метод [`threading.Semaphore.acquire()`](https://python-all.ru/3.4/library/threading.html#threading.Semaphore.acquire) также получил аргумент *timeout*. (Автор: Torsten Landschoff; [issue 850728](https://python-all.ru/3.4/whatsnew/3.2.html).)1698- Теперь на платформах, использующих Pthreads, захват обычных и рекурсивных блокировок может быть прерван сигналами. Это означает, что программы Python, попавшие в взаимоблокировку при захвате блокировок, можно успешно завершить, многократно отправляя процессу сигнал SIGINT (нажатием `Ctrl+C` в большинстве оболочек). (Автор: Reid Kleckner; [issue 8844](https://python-all.ru/3.4/whatsnew/3.2.html).)16991700## Оптимизации17011702Добавлено несколько небольших улучшений производительности:17031704- Оптимизатор peephole в Python теперь распознает такие шаблоны, как `x in {1, 2, 3}`, как проверку принадлежности множеству констант. Оптимизатор преобразует [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) в [`frozenset`](https://python-all.ru/3.4/library/stdtypes.html#frozenset) и сохраняет предварительно созданную константу.17051706  Теперь, когда замедление устранено, стало практичным начать писать проверки принадлежности с использованием set-нотации. Этот стиль одновременно ясен семантически и быстр в работе:17071708  ```python1709  extension = name.rpartition('.')[2]1710  if extension in {'xml', 'html', 'xhtml', 'css'}:1711      handle(name)1712  ```17131714  (Патч и дополнительные тесты предоставлены Dave Malcolm; [issue 6690](https://python-all.ru/3.4/whatsnew/3.2.html)).1715- Сериализация и десериализация данных с помощью модуля [`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) теперь выполняется в несколько раз быстрее.17161717  (Авторы: Alexandre Vassalotti, Antoine Pitrou и команда Unladen Swallow; [issue 9410](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 3873](https://python-all.ru/3.4/whatsnew/3.2.html).)1718- Алгоритм [Timsort](https://python-all.ru/3.4/whatsnew/3.2.html), используемый в [`list.sort()`](https://python-all.ru/3.4/library/stdtypes.html#list.sort) и [`sorted()`](https://python-all.ru/3.4/library/functions.html#sorted), теперь работает быстрее и потребляет меньше памяти при вызове с [*key-функцией*](https://python-all.ru/3.4/glossary.html#term-key-function). Ранее каждый элемент списка оборачивался во временный объект, запоминающий значение ключа для каждого элемента. Теперь два массива – ключей и значений – сортируются параллельно. Это экономит память, которую занимали обёртки сортировки, и сокращает время, затрачиваемое на делегирование сравнений.17191720  (Патч от Daniel Stutzbach в [issue 9915](https://python-all.ru/3.4/whatsnew/3.2.html).)1721- Производительность декодирования JSON улучшена, а потребление памяти снижено, когда одна и та же строка повторяется для нескольких ключей. Кроме того, кодирование JSON теперь использует ускорения на C, когда аргумент `sort_keys` равен true.17221723  (Авторы: Antoine Pitrou в [issue 7451](https://python-all.ru/3.4/whatsnew/3.2.html), и Raymond Hettinger с Antoine Pitrou в [issue 10314](https://python-all.ru/3.4/whatsnew/3.2.html).)1724- Рекурсивные блокировки (создаваемые через API [`threading.RLock()`](https://python-all.ru/3.4/library/threading.html#threading.RLock)) теперь выигрывают от реализации на C, которая делает их такими же быстрыми, как обычные блокировки, и в 10–15 раз быстрее предыдущей реализации на чистом Python.17251726  (Автор: Antoine Pitrou; [issue 3001](https://python-all.ru/3.4/whatsnew/3.2.html).)1727- Алгоритм быстрого поиска из stringlib теперь используется методами `split()`, `rsplit()`, `splitlines()` и `replace()` у объектов [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) и [`str`](https://python-all.ru/3.4/library/stdtypes.html#str). Кроме того, алгоритм также используется методами `rfind()`, `rindex()`, `rsplit()` и `rpartition()`.17281729  (Патч от Florent Xicluna в [issue 7622](https://python-all.ru/3.4/whatsnew/3.2.html) и [issue 7462](https://python-all.ru/3.4/whatsnew/3.2.html).)1730- Преобразования целых чисел в строки теперь работают с двумя «цифрами» за раз, сокращая количество операций деления и взятия остатка.17311732  ([issue 6713](https://python-all.ru/3.4/whatsnew/3.2.html) от Gawain Bolton, Mark Dickinson и Victor Stinner.)17331734Было реализовано несколько других незначительных оптимизаций. Разность множеств теперь выполняется быстрее, когда один операнд намного больше другого (патч от Andress Bennetts в [issue 8685](https://python-all.ru/3.4/whatsnew/3.2.html)). Метод `array.repeat()` получил более быструю реализацию ([issue 1569291](https://python-all.ru/3.4/whatsnew/3.2.html) от Alexander Belopolsky). Класс `BaseHTTPRequestHandler` имеет более эффективную буферизацию ([issue 3709](https://python-all.ru/3.4/whatsnew/3.2.html) от Andrew Schaaf). Функция [`operator.attrgetter()`](https://python-all.ru/3.4/library/operator.html#operator.attrgetter) ускорена ([issue 10160](https://python-all.ru/3.4/whatsnew/3.2.html) от Christos Georgiou). А `ConfigParser` загружает многострочные аргументы немного быстрее ([issue 7113](https://python-all.ru/3.4/whatsnew/3.2.html) от Łukasz Langa).17351736## Юникод17371738Python был обновлён до [Unicode 6.0.0](https://python-all.ru/3.4/whatsnew/3.2.html). Обновление стандарта добавляет более 2000 новых символов, включая [эмодзи](https://python-all.ru/3.4/whatsnew/3.2.html), которые важны для мобильных телефонов.17391740Кроме того, обновлённый стандарт изменил свойства символов для двух символов каннада (U+0CF1, U+0CF2) и одного числового символа New Tai Lue (U+19DA), сделав первые допустимыми для использования в идентификаторах, а последний – недопустимым. Подробнее см. [Unicode Character Database Changes](https://python-all.ru/3.4/whatsnew/3.2.html).17411742## Кодеки17431744Добавлена поддержка арабской кодировки DOS *cp720* ([issue 1616979](https://python-all.ru/3.4/whatsnew/3.2.html)).17451746MBCS encoding no longer ignores the error handler argument. In the default strict mode, it raises an [`UnicodeDecodeError`](https://python-all.ru/3.4/library/exceptions.html#UnicodeDecodeError) when it encounters an undecodable byte sequence and an [`UnicodeEncodeError`](https://python-all.ru/3.4/library/exceptions.html#UnicodeEncodeError) for an unencodable character.17471748Кодек MBCS поддерживает обработчики ошибок `'strict'` и `'ignore'` для декодирования, и `'strict'` и `'replace'` для кодирования.17491750Для эмуляции кодировки MBCS из Python 3.1 выберите обработчик `'ignore'` для декодирования и обработчик `'replace'` для кодирования.17511752На Mac OS X Python декодирует аргументы командной строки с помощью `'utf-8'`, а не кодировки локали.17531754По умолчанию [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) использует кодировку `'utf-8'` в Windows (вместо `'mbcs'`) и обработчик ошибок `'surrogateescape'` на всех операционных системах.17551756## Документация17571758Документация продолжает улучшаться.17591760- В верхней части длинных разделов, таких как [*Встроенные функции*](https://python-all.ru/3.4/library/functions.html#built-in-funcs), теперь добавлена таблица быстрых ссылок. В случае [`itertools`](https://python-all.ru/3.4/library/itertools.html#module-itertools) ссылки сопровождаются таблицами кратких сводок в стиле шпаргалки, чтобы дать обзор и освежить память без необходимости читать всю документацию.1761- В некоторых случаях исходный код на чистом Python может быть полезным дополнением к документации, поэтому теперь многие модули содержат быстрые ссылки на последнюю версию исходного кода. Например, документация модуля [`functools`](https://python-all.ru/3.4/library/functools.html#module-functools) имеет вверху быструю ссылку с подписью:17621763  > **Исходный код** [Lib/functools.py](https://python-all.ru/src/3.4/Lib/functools.py).17641765  (Автор: Raymond Hettinger; см. [обоснование](https://python-all.ru/3.4/whatsnew/3.2.html).)1766- Документация теперь содержит больше примеров и рецептов. В частности, модуль [`re`](https://python-all.ru/3.4/library/re.html#module-re) имеет обширный раздел [*Примеры регулярных выражений*](https://python-all.ru/3.4/library/re.html#re-examples). Кроме того, модуль [`itertools`](https://python-all.ru/3.4/library/itertools.html#module-itertools) продолжает обновляться новыми [*Рецептами itertools*](https://python-all.ru/3.4/library/itertools.html#itertools-recipes).1767- Модуль [`datetime`](https://python-all.ru/3.4/library/datetime.html#module-datetime) теперь имеет вспомогательную реализацию на чистом Python. Функциональность не изменилась. Это просто предоставляет более удобную для чтения альтернативную реализацию.17681769  (Автор: Alexander Belopolsky; [issue 9528](https://python-all.ru/3.4/whatsnew/3.2.html).)1770- Не поддерживаемая директория `Demo` удалена. Некоторые демонстрации были интегрированы в документацию, некоторые перемещены в директорию `Tools/demo`, а остальные полностью удалены.17711772  (Автор: Georg Brandl; [issue 7962](https://python-all.ru/3.4/whatsnew/3.2.html).)17731774## IDLE17751776- Меню «Формат» теперь содержит опцию для очистки исходных файлов путём удаления замыкающих пробелов.17771778  (Автор: Raymond Hettinger; [issue 5150](https://python-all.ru/3.4/whatsnew/3.2.html).)1779- IDLE на Mac OS X теперь работает как с Carbon AquaTk, так и с Cocoa AquaTk.17801781  (Авторы: Kevin Walzer, Ned Deily и Ronald Oussoren; [issue 6075](https://python-all.ru/3.4/whatsnew/3.2.html).)17821783## Репозиторий кода17841785В дополнение к существующему репозиторию Subversion по адресу [http://svn.python.org](https://python-all.ru/3.4/whatsnew/3.2.html) теперь также доступен репозиторий [Mercurial](https://python-all.ru/3.4/whatsnew/3.2.html) по адресу [https://hg.python.org/](https://python-all.ru/3.4/whatsnew/3.2.html).17861787После выхода версии 3.2 планируется перейти на Mercurial в качестве основного репозитория. Эта распределённая система управления версиями должна упростить членам сообщества создание и обмен внешними наборами изменений. Подробнее см. [**PEP 385**](https://python-all.ru/3.4/whatsnew/3.2.html).17881789Чтобы научиться пользоваться новой системой контроля версий, посмотрите [учебник Джоэла Спольски](https://python-all.ru/3.4/whatsnew/3.2.html) или [Руководство по рабочим процессам в Mercurial](https://python-all.ru/3.4/whatsnew/3.2.html).17901791## Изменения в сборке и C API17921793Изменения процесса сборки Python и C API включают:17941795- Скрипты *idle*, *pydoc* и *2to3* теперь устанавливаются с суффиксом, зависящим от версии, при `make altinstall` ([issue 10679](https://python-all.ru/3.4/whatsnew/3.2.html)).1796- C-функции, обращающиеся к базе данных Unicode, теперь принимают и возвращают символы из полного диапазона Unicode, даже в узких сборках Unicode (Py\_UNICODE\_TOLOWER, Py\_UNICODE\_ISDECIMAL и другие). Заметное отличие в Python: [`unicodedata.numeric()`](https://python-all.ru/3.4/library/unicodedata.html#unicodedata.numeric) теперь возвращает правильное значение для больших кодовых точек, а [`repr()`](https://python-all.ru/3.4/library/functions.html#repr) может считать больше символов печатаемыми.17971798  (Сообщил Bupjoe Lee, исправил Amaury Forgeot D’Arc; [issue 5127](https://python-all.ru/3.4/whatsnew/3.2.html).)1799- Вычисляемые goto теперь включены по умолчанию в поддерживаемых компиляторах (которые определяются скриптом configure). Их можно выборочно отключить, указав `--without-computed-gotos`.18001801  (Автор: Antoine Pitrou; [issue 9203](https://python-all.ru/3.4/whatsnew/3.2.html).)1802- Опция `--with-wctype-functions` была удалена. Теперь для всех функций используется встроенная база данных Unicode.18031804  (Автор: Amaury Forgeot D’Arc; [issue 9210](https://python-all.ru/3.4/whatsnew/3.2.html).)1805- Хеш-значения теперь являются значениями нового типа `Py_hash_t`, который определяется как имеющий тот же размер, что и указатель. Ранее они были типа long, который в некоторых 64-битных операционных системах по-прежнему имеет длину всего 32 бита. В результате этого исправления [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) и [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict) теперь могут содержать более `2**32` элементов в сборках с 64-битными указателями (ранее они могли вырасти до такого размера, но их производительность катастрофически падала).18061807  (Предложено Raymond Hettinger, реализовано Benjamin Peterson; [issue 9778](https://python-all.ru/3.4/whatsnew/3.2.html).)1808- Новый макрос `Py_VA_COPY` копирует состояние списка переменных аргументов. Он эквивалентен *va\_copy* из C99, но доступен на всех платформах Python ([issue 2443](https://python-all.ru/3.4/whatsnew/3.2.html)).1809- Новая функция C API [`PySys_SetArgvEx()`](https://python-all.ru/3.4/c-api/init.html#c.PySys_SetArgvEx) позволяет встроенному интерпретатору задавать [`sys.argv`](https://python-all.ru/3.4/library/sys.html#sys.argv) без изменения [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) ([issue 5753](https://python-all.ru/3.4/whatsnew/3.2.html)).1810- `PyEval_CallObject` теперь доступен только в виде макроса. Объявление функции, которое сохранялось для обратной совместимости, теперь удалено – макрос был введён в 1997 году ([issue 8276](https://python-all.ru/3.4/whatsnew/3.2.html)).1811- Появилась новая функция [`PyLong_AsLongLongAndOverflow()`](https://python-all.ru/3.4/c-api/long.html#c.PyLong_AsLongLongAndOverflow), аналогичная [`PyLong_AsLongAndOverflow()`](https://python-all.ru/3.4/c-api/long.html#c.PyLong_AsLongAndOverflow). Обе служат для преобразования Python [`int`](https://python-all.ru/3.4/library/functions.html#int) в нативный тип фиксированного размера с обнаружением случаев, когда преобразование невозможно ([issue 7767](https://python-all.ru/3.4/whatsnew/3.2.html)).1812- Функция [`PyUnicode_CompareWithASCIIString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_CompareWithASCIIString) теперь возвращает *не равно*, если строка Python завершается *NUL*.1813- Появилась новая функция [`PyErr_NewExceptionWithDoc()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PyErr_NewExceptionWithDoc), похожая на [`PyErr_NewException()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PyErr_NewException), но позволяющая указать docstring. Это даёт исключениям на C такие же возможности самодокументирования, как у их аналогов на чистом Python ([issue 7033](https://python-all.ru/3.4/whatsnew/3.2.html)).1814- При сборке с опцией `--with-valgrind` аллокатор pymalloc будет автоматически отключаться при работе под Valgrind. Это обеспечивает улучшенное обнаружение утечек памяти при работе под Valgrind, одновременно используя преимущества pymalloc в остальное время ([issue 2422](https://python-all.ru/3.4/whatsnew/3.2.html)).1815- Удалён формат `O?` из функций *PyArg\_Parse*. Этот формат больше не используется и никогда не был документирован ([issue 8837](https://python-all.ru/3.4/whatsnew/3.2.html)).18161817Было внесено множество других мелких изменений в C-API. Полный список см. в файле [Misc/NEWS](https://python-all.ru/3.4/whatsnew/3.2.html).18181819Также был обновлён процесс сборки для Mac OS X; подробности см. в [Mac/BuildScript/README.txt](https://python-all.ru/src/3.4/Mac/BuildScript/README.txt). Для пользователей, использующих 32/64-битную сборку, существует известная проблема с Tcl/Tk по умолчанию в Mac OS X 10.6. В связи с этим рекомендуется установить обновлённую альтернативу, например [ActiveState Tcl/Tk 8.5.9](https://python-all.ru/3.4/whatsnew/3.2.html). Дополнительные сведения см. на [https://www.python.org/download/mac/tcltk/](https://python-all.ru/3.4/whatsnew/3.2.html).18201821## Переход на Python 3.218221823В этом разделе перечислены описанные ранее изменения и другие исправления ошибок, которые могут потребовать доработки вашего кода:18241825- Модуль [`configparser`](https://python-all.ru/3.4/library/configparser.html#module-configparser) претерпел ряд улучшений. Основное изменение – замена старого класса `ConfigParser` на давно предпочтительную альтернативу `SafeConfigParser`. Кроме того, имеется ряд мелких несовместимостей:18261827  - Синтаксис интерполяции теперь проверяется при операциях [`get()`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser.get) и [`set()`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser.set). В схеме интерполяции по умолчанию допустимы только два токена со знаками процента: `%(name)s` и `%%`, причём последний представляет собой экранированный знак процента.1828  - Методы [`set()`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser.set) и [`add_section()`](https://python-all.ru/3.4/library/configparser.html#configparser.ConfigParser.add_section) теперь проверяют, что значения являются строками. Ранее неподдерживаемые типы могли быть случайно введены.1829  - Повторяющиеся разделы или параметры из одного источника теперь вызывают [`DuplicateSectionError`](https://python-all.ru/3.4/library/configparser.html#configparser.DuplicateSectionError) или [`DuplicateOptionError`](https://python-all.ru/3.4/library/configparser.html#configparser.DuplicateOptionError). Ранее дубликаты молча перезаписывали предыдущую запись.1830  - Встрочные комментарии теперь по умолчанию отключены, поэтому символ **;** теперь можно безопасно использовать в значениях.1831  - Комментарии теперь можно располагать с отступом. Следовательно, чтобы **;** или **#** оказались в начале строки в многострочных значениях, их нужно интерполировать. Это предотвращает ошибочную интерпретацию префиксных символов комментариев в значениях как комментариев.1832  - `""` теперь является допустимым значением и больше не преобразуется автоматически в пустую строку. Для пустых строк используйте `"option ="` в строке.1833- Модуль [`nntplib`](https://python-all.ru/3.4/library/nntplib.html#module-nntplib) был существенно переработан, поэтому его API часто несовместимы с API версии 3.1.1834- Объекты [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) больше нельзя использовать в качестве имён файлов; вместо этого их следует преобразовывать в [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes).1835- Методы `array.tostring()` и `array.fromstring()` были переименованы в `array.tobytes()` и `array.frombytes()` для ясности. Старые имена объявлены устаревшими. (См. [issue 8990](https://python-all.ru/3.4/whatsnew/3.2.html).)1836- Функции `PyArg_Parse*()`:18371838  - Формат «t#» удалён: используйте «s#» или «s\*»1839  - Форматы «w» и «w#» удалены: используйте «w\*»1840- Тип `PyCObject`, устаревший в 3.1, был удалён. Для обёртывания непрозрачных C-указателей в объекты Python следует использовать API [`PyCapsule`](https://python-all.ru/3.4/c-api/capsule.html#c.PyCapsule); новый тип имеет чётко определённый интерфейс для передачи информации о типобезопасности и менее сложную сигнатуру для вызова деструктора.1841- Функция `sys.setfilesystemencoding()` была удалена из-за ошибочного дизайна.1842- Функция и метод [`random.seed()`](https://python-all.ru/3.4/library/random.html#random.seed) теперь «солят» строковые начальные значения с помощью хеш-функции sha512. Чтобы получить доступ к предыдущей версии *seed* для воспроизведения последовательностей Python 3.1, установите аргумент *version* в *1*, `random.seed(s, version=1)`.1843- Ранее устаревшая функция `string.maketrans()` была удалена в пользу статических методов [`bytes.maketrans()`](https://python-all.ru/3.4/library/stdtypes.html#bytes.maketrans) и [`bytearray.maketrans()`](https://python-all.ru/3.4/library/stdtypes.html#bytearray.maketrans). Это изменение устраняет путаницу относительно того, какие типы поддерживались модулем [`string`](https://python-all.ru/3.4/library/string.html#module-string). Теперь [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) имеют собственные методы **maketrans** и **translate** с промежуточными таблицами перевода соответствующего типа.18441845  (Автор: Georg Brandl; [issue 5675](https://python-all.ru/3.4/whatsnew/3.2.html).)1846- Ранее устаревшая функция `contextlib.nested()` была удалена в пользу обычного оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), который может принимать несколько менеджеров контекста. Последний подход быстрее (поскольку является встроенным) и лучше завершает работу нескольких менеджеров контекста, когда один из них вызывает исключение:18471848  ```python1849  with open('mylog.txt') as infile, open('a.out', 'w') as outfile:1850      for line in infile:1851          if '<critical>' in line:1852              outfile.write(line)1853  ```18541855  (Предложено Georg Brandl и Mattias Brändström; [appspot issue 53094](https://python-all.ru/3.4/whatsnew/3.2.html).)1856- [`struct.pack()`](https://python-all.ru/3.4/library/struct.html#struct.pack) теперь допускает только байты для строкового кода упаковки `s`. Ранее он принимал текстовые аргументы и неявно кодировал их в байты с помощью UTF-8. Это было проблематично, поскольку делались предположения о правильной кодировке и потому что кодировка с переменной длиной может дать сбой при записи в сегмент фиксированной длины структуры.18571858  Код вида `struct.pack('<6sHHBBB', 'GIF87a', x, y)` следует переписать с использованием байтов вместо текста: `struct.pack('<6sHHBBB', b'GIF87a', x, y)`.18591860  (Обнаружено Дэвидом Бизли и исправлено Виктором Штиннером; [issue 10783](https://python-all.ru/3.4/whatsnew/3.2.html).)1861- Класс [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) теперь возбуждает исключение [`xml.etree.ElementTree.ParseError`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ParseError) при неудаче разбора. Ранее он возбуждал [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ExpatError).1862- Новое, более длинное строковое представление [`str()`](https://python-all.ru/3.4/library/stdtypes.html#str) чисел с плавающей запятой может нарушить doctest-ы, которые полагаются на старый формат вывода.1863- В [`subprocess.Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) значение по умолчанию для *close\_fds* теперь равно `True` в Unix; в Windows оно равно `True`, если три стандартных потока установлены в `None`, и `False` в противном случае. Ранее *close\_fds* всегда было `False` по умолчанию, что приводило к трудноуловимым ошибкам или состояниям гонки, когда открытые файловые дескрипторы просачивались в дочерний процесс.1864- Поддержка устаревшего HTTP 0.9 удалена из [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request) и [`http.client`](https://python-all.ru/3.4/library/http.client.html#module-http.client). Такая поддержка всё ещё присутствует на стороне сервера (в [`http.server`](https://python-all.ru/3.4/library/http.server.html#module-http.server)).18651866  (Автор: Antoine Pitrou, [issue 10711](https://python-all.ru/3.4/whatsnew/3.2.html).)1867- SSL-сокеты в режиме тайм-аута теперь возбуждают [`socket.timeout`](https://python-all.ru/3.4/library/socket.html#socket.timeout) при возникновении тайм-аута, а не общее исключение [`SSLError`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLError).18681869  (Автор: Antoine Pitrou, [issue 10272](https://python-all.ru/3.4/whatsnew/3.2.html).)1870- Вводящие в заблуждение функции [`PyEval_AcquireLock()`](https://python-all.ru/3.4/c-api/init.html#c.PyEval_AcquireLock) и [`PyEval_ReleaseLock()`](https://python-all.ru/3.4/c-api/init.html#c.PyEval_ReleaseLock) официально устарели. Вместо них следует использовать API, учитывающие состояние потоков (такие как [`PyEval_SaveThread()`](https://python-all.ru/3.4/c-api/init.html#c.PyEval_SaveThread) и [`PyEval_RestoreThread()`](https://python-all.ru/3.4/c-api/init.html#c.PyEval_RestoreThread)).1871- Из-за рисков безопасности функция `asyncore.handle_accept()` устарела, и для её замены добавлена новая функция `asyncore.handle_accepted()`.18721873  (Автор: Giampaolo Rodola, [issue 6706](https://python-all.ru/3.4/whatsnew/3.2.html).)1874- Из-за новой реализации [*GIL*](https://python-all.ru/3.4/glossary.html#term-gil) [`PyEval_InitThreads()`](https://python-all.ru/3.4/c-api/init.html#c.PyEval_InitThreads) больше нельзя вызывать до [`Py_Initialize()`](https://python-all.ru/3.4/c-api/init.html#c.Py_Initialize).1875