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

3.3.md

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

1> **Источник:** https://python-all.ru/3.4/whatsnew/3.3.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.389В этой статье описываются новые возможности Python 3.3 по сравнению с версией 3.2. Python 3.3 был выпущен 29 сентября 2012 года. Полные сведения приведены в [журнале изменений](https://python-all.ru/3.3/whatsnew/changelog.html).1011> **См. также**12>13> [**PEP 398**](https://python-all.ru/3.4/whatsnew/3.3.html) – График выпуска Python 3.31415## Итоги – основные изменения1617Новые синтаксические возможности:1819- Новое выражение `yield from` для [*делегирования генераторам*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-380).20- Синтаксис `u'unicode'` снова поддерживается для объектов [`str`](https://python-all.ru/3.4/library/stdtypes.html#str).2122Новые модули библиотеки:2324- [`faulthandler`](https://python-all.ru/3.4/library/faulthandler.html#module-faulthandler) (помогает отлаживать низкоуровневые сбои)25- [`ipaddress`](https://python-all.ru/3.4/library/ipaddress.html#module-ipaddress) (высокоуровневые объекты, представляющие IP-адреса и маски)26- [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma) (сжатие данных с использованием алгоритма XZ / LZMA)27- [`unittest.mock`](https://python-all.ru/3.4/library/unittest.mock.html#module-unittest.mock) (замена частей тестируемой системы на mock-объекты)28- [`venv`](https://python-all.ru/3.4/library/venv.html#module-venv) (Python [*виртуальные окружения*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-405), как в популярном пакете `virtualenv`)2930Новые встроенные возможности:3132- Переработанная [*иерархия исключений ввода-вывода*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-3151).3334Улучшения реализации:3536- Переписан [*механизм импорта*](https://python-all.ru/3.4/whatsnew/3.3.html#importlib) на основе [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib).37- Более компактные [*строки Unicode*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-393).38- Более компактные [*словари атрибутов*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-412).3940Значительно улучшенные модули библиотеки:4142- C-акселератор для модуля [*decimal*](https://python-all.ru/3.4/whatsnew/3.3.html#new-decimal).43- Улучшенная обработка Unicode в модуле [*email*](https://python-all.ru/3.4/whatsnew/3.3.html#new-email) ([*предварительный*](https://python-all.ru/3.4/glossary.html#term-provisional-package)).4445Улучшения в области безопасности:4647- Рандомизация хэшей включена по умолчанию.4849Читайте далее, чтобы ознакомиться с полным списком изменений, значимых для пользователя.5051## PEP 405: Виртуальные окружения5253Виртуальные окружения помогают создавать отдельные установки Python, совместно использующие общесистемную базовую установку, для удобства обслуживания. Виртуальные окружения имеют свой собственный набор частных пакетов сайта (т.е. локально устанавливаемых библиотек) и при желании могут быть изолированы от общесистемных пакетов сайта. Их концепция и реализация вдохновлены популярным сторонним пакетом `virtualenv`, но выигрывают от более тесной интеграции с ядром интерпретатора.5455Этот PEP добавляет модуль [`venv`](https://python-all.ru/3.4/library/venv.html#module-venv) для программного доступа и скрипт [*pyvenv*](https://python-all.ru/3.4/using/scripts.html#scripts-pyvenv) для доступа и администрирования из командной строки. Интерпретатор Python проверяет наличие файла `pyvenv.cfg`, существование которого указывает на корень дерева каталогов виртуального окружения.5657> **См. также**58>59> **[**PEP 405**](https://python-all.ru/3.4/whatsnew/3.3.html) – Виртуальные окружения Python**60>61> PEP написан Carl Meyer; реализация Carl Meyer и Vinay Sajip6263## PEP 420: Неявные пакеты пространства имён6465Встроенная поддержка пакетных каталогов, не требующих файлов-маркеров `__init__.py` и способных автоматически охватывать несколько сегментов пути (вдохновлено различными сторонними подходами к пакетам пространств имён, описанными в [**PEP 420**](https://python-all.ru/3.4/whatsnew/3.3.html))6667> **См. также**68>69> **[**PEP 420**](https://python-all.ru/3.4/whatsnew/3.3.html) – Неявные пакеты пространства имён**70>71> PEP написан Eric V. Smith; реализация Eric V. Smith и Barry Warsaw7273## PEP 3118: Новая реализация memoryview и документация протокола буфера7475Реализация [**PEP 3118**](https://python-all.ru/3.4/whatsnew/3.3.html) была значительно улучшена.7677Новая реализация memoryview полностью устраняет все проблемы владения и времени жизни динамически выделяемых полей в структуре Py\_buffer, которые приводили к многочисленным сообщениям о сбоях. Кроме того, исправлены несколько функций, которые приводили к сбоям или возвращали неверные результаты для несплошных или многомерных входных данных.7879Объект memoryview теперь имеет совместимый с PEP 3118 метод getbufferproc(), который проверяет тип запроса потребителя. Добавлено множество новых возможностей, большинство из которых работают в полной общности для несплошных массивов и массивов с под-смещениями.8081Документация была обновлена, чётко разъясняя обязанности как экспортёров, так и потребителей. Флаги запросов буфера сгруппированы в базовые и составные. Объясняется расположение в памяти несплошных и многомерных массивов в стиле NumPy.8283### Возможности8485- Теперь поддерживаются все нативные односимвольные спецификаторы формата в синтаксисе модуля struct (с возможным префиксом '@').86- С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-сплошных массивов.87- Поддерживаются многомерные представления в виде списков для любого типа массива.88- Поддерживаются многомерные сравнения для любого типа массива.89- Одномерные представления памяти (memoryview) хешируемых (только для чтения) типов с форматами B, b или c теперь хешируемы. (Автор: Antoine Pitrou в [задаче 13411](https://python-all.ru/3.4/whatsnew/3.3.html).)90- Поддерживается произвольная нарезка одномерных массивов любого типа. Например, теперь можно обратить memoryview за O(1), используя отрицательный шаг.9192### Изменения API9394- Максимальное количество измерений официально ограничено 64.95- Представление пустых shape, strides и suboffsets теперь – пустой кортеж вместо None.96- Доступ к элементу memoryview с форматом 'B' (беззнаковые байты) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Чтобы вернуть объект bytes, представление должно быть сначала приведено к 'c'.97- Сравнения memoryview теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все строки формата в синтаксисе модуля struct. Представления с нераспознанными строками формата по-прежнему допускаются, но всегда будут сравниваться как неравные, независимо от содержимого представления.98- Дополнительные изменения см. в разделе [Изменения сборки и C API](https://python-all.ru/3.4/whatsnew/3.3.html#build-and-c-api-changes) и [Перенос кода на C](https://python-all.ru/3.4/whatsnew/3.3.html#porting-c-code).99100(Автор: Stefan Krah в [issue 10181](https://python-all.ru/3.4/whatsnew/3.3.html).)101102> **См. также**103>104> [**PEP 3118**](https://python-all.ru/3.4/whatsnew/3.3.html) - Пересмотр протокола буфера105106## PEP 393: Гибкое представление строк107108Тип строки Unicode изменён для поддержки нескольких внутренних представлений в зависимости от символа с наибольшим порядковым номером Unicode (1, 2 или 4 байта) в представляемой строке. Это позволяет обеспечить эффективное по памяти представление в распространённых случаях, но даёт доступ к полному UCS-4 во всех системах. Для совместимости с существующими API несколько представлений могут существовать параллельно; со временем эта совместимость должна быть прекращена.109110Со стороны Python у этого изменения не должно быть недостатков.111112Со стороны C API PEP 393 полностью обратно совместим. Устаревший API\\nдолжен оставаться доступным как минимум пять лет. Приложения, использующие устаревший\\nAPI, не смогут в полной мере воспользоваться преимуществами уменьшения потребления памяти или, что хуже, могут использовать\\nнемного больше памяти, поскольку Python может быть вынужден поддерживать две версии каждой\\nстроки (в устаревшем формате и в новом эффективном хранилище).113114### Функциональность115116Изменения, введённые [**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html), заключаются в следующем:117118- Python теперь всегда поддерживает полный диапазон кодовых точек Unicode, включая не-BMP (т.е. от `U+0000` до `U+10FFFF`). Различие между узкой (narrow) и широкой (wide) сборками больше не существует, и Python теперь ведёт себя как широкая сборка, даже в Windows.119- С исчезновением узких сборок также были исправлены проблемы, характерные для узких сборок, например:120121  - [`len()`](https://python-all.ru/3.4/library/functions.html#len) теперь всегда возвращает 1 для не-BMP символов, поэтому `len('\U0010FFFF') == 1`;122  - суррогатные пары не рекомбинируются в строковых литералах, поэтому `'\uDBFF\uDFFF' != '\U0010FFFF'`;123  - индексирование или слайсинг не-BMP символов возвращает ожидаемое значение, поэтому `'\U0010FFFF'[0]` теперь возвращает `'\U0010FFFF'`, а не `'\uDBFF'`;124  - все остальные функции в стандартной библиотеке теперь корректно обрабатывают не-BMP кодовые точки.125- Значение [`sys.maxunicode`](https://python-all.ru/3.4/library/sys.html#sys.maxunicode) теперь всегда равно `1114111` (`0x10FFFF` в шестнадцатеричной системе). Функция `PyUnicode_GetMax()` по-прежнему возвращает либо `0xFFFF`, либо `0x10FFFF` для обратной совместимости, и её не следует использовать с новым Unicode API (см. [issue 13054](https://python-all.ru/3.4/whatsnew/3.3.html)).126- Флаг `./configure` `--with-wide-unicode` был удалён.127128### Производительность и использование ресурсов129130Хранение строк Unicode теперь зависит от наибольшей кодовой точки в строке:131132- строки из чистого ASCII и Latin1 (`U+0000-U+00FF`) используют 1 байт на кодовую точку;133- строки BMP (`U+0000-U+FFFF`) используют 2 байта на кодовую точку;134- не-BMP строки (`U+10000-U+10FFFF`) используют 4 байта на кодовую точку.135136В итоге для большинства приложений потребление памяти для хранения строк должно значительно уменьшиться – особенно по сравнению с прежними сборками с широкими символами – поскольку во многих случаях строки будут чистыми ASCII daже в международных контекстах (потому что многие строки хранят неязыковые данные, такие как фрагменты XML, заголовки HTTP, данные в JSON и т.д.). Мы также надеемся, что по тем же причинам это повысит эффективность кэша ЦП в нетривиальных приложениях. Потребление памяти в Python 3.3 в два-три раза меньше, чем в Python 3.2, и немного лучше, чем в Python 2.7, согласно бенчмарку Django (подробности см. в PEP).137138> **См. также**139>140> **[**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html) – Гибкое представление строк**141>142> PEP написан Мартином фон Лёвисом; реализация – Торстен Беккер и Мартин фон Лёвис.143144## PEP 397: Средство запуска Python для Windows145146Установщик Python 3.3 для Windows теперь включает приложение-загрузчик `py`, которое можно использовать для запуска приложений Python независимо от версии.147148Этот загрузчик вызывается неявно при двойном щелчке по файлам `*.py`. Если в системе установлена только одна версия Python, для запуска файла будет использована именно она. Если установлено несколько версий, по умолчанию используется самая последняя, но это можно переопределить, включив в скрипт Python «shebang-строку» в стиле Unix.149150Загрузчик также можно использовать явно из командной строки как приложение `py`. Запуск `py` следует тем же правилам выбора версии, что и неявный запуск скриптов, но можно выбрать более конкретную версию, передав соответствующие аргументы (например, `-3` для запроса Python 3, если также установлен Python 2, или `-2.6` для явного запроса более ранней версии Python, если установлена более новая).151152В дополнение к загрузчику, установщик Windows теперь включает опцию добавления только что установленного Python в системный PATH. (Автор: Brian Curtin в [issue 3561](https://python-all.ru/3.4/whatsnew/3.3.html).)153154> **См. также**155>156> **[**PEP 397**](https://python-all.ru/3.4/whatsnew/3.3.html) – Средство запуска Python для Windows**157>158> PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация – Винай Саджип.159>160> Документация по средству запуска: [*Python Launcher for Windows*](https://python-all.ru/3.4/using/windows.html#launcher)161>162> Изменение PATH установщиком: [*Finding the Python executable*](https://python-all.ru/3.4/using/windows.html#windows-path-mod)163164## PEP 3151: Переработка иерархии исключений ОС и ввода-вывода165166Иерархия исключений, вызываемых ошибками операционной системы, теперь одновременно упрощена и более детализирована.167168Больше не нужно беспокоиться о выборе подходящего типа исключения между [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError), [`EnvironmentError`](https://python-all.ru/3.4/library/exceptions.html#EnvironmentError), [`WindowsError`](https://python-all.ru/3.4/library/exceptions.html#WindowsError), `mmap.error`, [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error) или [`select.error`](https://python-all.ru/3.4/library/select.html#select.error). Все эти типы исключений теперь являются одним: [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Остальные имена сохранены как псевдонимы для совместимости.169170Кроме того, теперь легче перехватить конкретное условие ошибки. Вместо проверки атрибута `errno` (или `args[0]`) на конкретную константу из модуля [`errno`](https://python-all.ru/3.4/library/errno.html#module-errno), можно перехватить соответствующий подкласс [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Доступны следующие подклассы:171172- [`BlockingIOError`](https://python-all.ru/3.4/library/exceptions.html#BlockingIOError)173- [`ChildProcessError`](https://python-all.ru/3.4/library/exceptions.html#ChildProcessError)174- [`ConnectionError`](https://python-all.ru/3.4/library/exceptions.html#ConnectionError)175- [`FileExistsError`](https://python-all.ru/3.4/library/exceptions.html#FileExistsError)176- [`FileNotFoundError`](https://python-all.ru/3.4/library/exceptions.html#FileNotFoundError)177- [`InterruptedError`](https://python-all.ru/3.4/library/exceptions.html#InterruptedError)178- [`IsADirectoryError`](https://python-all.ru/3.4/library/exceptions.html#IsADirectoryError)179- [`NotADirectoryError`](https://python-all.ru/3.4/library/exceptions.html#NotADirectoryError)180- [`PermissionError`](https://python-all.ru/3.4/library/exceptions.html#PermissionError)181- [`ProcessLookupError`](https://python-all.ru/3.4/library/exceptions.html#ProcessLookupError)182- [`TimeoutError`](https://python-all.ru/3.4/library/exceptions.html#TimeoutError)183184А сам [`ConnectionError`](https://python-all.ru/3.4/library/exceptions.html#ConnectionError) имеет более мелкие подклассы:185186- [`BrokenPipeError`](https://python-all.ru/3.4/library/exceptions.html#BrokenPipeError)187- [`ConnectionAbortedError`](https://python-all.ru/3.4/library/exceptions.html#ConnectionAbortedError)188- [`ConnectionRefusedError`](https://python-all.ru/3.4/library/exceptions.html#ConnectionRefusedError)189- [`ConnectionResetError`](https://python-all.ru/3.4/library/exceptions.html#ConnectionResetError)190191Благодаря новым исключениям, теперь можно избежать типичного использования [`errno`](https://python-all.ru/3.4/library/errno.html#module-errno). Например, следующий код, написанный для Python 3.2:192193```python194from errno import ENOENT, EACCES, EPERM195196try:197    with open("document.txt") as f:198        content = f.read()199except IOError as err:200    if err.errno == ENOENT:201        print("document.txt file is missing")202    elif err.errno in (EACCES, EPERM):203        print("You are not allowed to read document.txt")204    else:205        raise206```207208теперь можно написать без импорта [`errno`](https://python-all.ru/3.4/library/errno.html#module-errno) и без ручного анализа атрибутов исключения:209210```python211try:212    with open("document.txt") as f:213        content = f.read()214except FileNotFoundError:215    print("document.txt file is missing")216except PermissionError:217    print("You are not allowed to read document.txt")218```219220> **См. также**221>222> **[**PEP 3151**](https://python-all.ru/3.4/whatsnew/3.3.html) – Переработка иерархии исключений ОС и ввода-вывода**223>224> PEP написан и реализован Антуаном Питру225226## PEP 380: Синтаксис делегирования подгенератору227228PEP 380 добавляет выражение `yield from`, позволяющее [*генератору*](https://python-all.ru/3.4/glossary.html#term-generator) делегировать часть своих операций другому генератору. Это позволяет выделить участок кода, содержащий [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield), и поместить его в другой генератор. Кроме того, подгенератор может вернуть значение, и это значение становится доступно делегирующему генератору.229230Хотя выражение `yield from` в первую очередь предназначено для делегирования подгенератору, на самом деле оно позволяет делегировать произвольным под-итераторам.231232Для простых итераторов выражение `yield from iterable` по сути является сокращённой формой записи `for item in iterable: yield item`:233234```python235>>> def g(x):236...     yield from range(x, 0, -1)237...     yield from range(x)238...239>>> list(g(5))240[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]241```242243Однако, в отличие от обычного цикла, `yield from` позволяет подгенераторам напрямую получать отправленные и возбуждённые значения из вызывающей области и возвращать итоговое значение внешнему генератору:244245```python246>>> def accumulate():247...     tally = 0248...     while 1:249...         next = yield250...         if next is None:251...             return tally252...         tally += next253...254>>> def gather_tallies(tallies):255...     while 1:256...         tally = yield from accumulate()257...         tallies.append(tally)258...259>>> tallies = []260>>> acc = gather_tallies(tallies)261>>> next(acc) # Убедиться, что аккумулятор готов к приёму значений262>>> for i in range(4):263...     acc.send(i)264...265>>> acc.send(None) # Завершить первый подсчёт266>>> for i in range(5):267...     acc.send(i)268...269>>> acc.send(None) # Завершить второй подсчёт270>>> tallies271[6, 10]272```273274Основной принцип, которым руководствуется это изменение, – позволить даже генераторам, которые предназначены для использования с методами `send` и `throw`, разбиваться на несколько подгенераторов так же легко, как большую функцию можно разбить на несколько подфункций.275276> **См. также**277>278> **[**PEP 380**](https://python-all.ru/3.4/whatsnew/3.3.html) - Syntax for Delegating to a Subgenerator**279>280> PEP написан Грегом Юингом; реализовано Грегом Юингом, включено в версию 3.3 Рено Бланшем, Райаном Келли и Ником Когланом; документация – Збигнев Енджеевски-Шмек и Ник Коглан281282## PEP 409: Подавление контекста исключения283284PEP 409 вводит новый синтаксис, позволяющий отключать отображение контекста цепочки исключений. Это позволяет получать более чистые сообщения об ошибках в приложениях, которые преобразуют типы исключений:285286```python287>>> class D:288...     def __init__(self, extra):289...         self._extra_attributes = extra290...     def __getattr__(self, attr):291...         try:292...             return self._extra_attributes[attr]293...         except KeyError:294...             raise AttributeError(attr) from None295...296>>> D({}).x297Traceback (most recent call last):298  File "<stdin>", line 1, in <module>299  File "<stdin>", line 8, in __getattr__300AttributeError: x301```302303Без суффикса `from None`, подавляющего причину, исходное исключение отображалось бы по умолчанию:304305```python306>>> class C:307...     def __init__(self, extra):308...         self._extra_attributes = extra309...     def __getattr__(self, attr):310...         try:311...             return self._extra_attributes[attr]312...         except KeyError:313...             raise AttributeError(attr)314...315>>> C({}).x316Traceback (most recent call last):317  File "<stdin>", line 6, in __getattr__318KeyError: 'x'319320During handling of the above exception, another exception occurred:321322Traceback (most recent call last):323  File "<stdin>", line 1, in <module>324  File "<stdin>", line 8, in __getattr__325AttributeError: x326```327328Никакие возможности отладки не теряются, поскольку исходный контекст исключения остаётся доступным при необходимости (например, если промежуточная библиотека некорректно подавила ценные нижележащие сведения):329330```python331>>> try:332...     D({}).x333... except AttributeError as exc:334...     print(repr(exc.__context__))335...336KeyError('x',)337```338339> **См. также**340>341> **[**PEP 409**](https://python-all.ru/3.4/whatsnew/3.3.html) – Подавление контекста исключения**342>343> PEP написан Итаном Фурманом; реализован Итаном Фурманом и Ником Когланом.344345## PEP 414: Явные литералы Unicode346347Чтобы облегчить переход с Python 2 для приложений, работающих с Unicode, которые активно используют литералы Unicode, Python 3.3 снова поддерживает префикс «`u`» для строковых литералов. Этот префикс не имеет семантического значения в Python 3, он предоставлен исключительно для уменьшения количества чисто механических изменений при миграции на Python 3, позволяя разработчикам сосредоточиться на более значимых семантических изменениях (таких как более строгое разделение двоичных и текстовых данных по умолчанию).348349> **См. также**350>351> **[**PEP 414**](https://python-all.ru/3.4/whatsnew/3.3.html) – Явные литералы Unicode**352>353> PEP написан Армином Ронахером.354355## PEP 3155: Полное имя для классов и функций356357У функций и объектов классов появился новый атрибут `__qualname__`, представляющий «путь» от верхнего уровня модуля до их определения. Для глобальных функций и классов это то же самое, что и `__name__`. Для остальных функций и классов он предоставляет более подробную информацию о том, где они были на самом деле определены и как они могут быть доступны из глобальной области видимости.358359Пример с (несвязанными) методами:360361```python362>>> class C:363...     def meth(self):364...         pass365>>> C.meth.__name__366'meth'367>>> C.meth.__qualname__368'C.meth'369```370371Пример с вложенными классами:372373```python374>>> class C:375...     class D:376...         def meth(self):377...             pass378...379>>> C.D.__name__380'D'381>>> C.D.__qualname__382'C.D'383>>> C.D.meth.__name__384'meth'385>>> C.D.meth.__qualname__386'C.D.meth'387```388389Пример с вложенными функциями:390391```python392>>> def outer():393...     def inner():394...         pass395...     return inner396...397>>> outer().__name__398'inner'399>>> outer().__qualname__400'outer.<locals>.inner'401```402403Строковое представление этих объектов также изменено, чтобы включать новую, более точную информацию:404405```python406>>> str(C.D)407"<class '__main__.C.D'>"408>>> str(C.D.meth)409'<function C.D.meth at 0x7f46b9fe31e0>'410```411412> **См. также**413>414> **[**PEP 3155**](https://python-all.ru/3.4/whatsnew/3.3.html) – Полное имя для классов и функций**415>416> PEP написан и реализован Antoine Pitrou.417418## PEP 412: Словарь с разделением ключей419420Словари, используемые для хранения атрибутов объектов, теперь могут разделять часть своего внутреннего хранилища между собой (а именно, часть, которая хранит ключи и их хеши). Это снижает потребление памяти в программах, создающих множество экземпляров невстроенных типов.421422> **См. также**423>424> **[**PEP 412**](https://python-all.ru/3.4/whatsnew/3.3.html) – Словарь с разделением ключей**425>426> PEP написан и реализован Марком Шенноном.427428## PEP 362: Объект сигнатуры функции429430Новая функция [`inspect.signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature) делает интроспекцию вызываемых объектов Python простой и понятной. Поддерживается широкий спектр вызываемых объектов: функции Python, декорированные или нет, классы и объекты [`functools.partial()`](https://python-all.ru/3.4/library/functools.html#functools.partial). Новые классы [`inspect.Signature`](https://python-all.ru/3.4/library/inspect.html#inspect.Signature), [`inspect.Parameter`](https://python-all.ru/3.4/library/inspect.html#inspect.Parameter) и [`inspect.BoundArguments`](https://python-all.ru/3.4/library/inspect.html#inspect.BoundArguments) содержат информацию о сигнатурах вызова, такую как аннотации, значения по умолчанию, виды параметров и связанные аргументы, что значительно упрощает написание декораторов и любого кода, который проверяет или изменяет сигнатуры вызова или аргументы.431432> **См. также**433>434> **[**PEP 362**](https://python-all.ru/3.4/whatsnew/3.3.html): – Объект сигнатуры функции**435>436> PEP написан Бреттом Кэнноном, Юрием Селивановым, Ларри Хастингсом, Дживон Со; реализован Юрием Селивановым.437438## PEP 421: Добавление sys.implementation439440Новый атрибут в модуле [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys) раскрывает детали, специфичные для реализации текущего интерпретатора. Начальный набор атрибутов в [`sys.implementation`](https://python-all.ru/3.4/library/sys.html#sys.implementation): `name`, `version`, `hexversion` и `cache_tag`.441442Цель `sys.implementation` – собрать в одном пространстве имён данные, специфичные для реализации, используемые стандартной библиотекой. Это позволяет разным реализациям Python гораздо проще использовать единую кодовую базу стандартной библиотеки. В начальном состоянии `sys.implementation` содержит лишь небольшую часть данных, специфичных для реализации. Со временем это соотношение будет меняться, чтобы сделать стандартную библиотеку более переносимой.443444Один из примеров улучшения переносимости стандартной библиотеки – `cache_tag`. Начиная с Python 3.3, `sys.implementation.cache_tag` используется [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) для обеспечения соответствия [**PEP 3147**](https://python-all.ru/3.4/whatsnew/3.3.html). Любая реализация Python, использующая `importlib` для своей встроенной системы импорта, может использовать `cache_tag` для управления поведением кэширования модулей.445446### SimpleNamespace447448Реализация `sys.implementation` также вводит новый тип в Python: [`types.SimpleNamespace`](https://python-all.ru/3.4/library/types.html#types.SimpleNamespace). В отличие от пространства имён на основе отображения, такого как [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict), `SimpleNamespace` основано на атрибутах, как [`object`](https://python-all.ru/3.4/library/functions.html#object). Однако, в отличие от `object`, экземпляры `SimpleNamespace` доступны для записи. Это означает, что можно добавлять, удалять и изменять пространство имён через обычный доступ к атрибутам.449450> **См. также**451>452> **[**PEP 421**](https://python-all.ru/3.4/whatsnew/3.3.html) – добавление sys.implementation**453>454> PEP написан и реализован Эриком Сноу.455456## Использование importlib в качестве реализации импорта457458[issue 2377](https://python-all.ru/3.4/whatsnew/3.3.html) - Replace \_\_import\_\_ w/ importlib.\_\_import\_\_ [issue 13959](https://python-all.ru/3.4/whatsnew/3.3.html) - Re-implement parts of [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp) in pure Python [issue 14605](https://python-all.ru/3.4/whatsnew/3.3.html) - Make import machinery explicit [issue 14646](https://python-all.ru/3.4/whatsnew/3.3.html) - Require loaders set \_\_loader\_\_ and \_\_package\_\_459460Функция [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) теперь работает на основе [`importlib.__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__). Эта работа приводит к завершению «фазы 2» [**PEP 302**](https://python-all.ru/3.4/whatsnew/3.3.html). У этого изменения есть множество преимуществ. Во-первых, оно позволило сделать больше механизмов, управляющих импортом, явными, а не неявными и скрытыми в коде C. Оно также предоставляет единую реализацию для всех виртуальных машин Python, поддерживающих Python 3.3, помогая устранить любые отклонения в семантике импорта, зависящие от конкретной виртуальной машины. И наконец, оно упрощает сопровождение импорта, позволяя дальнейшее развитие.461462Для обычного пользователя видимых изменений в семантике быть не должно. Для тех, чей код в настоящее время манипулирует импортом или вызывает import программно, возможные необходимые изменения в коде описаны в разделе [Перенос кода Python](https://python-all.ru/3.4/whatsnew/3.3.html#porting-python-code) этого документа.463464### Новые API465466Одно из главных преимуществ этой работы – раскрытие того, что требуется для работы оператора import. То есть различные импортеры, которые раньше были неявными, теперь полностью открыты как часть пакета [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib).467468Абстрактные базовые классы, определённые в [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc), были расширены, чтобы чётко разграничить [*искатели метапутей*](https://python-all.ru/3.4/glossary.html#term-meta-path-finder) и [*искатели точек входа в путь*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder) путём введения [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder) соответственно. Прежний ABC [`importlib.abc.Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder) теперь предоставляется только для обратной совместимости и не требует реализации каких-либо методов.469470Что касается искателей, [`importlib.machinery.FileFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder) раскрывает механизм, используемый для поиска исходных и байт-кодовых файлов модуля. Ранее этот класс был неявным членом [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks).471472Для загрузчиков новый абстрактный базовый класс [`importlib.abc.FileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader) помогает написать загрузчик, использующий файловую систему как механизм хранения кода модуля. Загрузчик для исходных файлов ([`importlib.machinery.SourceFileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourceFileLoader)), байт-кодовых файлов без исходного кода ([`importlib.machinery.SourcelessFileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader)) и расширений ([`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader)) теперь доступны для прямого использования.473474[`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) теперь имеет атрибуты `name` и `path`, которые устанавливаются при наличии соответствующих данных. Сообщение о неудачном импорте теперь также будет содержать полное имя модуля вместо только его хвостовой части.475476Функция [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches) теперь будет вызывать одноимённый метод на всех искателях, кэшированных в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache), чтобы помочь очистить любое сохранённое состояние по мере необходимости.477478### Видимые изменения479480О возможных необходимых изменениях в коде см. раздел [Перенос кода Python](https://python-all.ru/3.4/whatsnew/3.3.html#porting-python-code).481482Помимо того, что теперь раскрывает [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib), есть и другие заметные изменения в import. Самое большое из них – [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path) и [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) теперь хранят все искатели метапутей и хуки точек входа, используемые import. Раньше искатели были неявными и скрытыми в C-коде import, а не открытыми напрямую. Это означает, что теперь можно легко удалять или изменять порядок различных искателей в соответствии со своими потребностями.483484Ещё одно изменение: теперь все модули имеют атрибут `__loader__`, в котором хранится загрузчик, использованный для создания модуля. [**PEP 302**](https://python-all.ru/3.4/whatsnew/3.3.html) был обновлён, чтобы сделать этот атрибут обязательным для реализации загрузчиками, так что в будущем, когда сторонние загрузчики будут обновлены, можно будет полагаться на наличие этого атрибута. Однако до тех пор import устанавливает этот атрибут после загрузки модуля.485486Теперь от загрузчиков также ожидается установка атрибута `__package__` из [**PEP 366**](https://python-all.ru/3.4/whatsnew/3.3.html). И снова сам import уже устанавливает этот атрибут для всех загрузчиков из [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) и устанавливает его после загрузки модуля.487488`None` теперь вставляется в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache), когда на [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) не найден искатель. Поскольку [`imp.NullImporter`](https://python-all.ru/3.4/library/imp.html#imp.NullImporter) напрямую не предоставляется в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks), на него больше нельзя полагаться как на значение, всегда доступное для обозначения отсутствия искателя.489490Все остальные изменения относятся к семантическим изменениям, которые следует учитывать при обновлении кода для Python 3.3, и поэтому о них следует прочитать в разделе [Перенос кода Python](https://python-all.ru/3.4/whatsnew/3.3.html#porting-python-code) этого документа.491492(Реализация – Бретт Кэннон)493494## Прочие изменения языка495496Некоторые небольшие изменения, внесённые в ядро языка Python:497498- Добавлена поддержка псевдонимов имён Unicode и именованных последовательностей. [`unicodedata.lookup()`](https://python-all.ru/3.4/library/unicodedata.html#unicodedata.lookup) и `'\N{...}'` теперь разрешают псевдонимы имён, а [`unicodedata.lookup()`](https://python-all.ru/3.4/library/unicodedata.html#unicodedata.lookup) также разрешает именованные последовательности.499500  (Автор: Ezio Melotti, [issue 12753](https://python-all.ru/3.4/whatsnew/3.3.html).)501- База данных Unicode обновлена до версии UCD 6.1.0502- Сравнения на равенство объектов [`range()`](https://python-all.ru/3.4/library/stdtypes.html#range) теперь возвращают результат, отражающий равенство базовых последовательностей, порождённых этими объектами range. ([issue 13201](https://python-all.ru/3.4/whatsnew/3.3.html))503- Методы `count()`, `find()`, `rfind()`, `index()` и `rindex()` объектов [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) теперь принимают целое число от 0 до 255 в качестве первого аргумента.504505  (Автор: Petri Lehtinen, [issue 12170](https://python-all.ru/3.4/whatsnew/3.3.html).)506- Методы `rjust()`, `ljust()` и `center()` объектов [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) теперь принимают [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) для аргумента `fill`. (Автор: Petri Lehtinen, [issue 12380](https://python-all.ru/3.4/whatsnew/3.3.html).)507- В [`list`](https://python-all.ru/3.4/library/stdtypes.html#list) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) добавлены новые методы: `copy()` и `clear()` ([issue 10516](https://python-all.ru/3.4/whatsnew/3.3.html)). Соответственно, [`MutableSequence`](https://python-all.ru/3.4/library/collections.abc.html#collections.abc.MutableSequence) теперь также определяет метод `clear()` ([issue 11388](https://python-all.ru/3.4/whatsnew/3.3.html)).508- Литералы необработанных байтов теперь можно записывать как `rb"..."`, так и `br"..."`.509510  (Автор: Antoine Pitrou, [issue 13748](https://python-all.ru/3.4/whatsnew/3.3.html).)511- [`dict.setdefault()`](https://python-all.ru/3.4/library/stdtypes.html#dict.setdefault) теперь выполняет только один поиск для заданного ключа, что делает его атомарным при использовании со встроенными типами.512513  (Автор: Filip Gruszczyński, [issue 13521](https://python-all.ru/3.4/whatsnew/3.3.html).)514- Сообщения об ошибках, которые выдаются, когда вызов функции не соответствует её сигнатуре, были значительно улучшены.515516  (Добавлено Бенджамином Петерсоном.)517518## Более детальная блокировка импорта519520Предыдущие версии CPython всегда полагались на глобальную блокировку импорта. Это приводило к неожиданным неудобствам, например, к взаимоблокировкам, когда импорт модуля в качестве побочного эффекта вызывал выполнение кода в другом потоке. Иногда использовались неуклюжие обходные пути, такие как функция C API [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_ImportModuleNoBlock).521522В Python 3.3 импорт модуля использует блокировку на модуль. Это корректно сериализует импорт заданного модуля из нескольких потоков (предотвращая появление частично инициализированных модулей), устраняя при этом вышеупомянутые неудобства.523524(Автор: Antoine Pitrou, [issue 9260](https://python-all.ru/3.4/whatsnew/3.3.html).)525526## Встроенные функции и типы527528- [`open()`](https://python-all.ru/3.4/library/functions.html#open) получает новый параметр *opener*: базовый файловый дескриптор для файлового объекта затем получается вызовом *opener* с (*file*, *flags*). Его можно использовать, например, для применения пользовательских флагов, таких как [`os.O_CLOEXEC`](https://python-all.ru/3.4/library/os.html#os.O_CLOEXEC). Был добавлен режим `'x'`: открытие для эксклюзивного создания, с ошибкой, если файл уже существует.529- [`print()`](https://python-all.ru/3.4/library/functions.html#print): добавлен именованный аргумент *flush*. Если *flush* равен true, поток принудительно сбрасывается.530- [`hash()`](https://python-all.ru/3.4/library/functions.html#hash): рандомизация хеша включена по умолчанию; см. [`object.__hash__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__hash__) и [`PYTHONHASHSEED`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONHASHSEED).531- Тип [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) получает новый метод [`casefold()`](https://python-all.ru/3.4/library/stdtypes.html#str.casefold): возвращает свернутую по регистру копию строки; свернутые строки могут использоваться для сравнения без учёта регистра. Например, `'ß'.casefold()` возвращает `'ss'`.532- Документация по последовательностям была существенно переписана, чтобы лучше объяснить различие между двоичными и текстовыми последовательностями и предоставить отдельные разделы документации для каждого встроенного типа последовательностей ([issue 4966](https://python-all.ru/3.4/whatsnew/3.3.html)).533534## Новые модули535536### faulthandler537538Этот новый модуль отладки [`faulthandler`](https://python-all.ru/3.4/library/faulthandler.html#module-faulthandler) содержит функции для явного дампа трассировок Python при ошибке (сбое, таком как segmentation fault), по тайм-ауту или по сигналу пользователя. Вызовите [`faulthandler.enable()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.enable) для установки обработчиков ошибок для сигналов `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS` и `SIGILL`. Также можно включить их при запуске, установив переменную окружения [`PYTHONFAULTHANDLER`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONFAULTHANDLER) или используя опцию командной строки [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) `faulthandler`.539540Пример ошибки сегментации в Linux:541542```python543$ python -q -X faulthandler544>>> import ctypes545>>> ctypes.string_at(0)546Fatal Python error: Segmentation fault547548Current thread 0x00007fb899f39700:549  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at550  File "<stdin>", line 1 in <module>551Segmentation fault552```553554### ipaddress555556Новый модуль [`ipaddress`](https://python-all.ru/3.4/library/ipaddress.html#module-ipaddress) предоставляет инструменты для создания и управления объектами, представляющими IPv4 и IPv6 адреса, сети и интерфейсы (т.е. IP-адрес, связанный с конкретной IP-подсетью).557558(Добавлено Google и Питером Муди в [**PEP 3144**](https://python-all.ru/3.4/whatsnew/3.3.html).)559560### lzma561562Недавно добавленный модуль [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma) предоставляет сжатие и распаковку данных с использованием алгоритма LZMA, включая поддержку форматов файлов `.xz` и `.lzma`.563564(Авторы: Nadeem Vawda и Per Øyvind Karlsen, [issue 6715](https://python-all.ru/3.4/whatsnew/3.3.html).)565566## Улучшенные модули567568### abc569570Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы, составленные из абстрактных методов. Теперь рекомендуется объявлять абстрактные дескрипторы, предоставляя `__isabstractmethod__` в качестве динамически обновляемого свойства. Встроенные дескрипторы были обновлены соответствующим образом.571572> - [`abc.abstractproperty`](https://python-all.ru/3.4/library/abc.html#abc.abstractproperty) устарело; вместо него используйте [`property`](https://python-all.ru/3.4/library/functions.html#property) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).573> - [`abc.abstractclassmethod`](https://python-all.ru/3.4/library/abc.html#abc.abstractclassmethod) устарело; вместо него используйте [`classmethod`](https://python-all.ru/3.4/library/functions.html#classmethod) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).574> - [`abc.abstractstaticmethod`](https://python-all.ru/3.4/library/abc.html#abc.abstractstaticmethod) устарело; вместо него используйте [`staticmethod`](https://python-all.ru/3.4/library/functions.html#staticmethod) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).575576(Автор: Darren Dale в [issue 11610](https://python-all.ru/3.4/whatsnew/3.3.html).)577578[`abc.ABCMeta.register()`](https://python-all.ru/3.4/library/abc.html#abc.ABCMeta.register) теперь возвращает зарегистрированный подкласс, а значит, его можно использовать как декоратор класса ([issue 10868](https://python-all.ru/3.4/whatsnew/3.3.html)).579580### array581582Модуль [`array`](https://python-all.ru/3.4/library/array.html#module-array) поддерживает тип `long long` с помощью кодов типа `q` и `Q`.583584(Авторы: Oren Tirosh и Hirokazu Yamamoto в [issue 1172711](https://python-all.ru/3.4/whatsnew/3.3.html).)585586### base64587588Функции декодирования современного интерфейса модуля [`base64`](https://python-all.ru/3.4/library/base64.html#module-base64) теперь принимают строки Unicode, содержащие только ASCII. Например, `base64.b64decode('YWJj')` возвращает `b'abc'`. (Автор: Catalin Iacob в [issue 13641](https://python-all.ru/3.4/whatsnew/3.3.html).)589590### binascii591592Помимо двоичных объектов, которые они обычно принимают, функции `a2b_` теперь также принимают на вход строки, содержащие только ASCII. (Автор: Antoine Pitrou в [issue 13637](https://python-all.ru/3.4/whatsnew/3.3.html).)593594### bz2595596Модуль [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2) был переписан с нуля. В процессе было добавлено несколько новых возможностей:597598- Новая функция [`bz2.open()`](https://python-all.ru/3.4/library/bz2.html#bz2.open): открывает сжатый bzip2 файл в двоичном или текстовом режиме.599- [`bz2.BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) теперь может читать из произвольных файлоподобных объектов и записывать в них с помощью аргумента конструктора *fileobj*.600601  (Автор: Nadeem Vawda в [issue 5863](https://python-all.ru/3.4/whatsnew/3.3.html).)602- [`bz2.BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) и [`bz2.decompress()`](https://python-all.ru/3.4/library/bz2.html#bz2.decompress) теперь могут декомпрессировать многопотоковые входные данные (например, созданные инструментом **pbzip2**). [`bz2.BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) теперь также можно использовать для создания файлов такого типа, используя режим `'a'` (добавление).603604  (Автор: Nir Aides в [issue 1625](https://python-all.ru/3.4/whatsnew/3.3.html).)605- [`bz2.BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) теперь реализует весь API [`io.BufferedIOBase`](https://python-all.ru/3.4/library/io.html#io.BufferedIOBase), за исключением методов `detach()` и `truncate()`.606607### codecs608609Кодек [`mbcs`](https://python-all.ru/3.4/library/codecs.html#module-encodings.mbcs) был переписан для корректной обработки обработчиков ошибок `replace` и `ignore` на всех версиях Windows. Кодек [`mbcs`](https://python-all.ru/3.4/library/codecs.html#module-encodings.mbcs) теперь поддерживает все обработчики ошибок, а не только `replace` для кодирования и `ignore` для декодирования.610611Добавлен новый кодек только для Windows: `cp65001` ([issue 13216](https://python-all.ru/3.4/whatsnew/3.3.html)). Это кодовая страница Windows 65001 (Windows UTF-8, `CP_UTF8`). Например, он используется `sys.stdout`, если кодовая страница вывода консоли установлена на cp65001 (например, с помощью команды `chcp 65001`).612613Многобайтовые декодеры CJK теперь быстрее ресинхронизируются. Они игнорируют только первый байт недопустимой последовательности байтов. Например, `b'\xff\n'.decode('gb2312', 'replace')` теперь возвращает `\n` после символа замены.614615([issue 12016](https://python-all.ru/3.4/whatsnew/3.3.html))616617Инкрементальные кодировщики кодеков CJK больше не сбрасываются при каждом вызове их метода encode(). Например:618619```python620$ ./python -q621>>> import codecs622>>> encoder = codecs.getincrementalencoder('hz')('strict')623>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')624b'~{NpJ)l6HK!#~} Bye.'625```626627В более старых версиях Python этот пример даёт `b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'`.628629([issue 12100](https://python-all.ru/3.4/whatsnew/3.3.html))630631Кодек `unicode_internal` устарел.632633### collections634635Добавлен новый класс [`ChainMap`](https://python-all.ru/3.4/library/collections.html#collections.ChainMap), позволяющий рассматривать несколько отображений как единое целое. (Написан Raymond Hettinger для [issue 11089](https://python-all.ru/3.4/whatsnew/3.3.html), опубликован в [issue 11297](https://python-all.ru/3.4/whatsnew/3.3.html).)636637Абстрактные базовые классы были перемещены в новый модуль [`collections.abc`](https://python-all.ru/3.4/library/collections.abc.html#module-collections.abc), чтобы лучше различать абстрактные и конкретные классы коллекций. Псевдонимы для абстрактных базовых классов всё ещё присутствуют в модуле [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) для сохранения существующих импортов. ([issue 11085](https://python-all.ru/3.4/whatsnew/3.3.html))638639Класс [`Counter`](https://python-all.ru/3.4/library/collections.html#collections.Counter) теперь поддерживает унарные операторы `+` и `-`, а также операторы с присваиванием `+=`, `-=`, `|=` и `&=`. (Автор: Raymond Hettinger в [issue 13121](https://python-all.ru/3.4/whatsnew/3.3.html).)640641### contextlib642643[`ExitStack`](https://python-all.ru/3.4/library/contextlib.html#contextlib.ExitStack) now provides a solid foundation for programmatic manipulation of context managers and similar cleanup functionality. Unlike the previous `contextlib.nested` API (which was deprecated and removed), the new API is designed to work correctly regardless of whether context managers acquire their resources in their `__init__` method (for example, file objects) or in their `__enter__` method (for example, synchronisation objects from the [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) module).644645([issue 13585](https://python-all.ru/3.4/whatsnew/3.3.html))646647### crypt648649Добавление соли и модульного формата crypt (метод хеширования) и функции [`mksalt()`](https://python-all.ru/3.4/library/crypt.html#crypt.mksalt) в модуль [`crypt`](https://python-all.ru/3.4/library/crypt.html#module-crypt).650651([issue 10924](https://python-all.ru/3.4/whatsnew/3.3.html))652653### curses654655> - Если модуль [`curses`](https://python-all.ru/3.4/library/curses.html#module-curses) слинкован с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например, `waddwstr()`), и функции для байтов в противном случае (например, `waddstr()`).656> - Используйте кодировку локали вместо `utf-8` для кодирования строк Unicode.657> - `curses.window` имеет новый атрибут [`curses.window.encoding`](https://python-all.ru/3.4/library/curses.html#curses.window.encoding).658> - Класс `curses.window` имеет новый метод [`get_wch()`](https://python-all.ru/3.4/library/curses.html#curses.window.get_wch) для получения широкого символа.659> - Модуль [`curses`](https://python-all.ru/3.4/library/curses.html#module-curses) имеет новую функцию [`unget_wch()`](https://python-all.ru/3.4/library/curses.html#curses.unget_wch) для возврата широкого символа, чтобы следующий вызов [`get_wch()`](https://python-all.ru/3.4/library/curses.html#curses.window.get_wch) вернул его.660661(Добавлено Iñigo Serna в [issue 6755](https://python-all.ru/3.4/whatsnew/3.3.html).)662663### datetime664665> - Сравнение на равенство между наивными и осведомлёнными (aware) экземплярами [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime) теперь возвращает [`False`](https://python-all.ru/3.4/library/constants.html#False) вместо возбуждения [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) ([issue 15006](https://python-all.ru/3.4/whatsnew/3.3.html)).666> - Новый метод [`datetime.datetime.timestamp()`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime.timestamp): возвращает POSIX-метку времени, соответствующую экземпляру [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime).667> - Метод [`datetime.datetime.strftime()`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime.strftime) поддерживает форматирование годов старше 1000.668> - Метод [`datetime.datetime.astimezone()`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime.astimezone) теперь можно вызывать без аргументов для преобразования экземпляра datetime в системный часовой пояс.669670### decimal671672**[issue 7652](https://python-all.ru/3.4/whatsnew/3.3.html) – интеграция быстрой нативной десятичной арифметики.**673674C-модуль и libmpdec написаны Stefan Krah.675676Новая версия модуля decimal на C включает в себя высокоскоростную библиотеку libmpdec которая обеспечивает арифметику с плавающей точкой произвольной точности и правильным округлением. libmpdec соответствует спецификации IBM General Decimal Arithmetic Specification.677678Прирост производительности составляет от 10 раз для приложений баз данных до 100 раз для вычислительно интенсивных приложений. Эти цифры – ожидаемый прирост для стандартных точностей, используемых в десятичной арифметике с плавающей точкой. Поскольку точность настраивается пользователем, точные значения могут отличаться. Например, в арифметике целых чисел произвольной точности разница может быть значительно больше.679680Приведённая ниже таблица предназначена для иллюстрации. Бенчмарки доступны по адресу [http://www.bytereef.org/mpdecimal/quickstart.html](https://python-all.ru/3.4/whatsnew/3.3.html).681682> |  | decimal.py | \_decimal | ускорение |683> | --- | --- | --- | --- |684> | pi | 42.02s | 0.345s | 120x |685> | telco | 172.19s | 5.68s | 30x |686> | psycopg | 3.57s | 0.29s | 12x |687688#### Возможности689690- Сигнал [`FloatOperation`](https://python-all.ru/3.4/library/decimal.html#decimal.FloatOperation) при необходимости включает более строгую семантику смешивания чисел с плавающей точкой и Decimal.691- Если Python скомпилирован без поддержки потоков, C-версия автоматически отключает дорогостоящий механизм локального контекста потоков. В этом случае переменная [`HAVE_THREADS`](https://python-all.ru/3.4/library/decimal.html#decimal.HAVE_THREADS) устанавливается в `False`.692693#### Изменения API694695- C-модуль имеет следующие ограничения контекста в зависимости от архитектуры машины:696697  > |  | 32-битный | 64-битный |698  > | --- | --- | --- |699  > | `MAX_PREC` | `425000000` | `999999999999999999` |700  > | `MAX_EMAX` | `425000000` | `999999999999999999` |701  > | `MIN_EMIN` | `-425000000` | `-999999999999999999` |702- В шаблонах контекстов ([`DefaultContext`](https://python-all.ru/3.4/library/decimal.html#decimal.DefaultContext), [`BasicContext`](https://python-all.ru/3.4/library/decimal.html#decimal.BasicContext) и [`ExtendedContext`](https://python-all.ru/3.4/library/decimal.html#decimal.ExtendedContext)) величина `Emax` и `Emin` изменилась на `999999`.703- Конструктор [`Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal) в decimal.py не соблюдает ограничения контекста и преобразует значения с произвольными показателями степени или точностью точно. Поскольку C-версия имеет внутренние ограничения, используется следующая схема: если возможно, значения преобразуются точно, в противном случае возбуждается [`InvalidOperation`](https://python-all.ru/3.4/library/decimal.html#decimal.InvalidOperation) и результат становится NaN. В последнем случае всегда можно использовать [`create_decimal()`](https://python-all.ru/3.4/library/decimal.html#decimal.Context.create_decimal) для получения округлённого или неточного значения.704- Функция возведения в степень в decimal.py всегда правильно округляется. В C-версии она определена через правильно округлённые функции [`exp()`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal.exp) и [`ln()`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal.ln), но конечный результат лишь «почти всегда правильно округлён».705- В C-версии словарь контекста, содержащий сигналы, является [`MutableMapping`](https://python-all.ru/3.4/library/collections.abc.html#collections.abc.MutableMapping). По соображениям скорости `flags` и `traps` всегда ссылаются на тот же [`MutableMapping`](https://python-all.ru/3.4/library/collections.abc.html#collections.abc.MutableMapping), с которым был инициализирован контекст. Если назначается новый словарь сигналов, `flags` и `traps` обновляются новыми значениями, но не ссылаются на словарь из правой части присваивания.706- Сериализация [`Context`](https://python-all.ru/3.4/library/decimal.html#decimal.Context) даёт другой вывод, чтобы обеспечить общий формат обмена для версий Python и C.707- Порядок аргументов в конструкторе [`Context`](https://python-all.ru/3.4/library/decimal.html#decimal.Context) изменён, чтобы соответствовать порядку, отображаемому [`repr()`](https://python-all.ru/3.4/library/functions.html#repr).708- Параметр `watchexp` в методе [`quantize()`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal.quantize) является устаревшим.709710### email711712#### Инфраструктура политик713714Пакет email теперь имеет инфраструктуру [`policy`](https://python-all.ru/3.4/library/email.policy.html#module-email.policy). Объект [`Policy`](https://python-all.ru/3.4/library/email.policy.html#email.policy.Policy) – это объект с несколькими методами и свойствами, которые управляют поведением пакета email. Основной политикой для Python 3.3 является [`Compat32`](https://python-all.ru/3.4/library/email.policy.html#email.policy.Compat32), которая обеспечивает обратную совместимость с пакетом email в Python 3.2. Политика `policy` может быть указана при разборе сообщения email с помощью [`parser`](https://python-all.ru/3.4/library/email.parser.html#module-email.parser), или при создании объекта [`Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message), или при сериализации email с помощью [`generator`](https://python-all.ru/3.4/library/email.generator.html#module-email.generator). Если не переопределено, политика, переданная `parser`, наследуется всеми объектами `Message` и подобъектами, созданными `parser`. По умолчанию `generator` использует политику объекта `Message`, который он сериализует. Политикой по умолчанию является `compat32`.715716Минимальный набор элементов управления, реализованных всеми объектами `policy`:717718> | max\_line\_length | Максимальная длина отдельных строк (без учёта символа(ов) разделителя строк), которую они могут иметь при сериализации `Message`. По умолчанию 78. |719> | --- | --- |720> | linesep | Символ, используемый для разделения отдельных строк при сериализации `Message`. По умолчанию `\n`. |721> | cte\_type | `7bit` или `8bit`. `8bit` применяется только к `Bytes` `generator` и означает, что не-ASCII может использоваться там, где это разрешено протоколом (или где оно присутствует во входных данных). |722> | raise\_on\_defect | Заставляет `parser` возбуждать ошибку при обнаружении дефектов, вместо добавления их в список `defects` объекта `Message`. |723724Новый экземпляр политики с новыми настройками создаётся с помощью метода [`clone()`](https://python-all.ru/3.4/library/email.policy.html#email.policy.Policy.clone) объектов политики. `clone` принимает любые из перечисленных выше элементов управления в качестве именованных аргументов. Любой элемент управления, не указанный в вызове, сохраняет своё значение по умолчанию. Таким образом, можно создать политику, использующую символы разделителя строк `\r\n`, например так:725726```python727mypolicy = compat32.clone(linesep='\r\n')728```729730Политики можно использовать, чтобы упростить создание сообщений в нужном формате. Вместо того чтобы помнить о необходимости указывать `linesep='\r\n'` везде, где вызывается `generator`, можно указать это один раз, установив политику, используемую `parser` или `Message`, в зависимости от того, что ваша программа использует для создания объектов `Message`. С другой стороны, если требуется создавать сообщения в нескольких формах, можно по-прежнему указывать параметры в соответствующем вызове `generator`. Или можно создать собственные экземпляры политики для разных случаев и передавать их при создании `generator`.731732#### Временная политика с новым API заголовков733734Хотя сама по себе структура политик (policy) представляет ценность, основная причина её введения – дать возможность создавать новые политики, реализующие новые возможности для пакета email, таким образом, чтобы сохранялась обратная совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в Python 3.3 как [*предварительную политику*](https://python-all.ru/3.4/glossary.html#term-provisional-package). Изменения, нарушающие обратную совместимость (вплоть до удаления кода), могут быть внесены, если основные разработчики сочтут это необходимым.735736Новые политики являются экземплярами [`EmailPolicy`](https://python-all.ru/3.4/library/email.policy.html#email.policy.EmailPolicy) и добавляют следующие дополнительные элементы управления:737738> | refold\_source | Управляет тем, будут ли заголовки, разобранные [`parser`](https://python-all.ru/3.4/library/email.parser.html#module-email.parser), переформатированы [`generator`](https://python-all.ru/3.4/library/email.generator.html#module-email.generator). Может быть `none`, `long` или `all`. По умолчанию `long`, что означает, что исходные заголовки со строкой длиннее `max_line_length` переформатируются. `none` означает, что ни одна строка не переформатируется, а `all` означает, что переформатируются все строки. |739> | --- | --- |740> | header\_factory | Вызываемый объект, который принимает `name` и `value` и создаёт пользовательский объект заголовка. |741742`header_factory` является ключом к новым возможностям, предоставляемым новыми политиками. Когда используется одна из новых политик, любой заголовок, полученный из объекта `Message`, является объектом, созданным `header_factory`, и каждый раз, когда заголовок устанавливается на `Message`, он становится объектом, созданным `header_factory`. Все такие объекты заголовков имеют атрибут `name`, равный имени заголовка. Заголовки Address и Date имеют дополнительные атрибуты, предоставляющие доступ к разобранным данным заголовка. Это означает, что теперь можно делать следующее:743744```python745>>> m = Message(policy=SMTP)746>>> m['To'] = 'Éric <foo@example.com>'747>>> m['to']748'Éric <foo@example.com>'749>>> m['to'].addresses750(Address(display_name='Éric', username='foo', domain='example.com'),)751>>> m['to'].addresses[0].username752'foo'753>>> m['to'].addresses[0].display_name754'Éric'755>>> m['Date'] = email.utils.localtime()756>>> m['Date'].datetime757datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))758>>> m['Date']759'Fri, 25 May 2012 21:44:27 -0400'760>>> print(m)761To: =?utf-8?q?=C3=89ric?= <foo@example.com>762Date: Fri, 25 May 2012 21:44:27 -0400763```764765Заметьте, что отображаемое имя в юникоде автоматически кодируется как `utf-8` при сериализации сообщения, но при прямом обращении к заголовку возвращается версия в юникоде. Это устраняет необходимость иметь дело с функциями [`email.header`](https://python-all.ru/3.4/library/email.header.html#module-email.header) [`decode_header()`](https://python-all.ru/3.4/library/email.header.html#email.header.decode_header) или [`make_header()`](https://python-all.ru/3.4/library/email.header.html#email.header.make_header).766767Также можно создавать адреса из частей:768769```python770>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),771...                           Address('Sally', 'sally', 'example.com')]),772...            Address('Bonzo', addr_spec='bonz@laugh.com')]773>>> print(m)774To: =?utf-8?q?=C3=89ric?= <foo@example.com>775Date: Fri, 25 May 2012 21:44:27 -0400776cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>777```778779Декодирование в Юникод выполняется автоматически:780781```python782>>> m2 = message_from_string(str(m))783>>> m2['to']784'Éric <foo@example.com>'785```786787При разборе сообщения можно использовать атрибуты `addresses` и `groups` объектов заголовка для доступа к группам и отдельным адресам:788789```python790>>> m2['cc'].addresses791(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))792>>> m2['cc'].groups793(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))794```795796В итоге, если вы используете одну из новых политик, работа с заголовками происходит так, как и должна: ваше приложение работает со строками Юникода, а пакет email прозрачно кодирует и декодирует Юникод в стандартные кодировки передачи содержимого (Content Transfer Encodings) RFC и обратно.797798#### Другие изменения API799800Новый `BytesHeaderParser`, добавленный в модуль [`parser`](https://python-all.ru/3.4/library/email.parser.html#module-email.parser) в дополнение к `HeaderParser` и для завершения Bytes API.801802Новые вспомогательные функции:803804> - [`format_datetime()`](https://python-all.ru/3.4/library/email.util.html#email.utils.format_datetime): на вход подаётся [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime), и функция возвращает строку, отформатированную для использования в заголовке электронного письма.805> - [`parsedate_to_datetime()`](https://python-all.ru/3.4/library/email.util.html#email.utils.parsedate_to_datetime): принимает строку с датой из заголовка email и преобразует её в «осведомлённый» [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime) или «наивный» [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime), если смещение равно `-0000`.806> - [`localtime()`](https://python-all.ru/3.4/library/email.util.html#email.utils.localtime): без аргументов возвращает текущее местное время как «осведомлённый» [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime) с использованием местного [`timezone`](https://python-all.ru/3.4/library/datetime.html#datetime.timezone). Если передан «осведомлённый» [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime), преобразует его в «осведомлённый» [`datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime) с использованием местного [`timezone`](https://python-all.ru/3.4/library/datetime.html#datetime.timezone).807808### ftplib809810- [`ftplib.FTP`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP) теперь принимает именованный аргумент `source_address` для указания `(host, port)`, который будет использоваться как исходный адрес в вызове bind при создании исходящего сокета. (Предложено Giampaolo Rodolà в [issue 8594](https://python-all.ru/3.4/whatsnew/3.3.html).)811- Класс [`FTP_TLS`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP_TLS) теперь предоставляет новую функцию [`ccc()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP_TLS.ccc) для возврата канала управления обратно в открытый текст. Это может быть полезно для использования межсетевых экранов, которые умеют обрабатывать NAT с небезопасным FTP без открытия фиксированных портов. (Предложено Giampaolo Rodolà в [issue 12139](https://python-all.ru/3.4/whatsnew/3.3.html).)812- Добавлен метод [`ftplib.FTP.mlsd()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.mlsd), который предоставляет разбираемый формат списка каталогов и объявляет устаревшими [`ftplib.FTP.nlst()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.nlst) и [`ftplib.FTP.dir()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.dir). (Предложено Giampaolo Rodolà в [issue 11072](https://python-all.ru/3.4/whatsnew/3.3.html).)813814### functools815816Декоратор [`functools.lru_cache()`](https://python-all.ru/3.4/library/functools.html#functools.lru_cache) теперь принимает именованный аргумент `typed` (по умолчанию `False`), чтобы кэшировать значения разных типов, которые сравниваются как равные, в отдельных слотах кэша. (Предложено Raymond Hettinger в [issue 13227](https://python-all.ru/3.4/whatsnew/3.3.html).)817818### gc819820Теперь можно зарегистрировать колбэки, вызываемые сборщиком мусора до и после сборки, используя новый список [`callbacks`](https://python-all.ru/3.4/library/gc.html#gc.callbacks).821822### hmac823824Добавлена новая функция [`compare_digest()`](https://python-all.ru/3.4/library/hmac.html#hmac.compare_digest) для предотвращения атак по сторонним каналам на дайджесты с помощью анализа времени выполнения. (Предложено Nick Coghlan и Christian Heimes в [issue 15061](https://python-all.ru/3.4/whatsnew/3.3.html).)825826### http827828[`http.server.BaseHTTPRequestHandler`](https://python-all.ru/3.4/library/http.server.html#http.server.BaseHTTPRequestHandler) теперь буферизует заголовки и записывает их все сразу при вызове [`end_headers()`](https://python-all.ru/3.4/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers). Новый метод [`flush_headers()`](https://python-all.ru/3.4/library/http.server.html#http.server.BaseHTTPRequestHandler.flush_headers) позволяет напрямую управлять моментом отправки накопленных заголовков. (Предложено Andrew Schaaf в [issue 3709](https://python-all.ru/3.4/whatsnew/3.3.html).)829830[`http.server`](https://python-all.ru/3.4/library/http.server.html#module-http.server) теперь генерирует корректный `HTML 4.01 strict` вывод. (Предложено Ezio Melotti в [issue 13295](https://python-all.ru/3.4/whatsnew/3.3.html).)831832[`http.client.HTTPResponse`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse) теперь имеет метод [`readinto()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse.readinto), что означает, что его можно использовать в качестве класса [`io.RawIOBase`](https://python-all.ru/3.4/library/io.html#io.RawIOBase). (Предложено John Kuhn в [issue 13464](https://python-all.ru/3.4/whatsnew/3.3.html).)833834### html835836[`html.parser.HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) теперь может разбирать повреждённую разметку без генерации ошибок, поэтому аргумент *strict* конструктора и исключение [`HTMLParseError`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParseError) теперь объявлены устаревшими. Возможность разбирать повреждённую разметку – результат ряда исправлений ошибок, которые также доступны в последних версиях с исправлениями для Python 2.7/3.2. (Предложено Ezio Melotti в [issue 15114](https://python-all.ru/3.4/whatsnew/3.3.html), и [issue 14538](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 13993](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 13960](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 13358](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 1745761](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 755670](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 13357](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 12629](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 1200313](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 670664](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 13273](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 12888](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 7311](https://python-all.ru/3.4/whatsnew/3.3.html).)837838Новый словарь [`html5`](https://python-all.ru/3.4/library/html.entities.html#html.entities.html5), который отображает именованные символьные ссылки HTML5 на эквивалентные символы Unicode (например, `html5['gt;'] == '>'`), добавлен в модуль [`html.entities`](https://python-all.ru/3.4/library/html.entities.html#module-html.entities). Этот словарь теперь также используется [`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser). (Предложено Ezio Melotti в [issue 11113](https://python-all.ru/3.4/whatsnew/3.3.html) и [issue 15156](https://python-all.ru/3.4/whatsnew/3.3.html).)839840### imaplib841842Конструктор [`IMAP4_SSL`](https://python-all.ru/3.4/library/imaplib.html#imaplib.IMAP4_SSL) теперь принимает параметр SSLContext для управления параметрами защищённого канала.843844(Предложено Sijin Joseph в [issue 8808](https://python-all.ru/3.4/whatsnew/3.3.html).)845846### inspect847848Добавлена новая функция [`getclosurevars()`](https://python-all.ru/3.4/library/inspect.html#inspect.getclosurevars). Эта функция сообщает текущие привязки всех имён, на которые есть ссылки из тела функции, и то, где эти имена были разрешены, что упрощает проверку корректности внутреннего состояния при тестировании кода, использующего замыкания с состоянием.849850(Предложено Meador Inge и Nick Coghlan в [issue 13062](https://python-all.ru/3.4/whatsnew/3.3.html).)851852Добавлена новая функция [`getgeneratorlocals()`](https://python-all.ru/3.4/library/inspect.html#inspect.getgeneratorlocals). Эта функция сообщает текущие привязки локальных переменных в стековом фрейме генератора, что упрощает проверку корректности внутреннего состояния при тестировании генераторов.853854(Предложено Meador Inge в [issue 15153](https://python-all.ru/3.4/whatsnew/3.3.html).)855856### io857858Функция [`open()`](https://python-all.ru/3.4/library/io.html#io.open) получила новый режим `'x'`, который можно использовать для монопольного создания нового файла; если файл уже существует, возбуждается исключение [`FileExistsError`](https://python-all.ru/3.4/library/exceptions.html#FileExistsError). Он основан на режиме 'x' из C11 для fopen().859860(Предложено David Townshend в [issue 12760](https://python-all.ru/3.4/whatsnew/3.3.html).)861862Конструктор класса [`TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper) имеет новый необязательный аргумент *write\_through*. Если *write\_through* равно `True`, вызовы `write()` гарантированно не буферизуются: любые данные, записанные в объект [`TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper), немедленно передаются его базовому бинарному буферу.863864### itertools865866Теперь [`accumulate()`](https://python-all.ru/3.4/library/itertools.html#itertools.accumulate) принимает необязательный аргумент `func`, позволяющий задать пользовательскую бинарную функцию.867868### logging869870Функция [`basicConfig()`](https://python-all.ru/3.4/library/logging.html#logging.basicConfig) теперь поддерживает необязательный аргумент `handlers`, принимающий итерируемый объект с обработчиками, которые будут добавлены в корневой логгер.871872В [`SysLogHandler`](https://python-all.ru/3.4/library/logging.handlers.html#logging.handlers.SysLogHandler) добавлен атрибут уровня класса `append_nul`, позволяющий управлять добавлением байта `NUL` (`\000`) к записям syslog: для одних демонов он обязателен, а для других – передаётся в лог.873874### math875876В модуле [`math`](https://python-all.ru/3.4/library/math.html#module-math) появилась новая функция [`log2()`](https://python-all.ru/3.4/library/math.html#math.log2), возвращающая двоичный логарифм *x*.877878(Автор – Марк Дикинсон, [issue 11888](https://python-all.ru/3.4/whatsnew/3.3.html).)879880### mmap881882Метод [`read()`](https://python-all.ru/3.4/library/mmap.html#mmap.mmap.read) теперь более совместим с другими объектами, похожими на файлы: если аргумент опущен или указан как `None`, возвращаются байты от текущей позиции файла до конца отображения. (Автор – Петри Лехтинен, [issue 12021](https://python-all.ru/3.4/whatsnew/3.3.html).)883884### multiprocessing885886Новая функция [`multiprocessing.connection.wait()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.connection.wait) позволяет опрашивать несколько объектов (например, соединения, сокеты и каналы) с таймаутом. (Автор – Ричард Оудкерк, [issue 12328](https://python-all.ru/3.4/whatsnew/3.3.html).)887888Объекты [`multiprocessing.Connection`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.Connection) теперь можно передавать через multiprocessing-соединения. (Автор – Ричард Оудкерк, [issue 4892](https://python-all.ru/3.4/whatsnew/3.3.html).)889890[`multiprocessing.Process`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.Process) теперь принимает именованный аргумент `daemon`, позволяющий переопределить стандартное поведение наследования флага `daemon` от родительского процесса ([issue 6064](https://python-all.ru/3.4/whatsnew/3.3.html)).891892Новый атрибут [`multiprocessing.Process.sentinel`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.Process.sentinel) позволяет программе ожидать несколько [`процессов`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.Process) одновременно, используя соответствующие примитивы ОС (например, [`select`](https://python-all.ru/3.4/library/select.html#module-select) в POSIX-системах).893894Новые методы [`multiprocessing.pool.Pool.starmap()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.pool.Pool.starmap) и [`starmap_async()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.pool.Pool.starmap_async) предоставляют эквиваленты [`itertools.starmap()`](https://python-all.ru/3.4/library/itertools.html#itertools.starmap) для существующих функций [`multiprocessing.pool.Pool.map()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.pool.Pool.map) и [`map_async()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.pool.Pool.map_async). (Автор – Гинек Шлавак, [issue 12708](https://python-all.ru/3.4/whatsnew/3.3.html).)895896### nntplib897898Класс [`nntplib.NNTP`](https://python-all.ru/3.4/library/nntplib.html#nntplib.NNTP) теперь поддерживает протокол менеджера контекста, чтобы безусловно поглощать исключения [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error) и закрывать NNTP-соединение после завершения:899900```python901>>> from nntplib import NNTP902>>> with NNTP('news.gmane.org') as n:903...     n.group('gmane.comp.python.committers')904...905('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')906>>>907```908909(Автор – Джампаоло Родола, [issue 9795](https://python-all.ru/3.4/whatsnew/3.3.html).)910911### os912913- В модуле [`os`](https://python-all.ru/3.4/library/os.html#module-os) появилась новая функция [`pipe2()`](https://python-all.ru/3.4/library/os.html#os.pipe2), которая позволяет атомарно создать канал с флагами [`O_CLOEXEC`](https://python-all.ru/3.4/library/os.html#os.O_CLOEXEC) или [`O_NONBLOCK`](https://python-all.ru/3.4/library/os.html#os.O_NONBLOCK). Это особенно полезно для предотвращения состояний гонки в многопоточных программах.914- В модуле [`os`](https://python-all.ru/3.4/library/os.html#module-os) появилась новая функция [`sendfile()`](https://python-all.ru/3.4/library/os.html#os.sendfile), которая предоставляет эффективный способ копирования данных из одного файлового (или сокетного) дескриптора в другой с использованием «нулевого копирования». Термин «нулевое копирование» означает, что всё копирование данных между двумя дескрипторами выполняется целиком ядром, без копирования данных в буферы пользовательского пространства. [`sendfile()`](https://python-all.ru/3.4/library/os.html#os.sendfile) можно использовать для эффективного копирования данных из файла на диске в сетевой сокет, например, для загрузки файла.915916  (Патч предоставлен Россом Лагерваллем и Джампаоло Родолой в [issue 10882](https://python-all.ru/3.4/whatsnew/3.3.html).)917- Для предотвращения состояний гонки (например, атак через символьные ссылки) и проблем с временными файлами и каталогами надёжнее (и быстрее) манипулировать файловыми дескрипторами, а не именами файлов. Python 3.3 расширяет существующие функции и вводит новые для работы с файловыми дескрипторами ([issue 4761](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 10755](https://python-all.ru/3.4/whatsnew/3.3.html) и [issue 14626](https://python-all.ru/3.4/whatsnew/3.3.html)).918919  - В модуле [`os`](https://python-all.ru/3.4/library/os.html#module-os) появилась новая функция [`fwalk()`](https://python-all.ru/3.4/library/os.html#os.fwalk), аналогичная [`walk()`](https://python-all.ru/3.4/library/os.html#os.walk), но также возвращающая файловые дескрипторы посещаемых каталогов. Это особенно полезно для предотвращения гонок символьных ссылок.920  - Следующие функции получили новые необязательные параметры *dir\_fd* ([*пути относительно дескрипторов каталогов*](https://python-all.ru/3.4/library/os.html#dir-fd)) и/или *follow\_symlinks* ([*не следовать символьным ссылкам*](https://python-all.ru/3.4/library/os.html#follow-symlinks)): [`access()`](https://python-all.ru/3.4/library/os.html#os.access), [`chflags()`](https://python-all.ru/3.4/library/os.html#os.chflags), [`chmod()`](https://python-all.ru/3.4/library/os.html#os.chmod), [`chown()`](https://python-all.ru/3.4/library/os.html#os.chown), [`link()`](https://python-all.ru/3.4/library/os.html#os.link), [`lstat()`](https://python-all.ru/3.4/library/os.html#os.lstat), [`mkdir()`](https://python-all.ru/3.4/library/os.html#os.mkdir), [`mkfifo()`](https://python-all.ru/3.4/library/os.html#os.mkfifo), [`mknod()`](https://python-all.ru/3.4/library/os.html#os.mknod), [`open()`](https://python-all.ru/3.4/library/os.html#os.open), [`readlink()`](https://python-all.ru/3.4/library/os.html#os.readlink), [`remove()`](https://python-all.ru/3.4/library/os.html#os.remove), [`rename()`](https://python-all.ru/3.4/library/os.html#os.rename), [`replace()`](https://python-all.ru/3.4/library/os.html#os.replace), [`rmdir()`](https://python-all.ru/3.4/library/os.html#os.rmdir), [`stat()`](https://python-all.ru/3.4/library/os.html#os.stat), [`symlink()`](https://python-all.ru/3.4/library/os.html#os.symlink), [`unlink()`](https://python-all.ru/3.4/library/os.html#os.unlink), [`utime()`](https://python-all.ru/3.4/library/os.html#os.utime). Поддержка платформы для использования этих параметров проверяется через наборы [`os.supports_dir_fd`](https://python-all.ru/3.4/library/os.html#os.supports_dir_fd) и `os.supports_follows_symlinks`.921  - Следующие функции теперь поддерживают файловый дескриптор в качестве аргумента пути: [`chdir()`](https://python-all.ru/3.4/library/os.html#os.chdir), [`chmod()`](https://python-all.ru/3.4/library/os.html#os.chmod), [`chown()`](https://python-all.ru/3.4/library/os.html#os.chown), [`execve()`](https://python-all.ru/3.4/library/os.html#os.execve), [`listdir()`](https://python-all.ru/3.4/library/os.html#os.listdir), [`pathconf()`](https://python-all.ru/3.4/library/os.html#os.pathconf), [`exists()`](https://python-all.ru/3.4/library/os.path.html#os.path.exists), [`stat()`](https://python-all.ru/3.4/library/os.html#os.stat), [`statvfs()`](https://python-all.ru/3.4/library/os.html#os.statvfs), [`utime()`](https://python-all.ru/3.4/library/os.html#os.utime). Поддержка этой возможности на платформе проверяется через набор [`os.supports_fd`](https://python-all.ru/3.4/library/os.html#os.supports_fd).922- [`access()`](https://python-all.ru/3.4/library/os.html#os.access) принимает именованный аргумент `effective_ids`, чтобы включить использование эффективного UID/GID вместо реального UID/GID при проверке доступа. Поддержка этой возможности на платформе проверяется через набор [`supports_effective_ids`](https://python-all.ru/3.4/library/os.html#os.supports_effective_ids).923- В модуле [`os`](https://python-all.ru/3.4/library/os.html#module-os) появились две новые функции: [`getpriority()`](https://python-all.ru/3.4/library/os.html#os.getpriority) и [`setpriority()`](https://python-all.ru/3.4/library/os.html#os.setpriority). Они позволяют получать или устанавливать приоритет/«nice» процесса аналогично [`os.nice()`](https://python-all.ru/3.4/library/os.html#os.nice), но распространяясь на все процессы, а не только на текущий.924925  (Патч предоставлен Джампаоло Родолой в [issue 10784](https://python-all.ru/3.4/whatsnew/3.3.html).)926- Новая функция [`os.replace()`](https://python-all.ru/3.4/library/os.html#os.replace) позволяет кроссплатформенное переименование файла с перезаписью целевого файла. При использовании [`os.rename()`](https://python-all.ru/3.4/library/os.html#os.rename) существующий целевой файл перезаписывается в POSIX, но вызывает ошибку в Windows. (Автор – Антуан Питру, [issue 8828](https://python-all.ru/3.4/whatsnew/3.3.html).)927- Семейство функций stat ([`stat()`](https://python-all.ru/3.4/library/os.html#os.stat), [`fstat()`](https://python-all.ru/3.4/library/os.html#os.fstat) и [`lstat()`](https://python-all.ru/3.4/library/os.html#os.lstat)) теперь поддерживает чтение временных меток файлов с наносекундной точностью. Симметрично, [`utime()`](https://python-all.ru/3.4/library/os.html#os.utime) теперь может записывать временные метки файлов с наносекундной точностью. (Автор – Ларри Хастингс, [issue 14127](https://python-all.ru/3.4/whatsnew/3.3.html)).928- Новая функция [`os.get_terminal_size()`](https://python-all.ru/3.4/library/os.html#os.get_terminal_size) запрашивает размер терминала, привязанного к файловому дескриптору. См. также [`shutil.get_terminal_size()`](https://python-all.ru/3.4/library/shutil.html#shutil.get_terminal_size). (Автор – Збигнев Енджеевский-Шмек, [issue 13609](https://python-all.ru/3.4/whatsnew/3.3.html).)929930- Новые функции для поддержки расширенных атрибутов Linux ([issue 12720](https://python-all.ru/3.4/whatsnew/3.3.html)): [`getxattr()`](https://python-all.ru/3.4/library/os.html#os.getxattr), [`listxattr()`](https://python-all.ru/3.4/library/os.html#os.listxattr), [`removexattr()`](https://python-all.ru/3.4/library/os.html#os.removexattr), [`setxattr()`](https://python-all.ru/3.4/library/os.html#os.setxattr).931- Новый интерфейс к планировщику. Эти функции управляют тем, как операционная система выделяет процессу процессорное время. Новые функции: [`sched_get_priority_max()`](https://python-all.ru/3.4/library/os.html#os.sched_get_priority_max), [`sched_get_priority_min()`](https://python-all.ru/3.4/library/os.html#os.sched_get_priority_min), [`sched_getaffinity()`](https://python-all.ru/3.4/library/os.html#os.sched_getaffinity), [`sched_getparam()`](https://python-all.ru/3.4/library/os.html#os.sched_getparam), [`sched_getscheduler()`](https://python-all.ru/3.4/library/os.html#os.sched_getscheduler), [`sched_rr_get_interval()`](https://python-all.ru/3.4/library/os.html#os.sched_rr_get_interval), [`sched_setaffinity()`](https://python-all.ru/3.4/library/os.html#os.sched_setaffinity), [`sched_setparam()`](https://python-all.ru/3.4/library/os.html#os.sched_setparam), [`sched_setscheduler()`](https://python-all.ru/3.4/library/os.html#os.sched_setscheduler), [`sched_yield()`](https://python-all.ru/3.4/library/os.html#os.sched_yield),932- Новые функции для управления файловой системой:933934  - [`posix_fadvise()`](https://python-all.ru/3.4/library/os.html#os.posix_fadvise): объявляет намерение обращаться к данным в определённом шаблоне, что позволяет ядру выполнить оптимизации.935  - [`posix_fallocate()`](https://python-all.ru/3.4/library/os.html#os.posix_fallocate): гарантирует, что для файла выделено достаточно дискового пространства.936  - [`sync()`](https://python-all.ru/3.4/library/os.html#os.sync): принудительно записывает всё на диск.937- Дополнительные новые функции POSIX:938939  - [`lockf()`](https://python-all.ru/3.4/library/os.html#os.lockf): устанавливает, проверяет или снимает блокировку POSIX на открытом файловом дескрипторе.940  - [`pread()`](https://python-all.ru/3.4/library/os.html#os.pread): читает из файлового дескриптора по смещению, при этом смещение файла не изменяется.941  - [`pwrite()`](https://python-all.ru/3.4/library/os.html#os.pwrite): записывает в файловый дескриптор начиная с заданного смещения, не изменяя смещение файла.942  - [`readv()`](https://python-all.ru/3.4/library/os.html#os.readv): читает из файлового дескриптора в несколько доступных для записи буферов.943  - [`truncate()`](https://python-all.ru/3.4/library/os.html#os.truncate): обрезает файл, соответствующий *path*, так, чтобы его размер не превышал *length* байт.944  - [`waitid()`](https://python-all.ru/3.4/library/os.html#os.waitid): ожидает завершения одного или нескольких дочерних процессов.945  - [`writev()`](https://python-all.ru/3.4/library/os.html#os.writev): записывает содержимое *buffers* в файловый дескриптор, где *buffers* – произвольная последовательность буферов.946  - [`getgrouplist()`](https://python-all.ru/3.4/library/os.html#os.getgrouplist) ([issue 9344](https://python-all.ru/3.4/whatsnew/3.3.html)): возвращает список идентификаторов групп, к которым принадлежит указанный пользователь.947- [`times()`](https://python-all.ru/3.4/library/os.html#os.times) и [`uname()`](https://python-all.ru/3.4/library/os.html#os.uname): тип возвращаемого значения изменён с кортежа на объект, подобный кортежу, с именованными атрибутами.948- Некоторые платформы теперь поддерживают дополнительные константы для [`lseek()`](https://python-all.ru/3.4/library/os.html#os.lseek) функции, такие как `os.SEEK_HOLE` и `os.SEEK_DATA`.949- Новые константы [`RTLD_LAZY`](https://python-all.ru/3.4/library/os.html#os.RTLD_LAZY), [`RTLD_NOW`](https://python-all.ru/3.4/library/os.html#os.RTLD_NOW), [`RTLD_GLOBAL`](https://python-all.ru/3.4/library/os.html#os.RTLD_GLOBAL), [`RTLD_LOCAL`](https://python-all.ru/3.4/library/os.html#os.RTLD_LOCAL), [`RTLD_NODELETE`](https://python-all.ru/3.4/library/os.html#os.RTLD_NODELETE), [`RTLD_NOLOAD`](https://python-all.ru/3.4/library/os.html#os.RTLD_NOLOAD) и [`RTLD_DEEPBIND`](https://python-all.ru/3.4/library/os.html#os.RTLD_DEEPBIND) доступны на поддерживающих их платформах. Они предназначены для использования с функцией [`sys.setdlopenflags()`](https://python-all.ru/3.4/library/sys.html#sys.setdlopenflags) и заменяют аналогичные константы, определённые в [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes) и `DLFCN`. (Автор: Victor Stinner в [issue 13226](https://python-all.ru/3.4/whatsnew/3.3.html).)950- [`os.symlink()`](https://python-all.ru/3.4/library/os.html#os.symlink) теперь принимает (и игнорирует) именованный аргумент `target_is_directory` на платформах, отличных от Windows, для упрощения кроссплатформенной поддержки.951952### pdb953954Автодополнение по табуляции теперь доступно не только для имён команд, но и для их аргументов. Например, для команды `break` дополняются имена функций и файлов.955956(Автор: Georg Brandl в [issue 14210](https://python-all.ru/3.4/whatsnew/3.3.html))957958### pickle959960Объекты [`pickle.Pickler`](https://python-all.ru/3.4/library/pickle.html#pickle.Pickler) теперь имеют необязательный атрибут [`dispatch_table`](https://python-all.ru/3.4/library/pickle.html#pickle.Pickler.dispatch_table), позволяющий задавать функции редукции для каждого упаковщика (pickler).961962(Автор: Richard Oudkerk в [issue 14166](https://python-all.ru/3.4/whatsnew/3.3.html).)963964### pydoc965966Графический интерфейс Tk и функция `serve()` были удалены из модуля [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc): `pydoc -g` и `serve()` были объявлены устаревшими в Python 3.2.967968### re969970Регулярные выражения [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) теперь поддерживают экранирование `\u` и `\U`.971972(Автор: Serhiy Storchaka в [issue 3665](https://python-all.ru/3.4/whatsnew/3.3.html).)973974### sched975976- [`run()`](https://python-all.ru/3.4/library/sched.html#sched.scheduler.run) теперь принимает параметр *blocking*, который при установке в False заставляет метод выполнить запланированные события, срок которых истекает ранее всего (если такие есть), и затем немедленно вернуться. Это полезно, если требуется использовать [`scheduler`](https://python-all.ru/3.4/library/sched.html#sched.scheduler) в неблокирующих приложениях. (Автор: Giampaolo Rodolà в [issue 13449](https://python-all.ru/3.4/whatsnew/3.3.html).)977- Класс [`scheduler`](https://python-all.ru/3.4/library/sched.html#sched.scheduler) теперь можно безопасно использовать в многопоточных средах. (Автор: Josiah Carlson и Giampaolo Rodolà в [issue 8684](https://python-all.ru/3.4/whatsnew/3.3.html).)978- Параметры *timefunc* и *delayfunct* конструктора класса [`scheduler`](https://python-all.ru/3.4/library/sched.html#sched.scheduler) теперь являются необязательными и по умолчанию равны [`time.time()`](https://python-all.ru/3.4/library/time.html#time.time) и [`time.sleep()`](https://python-all.ru/3.4/library/time.html#time.sleep) соответственно. (Автор: Chris Clark в [issue 13245](https://python-all.ru/3.4/whatsnew/3.3.html).)979- Параметр *argument* методов [`enter()`](https://python-all.ru/3.4/library/sched.html#sched.scheduler.enter) и [`enterabs()`](https://python-all.ru/3.4/library/sched.html#sched.scheduler.enterabs) теперь является необязательным. (Автор: Chris Clark в [issue 13245](https://python-all.ru/3.4/whatsnew/3.3.html).)980- Методы [`enter()`](https://python-all.ru/3.4/library/sched.html#sched.scheduler.enter) и [`enterabs()`](https://python-all.ru/3.4/library/sched.html#sched.scheduler.enterabs) теперь принимают параметр *kwargs*. (Автор: Chris Clark в [issue 13245](https://python-all.ru/3.4/whatsnew/3.3.html).)981982### select983984На платформах Solaris и производных появился новый класс [`select.devpoll`](https://python-all.ru/3.4/library/select.html#select.devpoll) для высокопроизводительных асинхронных сокетов через `/dev/poll`. (Автор: Jesús Cea Avión в [issue 6397](https://python-all.ru/3.4/whatsnew/3.3.html).)985986### shlex987988Ранее недокументированная вспомогательная функция `quote` из модуля [`pipes`](https://python-all.ru/3.4/library/pipes.html#module-pipes) была перемещена в модуль [`shlex`](https://python-all.ru/3.4/library/shlex.html#module-shlex) и задокументирована. Функция [`quote()`](https://python-all.ru/3.4/library/shlex.html#shlex.quote) правильно экранирует все символы в строке, которые в противном случае могли бы получить специальное значение от оболочки.989990### shutil991992- Новые функции:993994  - [`disk_usage()`](https://python-all.ru/3.4/library/shutil.html#shutil.disk_usage): предоставляет статистику общего, используемого и свободного дискового пространства. (Предложено Giampaolo Rodolà в [issue 12442](https://python-all.ru/3.4/whatsnew/3.3.html).)995  - [`chown()`](https://python-all.ru/3.4/library/shutil.html#shutil.chown): позволяет изменить пользователя и/или группу для указанного пути, указывая также имена пользователя/группы, а не только их числовые идентификаторы. (Предложено Sandro Tosi в [issue 12191](https://python-all.ru/3.4/whatsnew/3.3.html).)996  - [`shutil.get_terminal_size()`](https://python-all.ru/3.4/library/shutil.html#shutil.get_terminal_size): возвращает размер окна терминала, к которому привязан интерпретатор. (Предложено Zbigniew Jędrzejewski-Szmek в [issue 13609](https://python-all.ru/3.4/whatsnew/3.3.html).)997- [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) и [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) теперь сохраняют временные метки файлов с наносекундной точностью на платформах, которые это поддерживают. Они также сохраняют «расширенные атрибуты» файлов в Linux. (Предложено Larry Hastings в [issue 14127](https://python-all.ru/3.4/whatsnew/3.3.html) и [issue 15238](https://python-all.ru/3.4/whatsnew/3.3.html).)998- Несколько функций теперь принимают необязательный аргумент `symlinks`: когда этот параметр равен true, символические ссылки не разыменовываются, и вместо этого операция выполняется над самой символьной ссылкой (или создаёт её, если это уместно). (Предложено Hynek Schlawack в [issue 12715](https://python-all.ru/3.4/whatsnew/3.3.html).)999- При копировании файлов в другую файловую систему [`move()`](https://python-all.ru/3.4/library/shutil.html#shutil.move) теперь обрабатывает символьные ссылки так же, как команда posix `mv`: создаёт заново символьную ссылку, а не копирует содержимое целевого файла. (Предложено Jonathan Niehof в [issue 9993](https://python-all.ru/3.4/whatsnew/3.3.html).) [`move()`](https://python-all.ru/3.4/library/shutil.html#shutil.move) теперь также возвращает аргумент `dst` в качестве результата.1000- [`rmtree()`](https://python-all.ru/3.4/library/shutil.html#shutil.rmtree) теперь устойчива к атакам через символьные ссылки на платформах, поддерживающих новый параметр `dir_fd` в [`os.open()`](https://python-all.ru/3.4/library/os.html#os.open) и [`os.unlink()`](https://python-all.ru/3.4/library/os.html#os.unlink). (Предложено Martin von Löwis и Hynek Schlawack в [issue 4489](https://python-all.ru/3.4/whatsnew/3.3.html).)10011002### signal10031004- В модуль [`signal`](https://python-all.ru/3.4/library/signal.html#module-signal) добавлены новые функции:10051006  - [`pthread_sigmask()`](https://python-all.ru/3.4/library/signal.html#signal.pthread_sigmask): получить и/или изменить маску сигналов вызывающего потока (Предложено Jean-Paul Calderone в [issue 8407](https://python-all.ru/3.4/whatsnew/3.3.html));1007  - [`pthread_kill()`](https://python-all.ru/3.4/library/signal.html#signal.pthread_kill): отправить сигнал потоку;1008  - [`sigpending()`](https://python-all.ru/3.4/library/signal.html#signal.sigpending): проверить ожидающие сигналы;1009  - [`sigwait()`](https://python-all.ru/3.4/library/signal.html#signal.sigwait): ожидать сигнал;1010  - [`sigwaitinfo()`](https://python-all.ru/3.4/library/signal.html#signal.sigwaitinfo): ожидать сигнал, возвращая подробную информацию о нём;1011  - [`sigtimedwait()`](https://python-all.ru/3.4/library/signal.html#signal.sigtimedwait): как [`sigwaitinfo()`](https://python-all.ru/3.4/library/signal.html#signal.sigwaitinfo), но с таймаутом.1012- Обработчик сигнала записывает номер сигнала в виде одного байта вместо нулевого байта в файловый дескриптор пробуждения. Таким образом, можно ожидать более одного сигнала и узнавать, какие сигналы были вызваны.1013- [`signal.signal()`](https://python-all.ru/3.4/library/signal.html#signal.signal) и [`signal.siginterrupt()`](https://python-all.ru/3.4/library/signal.html#signal.siginterrupt) теперь вызывают OSError вместо RuntimeError: у OSError есть атрибут errno.10141015### smtpd10161017Модуль [`smtpd`](https://python-all.ru/3.4/library/smtpd.html#module-smtpd) теперь поддерживает [**RFC 5321**](https://python-all.ru/3.4/whatsnew/3.3.html) (расширенный SMTP) и [**RFC 1870**](https://python-all.ru/3.4/whatsnew/3.3.html) (расширение размера). В соответствии со стандартом, эти расширения включаются только в том случае, если клиент начинает сеанс с команды `EHLO`.10181019(Первоначальная поддержка `ELHO` от Alberto Trevino. Расширение размера от Juhana Jauhiainen. Значительная дополнительная работа над патчем от Michele Orrù и Dan Boswell. [issue 8739](https://python-all.ru/3.4/whatsnew/3.3.html))10201021### smtplib10221023Классы [`SMTP`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP), [`SMTP_SSL`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP_SSL) и [`LMTP`](https://python-all.ru/3.4/library/smtplib.html#smtplib.LMTP) теперь принимают именованный аргумент `source_address` для указания `(host, port)`, используемого в качестве исходного адреса при вызове bind для создания исходящего сокета. (Предложено Paulo Scardine в [issue 11281](https://python-all.ru/3.4/whatsnew/3.3.html).)10241025[`SMTP`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP) теперь поддерживает протокол управления контекстом, позволяя использовать экземпляр `SMTP` в инструкции `with`. (Предложено Giampaolo Rodolà в [issue 11289](https://python-all.ru/3.4/whatsnew/3.3.html).)10261027Конструктор [`SMTP_SSL`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP_SSL) и метод [`starttls()`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTP.starttls) теперь принимают параметр SSLContext для управления параметрами защищённого канала. (Предложено Kasun Herath в [issue 8809](https://python-all.ru/3.4/whatsnew/3.3.html).)10281029### socket10301031- Класс [`socket`](https://python-all.ru/3.4/library/socket.html#socket.socket) теперь предоставляет дополнительные методы для обработки вспомогательных данных, если это поддерживается нижележащей платформой:10321033  - [`sendmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.sendmsg)1034  - [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg)1035  - [`recvmsg_into()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg_into)10361037  (Предложено David Watson в [issue 6560](https://python-all.ru/3.4/whatsnew/3.3.html), на основе более раннего патча от Heiko Wundram)1038- Класс [`socket`](https://python-all.ru/3.4/library/socket.html#socket.socket) теперь поддерживает семейство протоколов PF\_CAN ([http://en.wikipedia.org/wiki/Socketcan](https://python-all.ru/3.4/whatsnew/3.3.html)) в Linux ([http://lwn.net/Articles/253425](https://python-all.ru/3.4/whatsnew/3.3.html)).10391040  (Предложено Матиасом Фуксом, обновлено Тиаго Гонсалвешем в [issue 10141](https://python-all.ru/3.4/whatsnew/3.3.html).)1041- Класс [`socket`](https://python-all.ru/3.4/library/socket.html#socket.socket) теперь поддерживает семейство протоколов PF\_RDS ([http://en.wikipedia.org/wiki/Reliable\_Datagram\_Sockets](https://python-all.ru/3.4/whatsnew/3.3.html) и [https://oss.oracle.com/projects/rds/](https://python-all.ru/3.4/whatsnew/3.3.html)).1042- Класс [`socket`](https://python-all.ru/3.4/library/socket.html#socket.socket) теперь поддерживает семейство протоколов `PF_SYSTEM` в OS X. (Предложено Майклом Годербауэром в [issue 13777](https://python-all.ru/3.4/whatsnew/3.3.html).)1043- Новая функция [`sethostname()`](https://python-all.ru/3.4/library/socket.html#socket.sethostname) позволяет установить имя хоста в системах Unix, если вызывающий процесс имеет достаточные привилегии. (Предложено Россом Лагерваллом в [issue 10866](https://python-all.ru/3.4/whatsnew/3.3.html).)10441045### socketserver10461047[`BaseServer`](https://python-all.ru/3.4/library/socketserver.html#socketserver.BaseServer) теперь имеет переопределяемый метод [`service_actions()`](https://python-all.ru/3.4/library/socketserver.html#socketserver.BaseServer.service_actions), который вызывается методом [`serve_forever()`](https://python-all.ru/3.4/library/socketserver.html#socketserver.BaseServer.serve_forever) в цикле обслуживания. `ForkingMixIn` теперь использует это для очистки зомби-процессов потомков. (Предложено Джастином Варкентином в [issue 11109](https://python-all.ru/3.4/whatsnew/3.3.html).)10481049### sqlite310501051Новый метод [`sqlite3.Connection`](https://python-all.ru/3.4/library/sqlite3.html#sqlite3.Connection) [`set_trace_callback()`](https://python-all.ru/3.4/library/sqlite3.html#sqlite3.Connection.set_trace_callback) можно использовать для захвата трассировки всех команд SQL, обработанных sqlite. (Предложено Торстеном Ландшоффом в [issue 11688](https://python-all.ru/3.4/whatsnew/3.3.html).)10521053### ssl10541055- Модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl) имеет две новые функции генерации случайных чисел:10561057  - [`RAND_bytes()`](https://python-all.ru/3.4/library/ssl.html#ssl.RAND_bytes): генерирует криптостойкие псевдослучайные байты.1058  - [`RAND_pseudo_bytes()`](https://python-all.ru/3.4/library/ssl.html#ssl.RAND_pseudo_bytes): генерирует псевдослучайные байты.10591060  (Предложено Виктором Стиннером в [issue 12049](https://python-all.ru/3.4/whatsnew/3.3.html).)1061- Модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl) теперь предоставляет более детальную иерархию исключений, чтобы упростить анализ различных типов ошибок. (Предложено Антуаном Питру в [issue 11183](https://python-all.ru/3.4/whatsnew/3.3.html).)1062- [`load_cert_chain()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_cert_chain) теперь принимает аргумент *password*, который используется, если закрытый ключ зашифрован. (Предложено Адамом Симпкинсом в [issue 12803](https://python-all.ru/3.4/whatsnew/3.3.html).)1063- Обмен ключами Диффи-Хеллмана, как обычный, так и на основе эллиптических кривых, теперь поддерживается через методы [`load_dh_params()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_dh_params) и [`set_ecdh_curve()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.set_ecdh_curve). (Предложено Антуаном Питру в [issue 13626](https://python-all.ru/3.4/whatsnew/3.3.html) и [issue 13627](https://python-all.ru/3.4/whatsnew/3.3.html).)1064- SSL-сокеты имеют новый метод [`get_channel_binding()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.get_channel_binding), позволяющий реализовать некоторые механизмы аутентификации, такие как SCRAM-SHA-1-PLUS. (Предложено Яцеком Конечным в [issue 12551](https://python-all.ru/3.4/whatsnew/3.3.html).)1065- Можно запросить алгоритм сжатия SSL, используемый SSL-сокетом, благодаря его новому методу [`compression()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.compression). Новый атрибут [`OP_NO_COMPRESSION`](https://python-all.ru/3.4/library/ssl.html#ssl.OP_NO_COMPRESSION) можно использовать для отключения сжатия. (Предложено Антуаном Питру в [issue 13634](https://python-all.ru/3.4/whatsnew/3.3.html).)1066- Добавлена поддержка расширения согласования следующего протокола с помощью метода [`ssl.SSLContext.set_npn_protocols()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.set_npn_protocols). (Предложено Колином Марком в [задаче 14204](https://python-all.ru/3.4/whatsnew/3.3.html).)1067- Ошибки SSL теперь можно легче анализировать благодаря атрибутам [`library`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLError.library) и [`reason`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLError.reason). (Предложено Антуаном Питру в [issue 14837](https://python-all.ru/3.4/whatsnew/3.3.html).)1068- Функция [`get_server_certificate()`](https://python-all.ru/3.4/library/ssl.html#ssl.get_server_certificate) теперь поддерживает IPv6. (Предложено Шарлем-Франсуа Натали в [issue 11811](https://python-all.ru/3.4/whatsnew/3.3.html).)1069- Новый атрибут [`OP_CIPHER_SERVER_PREFERENCE`](https://python-all.ru/3.4/library/ssl.html#ssl.OP_CIPHER_SERVER_PREFERENCE) позволяет настроить SSLv3-сокеты сервера на использование порядка шифров, предпочитаемого сервером, а не клиентом ([issue 13635](https://python-all.ru/3.4/whatsnew/3.3.html)).10701071### stat10721073Незадокументированная функция tarfile.filemode была перемещена в [`stat.filemode()`](https://python-all.ru/3.4/library/stat.html#stat.filemode). Её можно использовать для преобразования режима файла в строку вида ‘-rwxrwxrwx’.10741075(Предложено Джампаоло Родолой в [issue 14807](https://python-all.ru/3.4/whatsnew/3.3.html).)10761077### struct10781079Модуль [`struct`](https://python-all.ru/3.4/library/struct.html#module-struct) теперь поддерживает `ssize_t` и `size_t` с помощью новых кодов `n` и `N` соответственно. (Предложено Антуаном Питру в [issue 3163](https://python-all.ru/3.4/whatsnew/3.3.html).)10801081### подпроцесс10821083Строки команд теперь могут быть объектами bytes на платформах POSIX. (Предложено Виктором Стиннером в [issue 8513](https://python-all.ru/3.4/whatsnew/3.3.html).)10841085Новая константа [`DEVNULL`](https://python-all.ru/3.4/library/subprocess.html#subprocess.DEVNULL) позволяет подавлять вывод независимо от платформы. (Предложено Россом Лагерваллом в [issue 5870](https://python-all.ru/3.4/whatsnew/3.3.html).)10861087### sys10881089Модуль [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys) имеет новую [`thread_info`](https://python-all.ru/3.4/library/sys.html#sys.thread_info) [*структуру последовательности*](https://python-all.ru/3.4/glossary.html#term-struct-sequence), содержащую информацию о реализации потоков ([issue 11223](https://python-all.ru/3.4/whatsnew/3.3.html)).10901091### tarfile10921093[`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) теперь поддерживает кодировку `lzma` через модуль [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma). (Добавлено Ларсом Густебелем в [issue 5689](https://python-all.ru/3.4/whatsnew/3.3.html).)10941095### tempfile10961097Метод `truncate()` объекта [`tempfile.SpooledTemporaryFile`](https://python-all.ru/3.4/library/tempfile.html#tempfile.SpooledTemporaryFile) теперь принимает параметр `size`. (Добавлено Райаном Келли в [issue 9957](https://python-all.ru/3.4/whatsnew/3.3.html).)10981099### textwrap11001101В модуле [`textwrap`](https://python-all.ru/3.4/library/textwrap.html#module-textwrap) появилась новая функция [`indent()`](https://python-all.ru/3.4/library/textwrap.html#textwrap.indent), которая позволяет легко добавить общий префикс к выбранным строкам блока текста ([issue 13857](https://python-all.ru/3.4/whatsnew/3.3.html)).11021103### threading11041105[`threading.Condition`](https://python-all.ru/3.4/library/threading.html#threading.Condition), [`threading.Semaphore`](https://python-all.ru/3.4/library/threading.html#threading.Semaphore), [`threading.BoundedSemaphore`](https://python-all.ru/3.4/library/threading.html#threading.BoundedSemaphore), [`threading.Event`](https://python-all.ru/3.4/library/threading.html#threading.Event) и [`threading.Timer`](https://python-all.ru/3.4/library/threading.html#threading.Timer), которые раньше были фабричными функциями, возвращающими экземпляр класса, теперь являются классами и могут быть унаследованы. (Добавлено Эриком Араужо в [issue 10968](https://python-all.ru/3.4/whatsnew/3.3.html).)11061107Конструктор [`threading.Thread`](https://python-all.ru/3.4/library/threading.html#threading.Thread) теперь принимает именованный аргумент `daemon`, позволяющий переопределить поведение по умолчанию, при котором значение флага `deamon` наследуется от родительского потока ([issue 6064](https://python-all.ru/3.4/whatsnew/3.3.html)).11081109Ранее приватная функция `_thread.get_ident` теперь доступна как публичная функция [`threading.get_ident()`](https://python-all.ru/3.4/library/threading.html#threading.get_ident). Это устраняет несколько случаев прямого обращения к модулю `_thread` в stdlib. Сторонний код, использующий `_thread.get_ident`, также следует изменить для использования нового публичного интерфейса.11101111### time11121113[**PEP 418**](https://python-all.ru/3.4/whatsnew/3.3.html) добавил новые функции в модуль [`time`](https://python-all.ru/3.4/library/time.html#module-time):11141115- [`get_clock_info()`](https://python-all.ru/3.4/library/time.html#time.get_clock_info): получение информации о часах.1116- [`monotonic()`](https://python-all.ru/3.4/library/time.html#time.monotonic): монотонные часы (не могут идти назад) без влияния обновлений системных часов.1117- [`perf_counter()`](https://python-all.ru/3.4/library/time.html#time.perf_counter): счётчик производительности с максимально доступным разрешением для измерения коротких интервалов.1118- [`process_time()`](https://python-all.ru/3.4/library/time.html#time.process_time): сумма системного и пользовательского процессорного времени текущего процесса.11191120Другие новые функции:11211122- Функции [`clock_getres()`](https://python-all.ru/3.4/library/time.html#time.clock_getres), [`clock_gettime()`](https://python-all.ru/3.4/library/time.html#time.clock_gettime) и [`clock_settime()`](https://python-all.ru/3.4/library/time.html#time.clock_settime) с константами `CLOCK_xxx`. (Добавлено Виктором Стиннером в [issue 10278](https://python-all.ru/3.4/whatsnew/3.3.html).)11231124Для улучшения совместимости между платформами [`sleep()`](https://python-all.ru/3.4/library/time.html#time.sleep) теперь вызывает [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) при передаче отрицательного значения. Ранее это было ошибкой на POSIX, но приводило к бесконечному ожиданию на Windows.11251126### types11271128Добавлен новый класс [`types.MappingProxyType`](https://python-all.ru/3.4/library/types.html#types.MappingProxyType): прокси только для чтения отображения. ([issue 14386](https://python-all.ru/3.4/whatsnew/3.3.html))11291130Новые функции [`types.new_class()`](https://python-all.ru/3.4/library/types.html#types.new_class) и [`types.prepare_class()`](https://python-all.ru/3.4/library/types.html#types.prepare_class) поддерживают создание динамических типов в соответствии с PEP 3115. ([issue 14588](https://python-all.ru/3.4/whatsnew/3.3.html))11311132### unittest11331134[`assertRaises()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertRaises), [`assertRaisesRegex()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertRaisesRegex), [`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) теперь принимают именованный аргумент *msg* при использовании в качестве контекстных менеджеров. (Добавлено Эцио Мелотти и Уинстоном Эвертом в [issue 10775](https://python-all.ru/3.4/whatsnew/3.3.html).)11351136[`unittest.TestCase.run()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.run) теперь возвращает объект [`TestResult`](https://python-all.ru/3.4/library/unittest.html#unittest.TestResult).11371138### urllib11391140Класс [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request) теперь принимает аргумент *method*, используемый [`get_method()`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request.get_method) для определения HTTP-метода. Например, так можно отправить запрос `'HEAD'`:11411142```python1143>>> urlopen(Request('https://www.python.org', method='HEAD'))1144```11451146([issue 1673007](https://python-all.ru/3.4/whatsnew/3.3.html))11471148### webbrowser11491150Модуль [`webbrowser`](https://python-all.ru/3.4/library/webbrowser.html#module-webbrowser) поддерживает больше «браузеров»: Google Chrome (с именами **chrome**, **chromium**, **chrome-browser** или **chromium-browser** в зависимости от версии и операционной системы), а также универсальные запускатели **xdg-open** из проекта FreeDesktop.org и **gvfs-open**, который является обработчиком URI по умолчанию для GNOME 3. (Первое добавлено Арно Кальметтом в [issue 13620](https://python-all.ru/3.4/whatsnew/3.3.html), второе – Маттиасом Клозе в [issue 14493](https://python-all.ru/3.4/whatsnew/3.3.html).)11511152### xml.etree.ElementTree11531154Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) теперь по умолчанию импортирует свой ускоритель на C; больше нет необходимости явно импортировать `xml.etree.cElementTree` (этот модуль остаётся для обратной совместимости, но теперь он устарел). Кроме того, семейство методов `iter` класса [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) было оптимизировано (переписано на C). Документация модуля также была значительно улучшена: добавлены примеры и более подробные справочные сведения.11551156### zlib11571158Новый атрибут [`zlib.Decompress.eof`](https://python-all.ru/3.4/library/zlib.html#zlib.Decompress.eof) позволяет различать правильно сформированный сжатый поток и неполный или усечённый. (Добавлено Надимом Вавдой в [issue 12646](https://python-all.ru/3.4/whatsnew/3.3.html).)11591160Новый атрибут [`zlib.ZLIB_RUNTIME_VERSION`](https://python-all.ru/3.4/library/zlib.html#zlib.ZLIB_RUNTIME_VERSION) сообщает строку версии базовой библиотеки `zlib`, загруженной во время выполнения. (Добавлено Торстеном Ландшоффом в [issue 12306](https://python-all.ru/3.4/whatsnew/3.3.html).)11611162## Оптимизации11631164Добавлены значительные улучшения производительности:11651166- Благодаря [**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html) некоторые операции над строками Unicode были оптимизированы:11671168  - объём памяти уменьшается в 2–4 раза в зависимости от текста1169  - кодирование строки ASCII в UTF-8 больше не требует кодирования символов, представление UTF-8 совпадает с представлением ASCII1170  - кодировщик UTF-8 был оптимизирован1171  - повторение одного символа ASCII и получение подстроки ASCII-строки выполняется в 4 раза быстрее1172- UTF-8 теперь работает в 2–4 раза быстрее. Кодирование UTF-16 теперь до 10 раз быстрее.11731174  (Предложено Serhiy Storchaka, [issue 14624](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 14738](https://python-all.ru/3.4/whatsnew/3.3.html) и [issue 15026](https://python-all.ru/3.4/whatsnew/3.3.html).)11751176## Изменения в сборке и C API11771178Изменения процесса сборки Python и C API включают:11791180- Новая функция, связанная с [**PEP 3118**](https://python-all.ru/3.4/whatsnew/3.3.html):11811182  - [`PyMemoryView_FromMemory()`](https://python-all.ru/3.4/c-api/memoryview.html#c.PyMemoryView_FromMemory)1183- [**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html) добавил новые типы, макросы и функции Unicode:11841185  - API высокого уровня:11861187    - [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_CopyCharacters)1188    - [`PyUnicode_FindChar()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FindChar)1189    - [`PyUnicode_GetLength()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GetLength), [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1190    - [`PyUnicode_New()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_New)1191    - [`PyUnicode_Substring()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Substring)1192    - [`PyUnicode_ReadChar()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_ReadChar), [`PyUnicode_WriteChar()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_WriteChar)1193  - API низкого уровня:11941195    - [`Py_UCS1`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UCS1), [`Py_UCS2`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UCS2), [`Py_UCS4`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UCS4) типы1196    - [`PyASCIIObject`](https://python-all.ru/3.4/c-api/unicode.html#c.PyASCIIObject) и [`PyCompactUnicodeObject`](https://python-all.ru/3.4/c-api/unicode.html#c.PyCompactUnicodeObject) структуры1197    - [`PyUnicode_READY`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_READY)1198    - [`PyUnicode_FromKindAndData()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromKindAndData)1199    - [`PyUnicode_AsUCS4()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUCS4), [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUCS4Copy)1200    - [`PyUnicode_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_DATA), [`PyUnicode_1BYTE_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_1BYTE_DATA), [`PyUnicode_2BYTE_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_2BYTE_DATA), [`PyUnicode_4BYTE_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_4BYTE_DATA)1201    - [`PyUnicode_KIND`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_KIND) с перечислением `PyUnicode_Kind`: [`PyUnicode_WCHAR_KIND`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_WCHAR_KIND), [`PyUnicode_1BYTE_KIND`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_1BYTE_KIND), [`PyUnicode_2BYTE_KIND`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_2BYTE_KIND), [`PyUnicode_4BYTE_KIND`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_4BYTE_KIND)1202    - [`PyUnicode_READ`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_READ), [`PyUnicode_READ_CHAR`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_READ_CHAR), [`PyUnicode_WRITE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_WRITE)1203    - [`PyUnicode_MAX_CHAR_VALUE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_MAX_CHAR_VALUE)1204- [`PyArg_ParseTuple`](https://python-all.ru/3.4/c-api/arg.html#c.PyArg_ParseTuple) теперь принимает [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) для формата `c` ([issue 12380](https://python-all.ru/3.4/whatsnew/3.3.html)).12051206## Устарело12071208### Неподдерживаемые операционные системы12091210OS/2 и VMS больше не поддерживаются из-за отсутствия сопровождающего.12111212Windows 2000 и версии Windows, в которых `COMSPEC` указывает на `command.com`, больше не поддерживаются из-за затрат на сопровождение.12131214Поддержка OSF, объявленная устаревшей в версии 3.2, полностью удалена.12151216### Устаревшие модули, функции и методы Python12171218- Передача непустой строки в `object.__format__()` устарела, и в Python 3.4 это будет приводить к [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) ([issue 9856](https://python-all.ru/3.4/whatsnew/3.3.html)).1219- Кодек `unicode_internal` устарел из-за [**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html), используйте UTF-8, UTF-16 (`utf-16-le` или `utf-16-be`) или UTF-32 (`utf-32-le` или `utf-32-be`).1220- [`ftplib.FTP.nlst()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.nlst) и [`ftplib.FTP.dir()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.dir): используйте [`ftplib.FTP.mlsd()`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP.mlsd)1221- [`platform.popen()`](https://python-all.ru/3.4/library/platform.html#platform.popen): use the [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess) module. Check especially the [*Replacing Older Functions with the subprocess Module*](https://python-all.ru/3.4/library/subprocess.html#subprocess-replacements) section ([issue 11377](https://python-all.ru/3.4/whatsnew/3.3.html)).1222- [issue 13374](https://python-all.ru/3.4/whatsnew/3.3.html): Windows bytes API объявлен устаревшим в модуле [`os`](https://python-all.ru/3.4/library/os.html#module-os). Используйте имена файлов в Unicode вместо имён в байтах, чтобы не зависеть от кодовой страницы ANSI и иметь возможность использовать любые имена файлов.1223- [issue 13988](https://python-all.ru/3.4/whatsnew/3.3.html): Модуль `xml.etree.cElementTree` устарел. Ускоритель используется автоматически, когда он доступен.1224- Поведение [`time.clock()`](https://python-all.ru/3.4/library/time.html#time.clock) зависит от платформы: вместо неё используйте новую функцию [`time.perf_counter()`](https://python-all.ru/3.4/library/time.html#time.perf_counter) или [`time.process_time()`](https://python-all.ru/3.4/library/time.html#time.process_time), в зависимости от ваших потребностей, чтобы поведение было однозначным.1225- Функция [`os.stat_float_times()`](https://python-all.ru/3.4/library/os.html#os.stat_float_times) устарела.1226- Модуль [`abc`](https://python-all.ru/3.4/library/abc.html#module-abc):12271228  - [`abc.abstractproperty`](https://python-all.ru/3.4/library/abc.html#abc.abstractproperty) устарел, вместо него используйте [`property`](https://python-all.ru/3.4/library/functions.html#property) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).1229  - [`abc.abstractclassmethod`](https://python-all.ru/3.4/library/abc.html#abc.abstractclassmethod) устарел, вместо него используйте [`classmethod`](https://python-all.ru/3.4/library/functions.html#classmethod) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).1230  - [`abc.abstractstaticmethod`](https://python-all.ru/3.4/library/abc.html#abc.abstractstaticmethod) устарел, вместо него используйте [`staticmethod`](https://python-all.ru/3.4/library/functions.html#staticmethod) с [`abc.abstractmethod()`](https://python-all.ru/3.4/library/abc.html#abc.abstractmethod).1231- Пакет [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib):12321233  - [`importlib.abc.SourceLoader.path_mtime()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_mtime) теперь считается устаревшим, вместо него рекомендуется [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_stats), так как файлы байт-кода теперь хранят как время изменения, так и размер исходного файла, из которого был скомпилирован байт-код.12341235### Устаревшие функции и типы C API12361237Тип [`Py_UNICODE`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UNICODE) объявлен устаревшим в [**PEP 393**](https://python-all.ru/3.4/whatsnew/3.3.html) и будет удалён в Python 4. Все функции, использующие этот тип, устарели:12381239Функции и методы Unicode, использующие типы [`Py_UNICODE`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UNICODE) и [`Py_UNICODE*`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UNICODE):12401241- [`PyUnicode_FromUnicode`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromUnicode): используйте [`PyUnicode_FromWideChar()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromWideChar) или [`PyUnicode_FromKindAndData()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromKindAndData)1242- [`PyUnicode_AS_UNICODE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AS_UNICODE), [`PyUnicode_AsUnicode()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUnicode), [`PyUnicode_AsUnicodeAndSize()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUnicodeAndSize): используйте [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsWideCharString)1243- [`PyUnicode_AS_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AS_DATA): используйте [`PyUnicode_DATA`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_DATA) вместе с [`PyUnicode_READ`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_READ) и [`PyUnicode_WRITE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_WRITE)1244- [`PyUnicode_GET_SIZE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GET_SIZE), [`PyUnicode_GetSize()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GetSize): используйте [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GET_LENGTH) или [`PyUnicode_GetLength()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GetLength)1245- [`PyUnicode_GET_DATA_SIZE`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GET_DATA_SIZE): используйте `PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)` (работает только с подготовленными строками)1246- [`PyUnicode_AsUnicodeCopy()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUnicodeCopy): используйте [`PyUnicode_AsUCS4Copy()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUCS4Copy) или [`PyUnicode_AsWideCharString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsWideCharString)1247- `PyUnicode_GetMax()`12481249Функции и макросы для работы со строками Py\_UNICODE\*:12501251- `Py_UNICODE_strlen`: используйте [`PyUnicode_GetLength()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GetLength) или [`PyUnicode_GET_LENGTH`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_GET_LENGTH)1252- `Py_UNICODE_strcat`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromFormat)1253- `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`, `Py_UNICODE_COPY`: используйте [`PyUnicode_CopyCharacters()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_CopyCharacters) или [`PyUnicode_Substring()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Substring)1254- `Py_UNICODE_strcmp`: используйте [`PyUnicode_Compare()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Compare)1255- `Py_UNICODE_strncmp`: используйте [`PyUnicode_Tailmatch()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Tailmatch)1256- `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: используйте [`PyUnicode_FindChar()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FindChar)1257- `Py_UNICODE_FILL`: используйте [`PyUnicode_Fill()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Fill)1258- `Py_UNICODE_MATCH`12591260Кодировщики:12611262- [`PyUnicode_Encode()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Encode): используйте `PyUnicode_AsEncodedObject()`1263- [`PyUnicode_EncodeUTF7()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeUTF7)1264- [`PyUnicode_EncodeUTF8()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeUTF8): используйте [`PyUnicode_AsUTF8()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUTF8) или [`PyUnicode_AsUTF8String()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUTF8String)1265- [`PyUnicode_EncodeUTF32()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeUTF32)1266- [`PyUnicode_EncodeUTF16()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeUTF16)1267- `PyUnicode_EncodeUnicodeEscape:()`: используйте [`PyUnicode_AsUnicodeEscapeString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsUnicodeEscapeString)1268- `PyUnicode_EncodeRawUnicodeEscape:()`: используйте [`PyUnicode_AsRawUnicodeEscapeString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsRawUnicodeEscapeString)1269- [`PyUnicode_EncodeLatin1()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeLatin1): используйте [`PyUnicode_AsLatin1String()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsLatin1String)1270- [`PyUnicode_EncodeASCII()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeASCII): используйте [`PyUnicode_AsASCIIString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsASCIIString)1271- [`PyUnicode_EncodeCharmap()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeCharmap)1272- [`PyUnicode_TranslateCharmap()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_TranslateCharmap)1273- [`PyUnicode_EncodeMBCS()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeMBCS): используйте [`PyUnicode_AsMBCSString()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_AsMBCSString) или [`PyUnicode_EncodeCodePage()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_EncodeCodePage) (с `CP_ACP` в качестве кодовой страницы)1274- `PyUnicode_EncodeDecimal()`, [`PyUnicode_TransformDecimalToASCII()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_TransformDecimalToASCII)12751276### Устаревшие возможности12771278Код формата `'u'` модуля [`array`](https://python-all.ru/3.4/library/array.html#module-array) теперь устарел и будет удалён в Python 4 вместе с остальной частью API ([`Py_UNICODE`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UNICODE)).12791280## Переход на Python 3.312811282В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.12831284### Портирование кода Python12851286- Хэш-рандомизация включена по умолчанию. Установите переменную окружения [`PYTHONHASHSEED`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONHASHSEED) в значение `0`, чтобы отключить хэш-рандомизацию. См. также метод [`object.__hash__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__hash__).1287- [issue 12326](https://python-all.ru/3.4/whatsnew/3.3.html): в Linux sys.platform больше не содержит номер основной версии. Теперь это всегда 'linux' вместо 'linux2' или 'linux3' в зависимости от версии Linux, использованной для сборки Python. Замените sys.platform == 'linux2' на sys.platform.startswith('linux') или просто sys.platform == 'linux', если вам не нужно поддерживать более старые версии Python.1288- [issue 13847](https://python-all.ru/3.4/whatsnew/3.3.html), [issue 14180](https://python-all.ru/3.4/whatsnew/3.3.html): [`time`](https://python-all.ru/3.4/library/time.html#module-time) и [`datetime`](https://python-all.ru/3.4/library/datetime.html#module-datetime): [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError) теперь возбуждается вместо [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), если временная метка выходит за пределы диапазона. [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) теперь возбуждается, если функции C `gmtime()` или `localtime()` завершились ошибкой.1289- Средства поиска по умолчанию, используемые импортом, теперь используют кеш содержимого конкретного каталога. Если вы создаёте исходный файл Python или файл скомпилированного байт-кода, обязательно вызовите [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches), чтобы очистить кеш, и тогда средства поиска заметят новый файл.1290- [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) теперь использует полное имя модуля, который пытались импортировать. Тесты документации, проверяющие сообщение ImportError, нужно будет обновить, чтобы использовать полное имя модуля вместо только его хвостовой части.1291- Аргумент *index* функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) теперь по умолчанию равен 0 вместо -1 и больше не поддерживает отрицательные значения. Это было упущением: при реализации [**PEP 328**](https://python-all.ru/3.4/whatsnew/3.3.html) значение по умолчанию осталось равным -1. Если вам нужно продолжать выполнять относительный импорт, за которым следует абсолютный, выполните относительный импорт с индексом 1, а затем другой импорт с индексом 0. Однако предпочтительнее использовать [`importlib.import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module), а не вызывать [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) напрямую.1292- [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) больше не позволяет использовать значение индекса, отличное от 0, для модулей верхнего уровня. Например, `__import__('sys', level=1)` теперь является ошибкой.1293- Поскольку [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path) и [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) теперь по умолчанию содержат средства поиска, вам, скорее всего, захочется использовать `list.insert()` вместо `list.append()` для добавления в эти списки.1294- Поскольку теперь в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache) вставляется `None`, если вы очищаете записи в словаре путей, для которых нет средства поиска, вам нужно будет удалять ключи, связанные со значениями `None` **и** [`imp.NullImporter`](https://python-all.ru/3.4/library/imp.html#imp.NullImporter), для обратной совместимости. Это приведёт к дополнительным накладным расходам на старых версиях Python, которые повторно вставляют `None` в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache), где он представляет использование неявных средств поиска, но семантически это ничего не должно изменить.1295- [`importlib.abc.Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder) больше не определяет абстрактный метод *find\_module()*, который необходимо реализовать. Если вы полагались на то, что подклассы реализуют этот метод, обязательно сначала проверьте его существование. Однако, вероятно, вам сначала стоит проверить *find\_loader()*, если вы работаете с [*средствами поиска по записям пути*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder).1296- [`pkgutil`](https://python-all.ru/3.4/library/pkgutil.html#module-pkgutil) был переведён на использование [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) внутри. Это устраняет многие пограничные случаи, когда старое поведение эмуляции импорта PEP 302 не соответствовало поведению реальной системы импорта. Сама эмуляция импорта всё ещё присутствует, но теперь устарела. Функции [`pkgutil.iter_importers()`](https://python-all.ru/3.4/library/pkgutil.html#pkgutil.iter_importers) и [`pkgutil.walk_packages()`](https://python-all.ru/3.4/library/pkgutil.html#pkgutil.walk_packages) обрабатывают стандартные хуки импорта особым образом, так что они всё ещё поддерживаются, даже если не предоставляют нестандартный метод `iter_modules()`.1297- Давняя ошибка, связанная с соответствием RFC ([issue 1079](https://python-all.ru/3.4/whatsnew/3.3.html)), в синтаксическом анализе, выполняемом [`email.header.decode_header()`](https://python-all.ru/3.4/library/email.header.html#email.header.decode_header), была исправлена. Код, использующий стандартный идиом для преобразования закодированных заголовков в Unicode (`str(make_header(decode_header(h))`), не увидит изменений, но код, который смотрит на отдельные кортежи, возвращаемые decode\_header, увидит, что пробелы, предшествующие или следующие за разделами `ASCII`, теперь включены в раздел `ASCII`. Код, который строит заголовки с помощью `make_header`, также должен продолжать работать без изменений, поскольку `make_header` продолжает добавлять пробелы между разделами `ASCII` и не-`ASCII`, если их нет во входных строках.1298- [`email.utils.formataddr()`](https://python-all.ru/3.4/library/email.util.html#email.utils.formataddr) теперь выполняет правильное кодирование передачи содержимого, когда передаются не-`ASCII` отображаемые имена. Любой код, который полагался на предыдущее ошибочное поведение, сохраняющее не-`ASCII` юникод в отформатированной строке вывода, нужно будет изменить ([issue 1690608](https://python-all.ru/3.4/whatsnew/3.3.html)).1299- [`poplib.POP3.quit()`](https://python-all.ru/3.4/library/poplib.html#poplib.POP3.quit) теперь может вызывать ошибки протокола, как и все остальные методы `poplib`. Код, который предполагает, что `quit` не вызывает ошибки [`poplib.error_proto`](https://python-all.ru/3.4/library/poplib.html#poplib.error_proto), может потребовать изменения, если в конкретном приложении возникают ошибки на вызове `quit` ([issue 11291](https://python-all.ru/3.4/whatsnew/3.3.html)).1300- Аргумент `strict` функции [`email.parser.Parser`](https://python-all.ru/3.4/library/email.parser.html#email.parser.Parser), устаревший начиная с Python 2.4, наконец-то удалён.1301- Устаревший метод `unittest.TestCase.assertSameElements` был удалён.1302- Устаревшая переменная `time.accept2dyear` была удалена.1303- Устаревший атрибут `Context._clamp` был удалён из модуля [`decimal`](https://python-all.ru/3.4/library/decimal.html#module-decimal). Ранее он был заменён публичным атрибутом `clamp`. (См. [issue 8540](https://python-all.ru/3.4/whatsnew/3.3.html).)1304- Недокументированный внутренний вспомогательный класс `SSLFakeFile` был удалён из [`smtplib`](https://python-all.ru/3.4/library/smtplib.html#module-smtplib), поскольку его функциональность уже давно предоставляется напрямую [`socket.socket.makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile).1305- Передача отрицательного значения в [`time.sleep()`](https://python-all.ru/3.4/library/time.html#time.sleep) в Windows теперь вызывает ошибку вместо бесконечного ожидания. В POSIX это всегда вызывало ошибку.1306- Константа `ast.__version__` была удалена. Если вам нужно принимать решения, зависящие от версии AST, используйте [`sys.version_info`](https://python-all.ru/3.4/library/sys.html#sys.version_info) для принятия решения.1307- Код, который обходил тот факт, что модуль [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) использовал фабричные функции, путём создания подклассов закрытых классов, должен будет измениться, чтобы создавать подклассы теперь уже открытых классов.1308- Недокументированная отладочная инфраструктура в модуле threading была удалена, что упрощает код. Это не должно повлиять на рабочий код, но упоминается здесь на случай, если какие-либо отладочные фреймворки приложений взаимодействовали с ней ([issue 13550](https://python-all.ru/3.4/whatsnew/3.3.html)).13091310### Перенос кода на C13111312- В ходе изменений API буфера недокументированный член `smalltable` структуры [`Py_buffer`](https://python-all.ru/3.4/c-api/buffer.html#c.Py_buffer) был удалён, и компоновка `PyMemoryViewObject` изменилась.13131314  Все расширения, полагающиеся на соответствующие части в `memoryobject.h` или `object.h`, должны быть пересобраны.1315- В связи с [*PEP 393*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-393) тип [`Py_UNICODE`](https://python-all.ru/3.4/c-api/unicode.html#c.Py_UNICODE) и все функции, использующие этот тип, устарели (но останутся доступными как минимум на пять лет). Если вы использовали низкоуровневые Unicode API для создания и доступа к объектам Unicode и хотите воспользоваться преимуществами уменьшения объёма памяти, предоставляемыми PEP 393, вам необходимо преобразовать свой код в новый [*Unicode API*](https://python-all.ru/3.4/c-api/unicode.html).13161317  Однако, если вы использовали только высокоуровневые функции, такие как [`PyUnicode_Concat()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Concat), [`PyUnicode_Join()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_Join) или [`PyUnicode_FromFormat()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromFormat), ваш код автоматически воспользуется преимуществами новых представлений Unicode.1318- [`PyImport_GetMagicNumber()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_GetMagicNumber) теперь возвращает -1 в случае неудачи.1319- Поскольку отрицательное значение аргумента *level* функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) больше недопустимо, то же самое теперь относится и к [`PyImport_ImportModuleLevel()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_ImportModuleLevel). Это также означает, что значение *level*, используемое [`PyImport_ImportModuleEx()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_ImportModuleEx), теперь равно 0 вместо -1.13201321### Сборка расширений C13221323- Диапазон возможных имён файлов для C-расширений был сужен. Очень редко используемые варианты написания были подавлены: в POSIX файлы с именами `xxxmodule.so`, `xxxmodule.abi3.so` и `xxxmodule.cpython-*.so` больше не распознаются как реализующие модуль `xxx`. Если вы создавали такие файлы, вам нужно переключиться на другие варианты написания (т.е. удалить строку `module` из имён файлов).13241325  (реализовано в [issue 14040](https://python-all.ru/3.4/whatsnew/3.3.html).)13261327### Изменения параметров командной строки13281329- Флаг командной строки -Q и связанные с ним артефакты удалены. Код, проверяющий sys.flags.division\_warning, потребует обновления.13301331  ([issue 10998](https://python-all.ru/3.4/whatsnew/3.3.html), вклад Éric Araujo.)1332- Когда **python** запускается с [*-S*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-S), `import site` больше не добавляет специфические для сайта пути в пути поиска модулей. В предыдущих версиях это происходило.13331334  ([issue 11591](https://python-all.ru/3.4/whatsnew/3.3.html), предложено Carl Meyer с правками Éric Araujo.)1335