# Що нового в Python 3.3

У цій статті пояснюється нові функції в Python 3.3 порівняно з 3.2. Python 3.3 було випущено 29 вересня 2012 року. Щоб отримати повну інформацію, перегляньте журнал змін.

Дивись також

PEP 398 - Графік випуску Python 3.3

## Підсумок – основні моменти випуску

Нові функції синтаксису:

- Новий вираз `yield from` для генератора делегування.

- Синтаксис `u'unicode'` знову приймається для об’єктів `str`.

Нові бібліотечні модулі:

- `faulthandler` (допомагає налагодити низькорівневі збої)

- `ipaddress` (об’єкти високого рівня, що представляють IP-адреси та маски)

- `lzma` (стиснення даних за допомогою алгоритму XZ / LZMA)

- `unittest.mock` (замінити частини вашої тестованої системи на макетні об’єкти)

- `venv` (Python віртуальні середовища, як у популярному пакеті `virtualenv`)

Нові вбудовані функції:

- Перероблено ієрархію винятків вводу/виводу.

Покращення реалізації:

- Переписано import machinery на основі `importlib`.

- Більш компактні рядки Unicode.

- Більш компактні словники атрибутів.

Значно вдосконалені бібліотечні модулі:

- C Прискорювач для модуля decimal.

- Краще оброблення Юнікоду в модулі email (provisional).

Покращення безпеки:

- Хеш-рандомізація ввімкнена за замовчуванням.

Будь ласка, прочитайте повний список змін, які стосуються користувача.

## PEP 405: Віртуальні середовища

Virtual environments help create separate Python setups while sharing a system-wide base install, for ease of maintenance. Virtual environments have their own set of private site packages (i.e. locally installed libraries), and are optionally segregated from the system-wide site packages. Their concept and implementation are inspired by the popular `virtualenv` third-party package, but benefit from tighter integration with the interpreter core.

Цей PEP додає модуль `venv` для програмного доступу та сценарій `pyvenv` для доступу до командного рядка та адміністрування. Інтерпретатор Python перевіряє наявність файла `pyvenv.cfg`, існування якого сигналізує про основу дерева каталогів віртуального середовища.

Дивись також

PEP 405 - Віртуальні середовища Python

  PEP, написаний Карлом Майєром; реалізація Карла Мейєра та Віная Саджипа

## PEP 420: неявні пакети простору імен

Вбудована підтримка каталогів пакунків, які не потребують файлів маркерів `__init__.py` і можуть автоматично охоплювати кілька сегментів шляху (навіяні різними сторонніми підходами до пакетів простору імен, як описано в PEP 420)

Дивись також

PEP 420 - неявні пакети простору імен

  PEP, написаний Еріком В. Смітом; виконання Еріком В. Смітом і Баррі Варшау

## PEP 3118: Нова реалізація memoryview і документація протоколу буфера

Реалізацію PEP 3118 було значно покращено.

Нова реалізація memoryview комплексно виправляє всі проблеми власності та терміну служби динамічно розподілених полів у структурі Py_buffer, які призвели до кількох звітів про збої. Крім того, було виправлено кілька функцій, які виходили з ладу або повертали неправильні результати для несуміжного або багатовимірного введення.

Об’єкт memoryview тепер має сумісний з PEP-3118 getbufferproc(), який перевіряє тип запиту споживача. Було додано багато нових функцій, більшість із яких працюють у повному обсязі для несуміжних масивів і масивів із підзсувами.

Документацію оновлено, чітко прописані обов’язки як експортерів, так і споживачів. Прапори запиту буфера згруповані в основні та складені прапори. Пояснюється розташування пам’яті несуміжних і багатовимірних масивів у стилі NumPy.

### особливості

- Тепер підтримуються всі рідні специфікатори односимвольного формату в синтаксисі модуля struct (за бажанням із префіксом «@»).

- З деякими обмеженнями метод cast() дозволяє змінювати формат і форму C-суміжних масивів.

- Представлення багатовимірного списку підтримуються для будь-якого типу масиву.

- Багатовимірні порівняння підтримуються для будь-якого типу масиву.

- Одновимірні представлення пам’яті хешованих типів (тільки для читання) з форматами B, b або c тепер хешуються. (Надав Антуан Пітру в bpo-13411.)

- Arbitrary slicing of any 1-D arrays type is supported. For example, it is now possible to reverse a memoryview in O(1) by using a negative step.

### Зміни API

- Максимальна кількість вимірів офіційно обмежена 64.

- Представлення порожньої форми, кроків і підзсувів тепер є порожнім кортежем замість «Немає».

- Доступ до елемента memoryview у форматі «B» (байти без знаку) тепер повертає ціле число (відповідно до синтаксису модуля struct). Для повернення об’єкта bytes спочатку має бути приведено до „c“.

- Порівняння memoryview тепер використовує логічну структуру операндів і порівнює всі елементи масиву за значенням. Підтримуються всі рядки формату в синтаксисі модуля struct. Перегляди з нерозпізнаними рядками формату все ще дозволені, але завжди порівнюватимуться як нерівні, незалежно від вмісту подання.

- Щоб отримати додаткові зміни, перегляньте Зміни в API збірки та C і Перенесення коду C.

(Надав Стефан Крах у bpo-10181.)

Дивись також

PEP 3118 - Перегляд буферного протоколу

## PEP 393: Гнучке представлення рядків

Тип рядка Unicode змінено для підтримки кількох внутрішніх представлень залежно від символу з найбільшим порядковим номером Unicode (1, 2 або 4 байти) у представленому рядку. Це забезпечує економічне представлення у звичайних випадках, але дає доступ до повного UCS-4 у всіх системах. Для сумісності з існуючими API кілька представлень можуть існувати паралельно; з часом ця сумісність має бути припинена.

З боку Python ця зміна не повинна мати ніяких недоліків.

З боку C API PEP 393 повністю сумісний із попередніми версіями. Застарілий API має бути доступним щонайменше п’ять років. Програми, які використовують застарілий API, не отримають повної вигоди від зменшення обсягу пам’яті або, що ще гірше, можуть використовувати трохи більше пам’яті, оскільки Python, можливо, доведеться підтримувати дві версії кожного рядка (у застарілому форматі та в новому ефективному сховищі).

### Функціональність

Зміни, внесені PEP 393:

- Тепер Python завжди підтримує повний діапазон кодових точок Unicode, включно з кодами, що не є BMP (тобто від `U+0000` до `U+10FFFF`). Різниця між вузькими та широкими збірками більше не існує, і Python тепер поводиться як широка збірка, навіть під Windows.

- Зі смертю вузьких збірок проблеми, характерні для вузьких збірок, також були виправлені, наприклад:

  - `len()` тепер завжди повертає 1 для не-BMP символів, тому `len('\U0010FFFF') == 1`;

  - сурогатні пари не комбінуються повторно в рядкових літералах, тому `'\uDBFF\uDFFF' != '\U0010FFFF'`;

  - індексація або нарізка символів, відмінних від BMP, повертає очікуване значення, тому `'\U0010FFFF'[0]` тепер повертає `'\U0010FFFF'`, а не `'\uDBFF'`;

  - усі інші функції стандартної бібліотеки тепер правильно обробляють точки коду, відмінні від BMP.

- The value of `sys.maxunicode` is now always `1114111` (`0x10FFFF` in hexadecimal). The `PyUnicode_GetMax()` function still returns either `0xFFFF` or `0x10FFFF` for backward compatibility, and it should not be used with the new Unicode API (see bpo-13054).

- Прапорець `--with-wide-unicode` у `./configure` видалено.

### Продуктивність і використання ресурсів

Зберігання рядків Unicode тепер залежить від найвищої кодової точки в рядку:

- чисті рядки ASCII і Latin1 (`U+0000-U+00FF`) використовують 1 байт на кодову точку;

- Рядки BMP (`U+0000-U+FFFF`) використовують 2 байти на кодову точку;

- не-BMP-рядки (`U+10000-U+10FFFF`) використовують 4 байти на кодову точку.

Чистий ефект полягає в тому, що для більшості програм використання пам’яті для зберігання рядків має значно зменшитися – особливо порівняно з колишніми широкими збірками Unicode – оскільки в багатьох випадках рядки будуть чистим ASCII навіть у міжнародних контекстах (оскільки багато рядків зберігають нелюдську мову дані, наприклад фрагменти XML, заголовки HTTP, дані в кодуванні JSON тощо). Ми також сподіваємося, що це з тих самих причин підвищить ефективність кешу ЦП у нетривіальних програмах. Використання пам’яті Python 3.3 у два-три рази менше, ніж Python 3.2, і трохи краще, ніж Python 2.7, за порівняльним тестом Django (докладніше див. у PEP).

Дивись також

PEP 393 - Гнучке представлення рядків

  PEP, написаний Мартіном фон Льовісом; виконання Торстеном Беккером і Мартіном фон Льовісом.

## PEP 397: програма запуску Python для Windows

Інсталятор Python 3.3 Windows тепер містить програму запуску `py`, яку можна використовувати для запуску програм Python незалежно від версії.

Цей засіб запуску неявно викликається під час подвійного клацання файлів `*.py`. Якщо в системі встановлено лише одну версію Python, для запуску файлу використовуватиметься ця версія. Якщо встановлено декілька версій, за замовчуванням використовується найновіша версія, але це можна замінити, включивши в сценарій Python рядок shebang у стилі Unix.

Засіб запуску також можна використовувати явно з командного рядка як програму `py`. Запуск `py` дотримується тих самих правил вибору версії, що й неявний запуск сценаріїв, але більш конкретну версію можна вибрати шляхом передачі відповідних аргументів (наприклад, `-3` для запиту Python 3, коли Python 2 також встановлено, або `-2.6` для спеціального запиту попередньої версії Python, коли встановлено новішу версію).

Окрім засобу запуску, інсталятор Windows тепер містить опцію додавання щойно встановленого Python до системного ШЛЯХУ. (Надав Браян Кертін у bpo-3561.)

Дивись також

PEP 397 - програма запуску Python для Windows

  PEP, написаний Марком Хаммондом і Мартіном проти Льовіса; виконання Вінай Саджип.

Документація програми запуску: Python Launcher для Windows

Модифікація PATH інсталятора: Пошук виконуваного файлу Python

## PEP 3151: переробка ієрархії винятків ОС та вводу-виводу

Ієрархія винятків, викликаних помилками операційної системи, тепер є спрощеною та детальнішою.

Вам більше не потрібно турбуватися про вибір відповідного типу винятку між `OSError`, `IOError`, `EnvironmentError`, `WindowsError`, `mmap.error`, `socket.error` або `select.error`. Усі типи винятків тепер лише один: `OSError`. Інші імена зберігаються як псевдоніми з міркувань сумісності.

Крім того, тепер простіше виявити конкретну умову помилки. Замість того, щоб перевіряти атрибут `errno` (або `args[0]`) для певної константи з модуля `errno`, ви можете зловити відповідний підклас `OSError`. Доступні наступні підкласи:

- `BlockingIOError`

- `ChildProcessError`

- `ConnectionError`

- `FileExistsError`

- `FileNotFoundError`

- `InterruptedError`

- `IsADirectoryError`

- `NotADirectoryError`

- `PermissionError`

- `ProcessLookupError`

- `TimeoutError`

А сам `ConnectionError` має більш детальні підкласи:

- `Помилка BrokenPipeError`

- `ConnectionAbortedError`

- `ConnectionRefusedError`

- `ConnectionResetError`

Завдяки новим виняткам тепер можна уникнути звичайного використання `errno`. Наприклад, наступний код, написаний для Python 3.2:

    from errno import ENOENT, EACCES, EPERM

    try:
        with open("document.txt") as f:
            content = f.read()
    except IOError as err:
        if err.errno == ENOENT:
            print("document.txt file is missing")
        elif err.errno in (EACCES, EPERM):
            print("You are not allowed to read document.txt")
        else:
            raise

тепер можна записати без імпорту `errno` і без ручної перевірки атрибутів винятків:

    try:
        with open("document.txt") as f:
            content = f.read()
    except FileNotFoundError:
        print("document.txt file is missing")
    except PermissionError:
        print("You are not allowed to read document.txt")

Дивись також

PEP 3151 - Переробка ієрархії винятків ОС та вводу-виводу

  PEP написаний і реалізований Антуаном Пітру

## PEP 380: Синтаксис для делегування субгенератору

PEP 380 додає вираз `yield from`, дозволяючи generator делегувати частину своїх операцій іншому генератору. Це дозволяє розділити код, що містить `yield`, і розмістити його в іншому генераторі. Крім того, підгенератору дозволено повертати значення, і це значення стає доступним для делегуючого генератора.

Незважаючи на те, що вираз `yield from` розроблено в основному для використання під час делегування підгенератору, він фактично дозволяє делегувати довільним субітераторам.

Для простих ітераторів `yield from iterable` по суті є лише скороченою формою `for item in iterable: yield item`:

    >>> def g(x):
    ...     yield from range(x, 0, -1)
    ...     yield from range(x)
    ...
    >>> list(g(5))
    [5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

Однак, на відміну від звичайного циклу, `yield from` дозволяє підгенераторам отримувати надіслані та викинуті значення безпосередньо з області виклику та повертати остаточне значення зовнішньому генератору:

    >>> def accumulate():
    ...     tally = 0
    ...     while 1:
    ...         next = yield
    ...         if next is None:
    ...             return tally
    ...         tally += next
    ...
    >>> def gather_tallies(tallies):
    ...     while 1:
    ...         tally = yield from accumulate()
    ...         tallies.append(tally)
    ...
    >>> tallies = []
    >>> acc = gather_tallies(tallies)
    >>> next(acc)  # Ensure the accumulator is ready to accept values
    >>> for i in range(4):
    ...     acc.send(i)
    ...
    >>> acc.send(None)  # Finish the first tally
    >>> for i in range(5):
    ...     acc.send(i)
    ...
    >>> acc.send(None)  # Finish the second tally
    >>> tallies
    [6, 10]

Головний принцип, що керує цією зміною, полягає в тому, щоб дозволити навіть генераторам, які призначені для використання з методами `send` і `throw`, бути розділені на кілька підгенераторів так само легко, як одну велику функцію можна розділити на кілька підфункцій .

Дивись також

PEP 380 - Синтаксис для делегування підгенератору

  PEP, написаний Грегом Юінгом; впровадження Грегом Юінгом, інтегроване в 3.3 Рено Бланчем, Раяном Келлі та Ніком Когланом; документація Збігнєва Єнджеєвського-Шмека та Ніка Коглана

## PEP 409: Придушення контексту винятку

PEP 409 представляє новий синтаксис, який дозволяє вимкнути відображення зв’язаного виняткового контексту. Це дозволяє очистити повідомлення про помилки в програмах, які перетворюють типи винятків:

    >>> class D:
    ...     def __init__(self, extra):
    ...         self._extra_attributes = extra
    ...     def __getattr__(self, attr):
    ...         try:
    ...             return self._extra_attributes[attr]
    ...         except KeyError:
    ...             raise AttributeError(attr) from None
    ...
    >>> D({}).x
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 8, in __getattr__
    AttributeError: x

Без суфікса `from None` для придушення причини вихідний виняток відображатиметься за замовчуванням:

    >>> class C:
    ...     def __init__(self, extra):
    ...         self._extra_attributes = extra
    ...     def __getattr__(self, attr):
    ...         try:
    ...             return self._extra_attributes[attr]
    ...         except KeyError:
    ...             raise AttributeError(attr)
    ...
    >>> C({}).x
    Traceback (most recent call last):
      File "<stdin>", line 6, in __getattr__
    KeyError: 'x'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 8, in __getattr__
    AttributeError: x

Жодна можливість налагодження не втрачається, оскільки вихідний контекст винятку залишається доступним, якщо це необхідно (наприклад, якщо проміжна бібліотека неправильно приховала цінні основні деталі):

    >>> try:
    ...     D({}).x
    ... except AttributeError as exc:
    ...     print(repr(exc.__context__))
    ...
    KeyError('x',)

Дивись також

PEP 409 - Придушення контексту винятків

  PEP, написаний Ітаном Фурманом; реалізований Ітаном Фурманом і Ніком Когланом.

## PEP 414: Явні літерали Unicode

Щоб полегшити перехід від Python 2 для додатків Python, які підтримують Unicode і активно використовують літерали Unicode, Python 3.3 знову підтримує префікс «`u`» для рядкових літералів. Цей префікс не має семантичного значення в Python 3, він надається виключно для того, щоб зменшити кількість суто механічних змін під час переходу на Python 3, що полегшує розробникам зосередження на більш значущих семантичних змінах (таких як суворіше розділення двійкових за замовчуванням і текстові дані).

Дивись також

PEP 414 - Явні літерали Unicode

  PEP, автор Армін Ронашер.

## PEP 3155: Уточнена назва для класів і функцій

Functions and class objects have a new `__qualname__` attribute representing the «path» from the module top-level to their definition. For global functions and classes, this is the same as `__name__`. For other functions and classes, it provides better information about where they were actually defined, and how they might be accessible from the global scope.

Приклад із (незв’язаними) методами:

    >>> class C:
    ...     def meth(self):
    ...         pass
    ...
    >>> C.meth.__name__
    'meth'
    >>> C.meth.__qualname__
    'C.meth'

Приклад із вкладеними класами:

    >>> class C:
    ...     class D:
    ...         def meth(self):
    ...             pass
    ...
    >>> C.D.__name__
    'D'
    >>> C.D.__qualname__
    'C.D'
    >>> C.D.meth.__name__
    'meth'
    >>> C.D.meth.__qualname__
    'C.D.meth'

Приклад із вкладеними функціями:

    >>> def outer():
    ...     def inner():
    ...         pass
    ...     return inner
    ...
    >>> outer().__name__
    'inner'
    >>> outer().__qualname__
    'outer.<locals>.inner'

Рядкове подання цих об’єктів також змінено, щоб включити нову, більш точну інформацію:

    >>> str(C.D)
    "<class '__main__.C.D'>"
    >>> str(C.D.meth)
    '<function C.D.meth at 0x7f46b9fe31e0>'

Дивись також

PEP 3155 - Уточнена назва для класів і функцій

  PEP написаний і реалізований Антуаном Пітру.

## PEP 412: словник спільного використання ключів

Словники, які використовуються для зберігання атрибутів об’єктів, тепер можуть спільно використовувати частину свого внутрішнього сховища між собою (а саме ту частину, яка зберігає ключі та їхні відповідні хеші). Це зменшує споживання пам’яті програмами, які створюють багато екземплярів невбудованих типів.

Дивись також

PEP 412 - Словник зі спільним використанням ключів

  PEP написав і реалізував Марк Шеннон.

## PEP 362: Об’єкт підпису функції

Нова функція `inspect.signature()` робить інтроспекцію викликів Python легкою та простою. Підтримується широкий діапазон викликів: функції python, декоровані чи ні, класи та об’єкти `functools.partial()`. Нові класи `inspect.Signature`, `inspect.Parameter` і `inspect.BoundArguments` містять інформацію про підписи викликів, такі як анотації, значення за замовчуванням, типи параметрів і зв’язані аргументи, що значно спрощує написання декораторів і будь-якого коду, який перевіряє або змінює підписи викликів або аргументи.

Дивись також

PEP 362: - Об’єкт підпису функції

  PEP автори Бретт Кеннон, Юрій Селіванов, Ларрі Гастінгс, Джівон Сео; реалізував Юрій Селіванов.

## PEP 421: додавання sys.implementation

A new attribute on the `sys` module exposes details specific to the implementation of the currently running interpreter. The initial set of attributes on `sys.implementation` are `name`, `version`, `hexversion`, and `cache_tag`.

Метою `sys.implementation` є консолідація в один простір імен специфічних для реалізації даних, які використовуються стандартною бібліотекою. Це дозволяє різним реалізаціям Python набагато легше спільно використовувати одну стандартну бібліотечну базу коду. У початковому стані `sys.implementation` містить лише невелику частину даних, що стосуються реалізації. З часом це співвідношення зміниться, щоб зробити стандартну бібліотеку більш портативною.

Одним із прикладів покращеної переносимості стандартної бібліотеки є `cache_tag`. Починаючи з Python 3.3, `sys.implementation.cache_tag` використовується `importlib` для підтримки PEP 3147 відповідності. Будь-яка реалізація Python, яка використовує `importlib` для своєї вбудованої системи імпорту, може використовувати `cache_tag` для керування поведінкою кешування для модулів.

### SimpleNamespace

Реалізація `sys.implementation` також вводить новий тип у Python: `types.SimpleNamespace`. На відміну від простору імен на основі зіставлення, наприклад `dict`, `SimpleNamespace` базується на атрибутах, як `object`. Однак, на відміну від `object`, екземпляри `SimpleNamespace` доступні для запису. Це означає, що ви можете додавати, видаляти та змінювати простір імен за допомогою звичайного доступу до атрибутів.

Дивись також

PEP 421 - Додавання sys.implementation

  PEP написав і реалізував Ерік Сноу.

## Використання importlib як реалізації імпорту

bpo-2377 - Replace __import__ w/ importlib.__import__ bpo-13959 - Re-implement parts of `imp` in pure Python bpo-14605 - Make import machinery explicit bpo-14646 - Require loaders set __loader__ and __package__

Функція `__import__()` тепер підтримується `importlib.__import__()`. Ця робота призводить до завершення «фази 2» PEP 302. Ця зміна має багато переваг. По-перше, це дозволило відкрити більшу частину механізму, що забезпечує імпорт, замість того, щоб бути неявним і прихованим у коді C. Він також забезпечує єдину реалізацію для всіх віртуальних машин Python, які підтримують Python 3.3, допомагаючи покласти край будь-яким специфічним для віртуальних машин відхилень у семантиці імпорту. І, нарешті, це полегшує підтримку імпорту, дозволяючи відбутися майбутнє зростання.

Для звичайного користувача не повинно бути видимих змін у семантиці. Для тих, чий код наразі керує імпортом або викликає імпорт програмно, зміни коду, які можуть знадобитися, розглядаються в розділі «Перенесення коду Python» (Porting Python code) цього документа.

### Нові API

Однією з значних переваг цієї роботи є розкриття того, що необхідно для того, щоб оператор імпорту працював. Це означає, що різні імпортери, які колись були неявними, тепер повністю доступні як частина пакета `importlib`.

The abstract base classes defined in `importlib.abc` have been expanded to properly delineate between meta path finders and path entry finders by introducing `importlib.abc.MetaPathFinder` and `importlib.abc.PathEntryFinder`, respectively. The old ABC of `importlib.abc.Finder` is now only provided for backwards-compatibility and does not enforce any method requirements.

In terms of finders, `importlib.machinery.FileFinder` exposes the mechanism used to search for source and bytecode files of a module. Previously this class was an implicit member of `sys.path_hooks`.

Для завантажувачів новий абстрактний базовий клас `importlib.abc.FileLoader` допомагає написати завантажувач, який використовує файлову систему як механізм зберігання коду модуля. Завантажувач для вихідних файлів (`importlib.machinery.SourceFileLoader`), файлів байт-кодів без джерел (`importlib.machinery.SourcelessFileLoader`) і модулів розширення (`importlib.machinery.ExtensionFileLoader`) є тепер доступний для прямого використання.

`ImportError` тепер має атрибути `name` і `path`, які встановлюються, коли є відповідні дані для надання. У повідомленні про невдалі імпорти тепер буде міститися повна назва модуля, а не лише кінцева частина назви модуля.

The `importlib.invalidate_caches()` function will now call the method with the same name on all finders cached in `sys.path_importer_cache` to help clean up any stored state as necessary.

### Видимі зміни

Інформацію про потенційно необхідні зміни коду див. у розділі «Перенесення коду Python» (Porting Python code).

Beyond the expanse of what `importlib` now exposes, there are other visible changes to import. The biggest is that `sys.meta_path` and `sys.path_hooks` now store all of the meta path finders and path entry hooks used by import. Previously the finders were implicit and hidden within the C code of import instead of being directly exposed. This means that one can now easily remove or change the order of the various finders to fit one’s needs.

Ще одна зміна полягає в тому, що всі модулі мають атрибут `__loader__`, який зберігає завантажувач, використаний для створення модуля. PEP 302 було оновлено, щоб зробити цей атрибут обов’язковим для завантажувачів, тож у майбутньому, після оновлення завантажувачів сторонніх розробників, люди зможуть покладатися на існування атрибута. Однак до цього часу імпорт встановлює модуль після завантаження.

Тепер очікується, що завантажувачі встановлюють атрибут `__package__` з PEP 366. Знову ж таки, сам імпорт уже встановлює це для всіх завантажувачів із `importlib`, а сам імпорт встановлює атрибут після завантаження.

`None` is now inserted into `sys.path_importer_cache` when no finder can be found on `sys.path_hooks`. Since `imp.NullImporter` is not directly exposed on `sys.path_hooks` it could no longer be relied upon to always be available to use as a value representing no finder found.

Усі інші зміни стосуються семантичних змін, які слід враховувати під час оновлення коду для Python 3.3, і тому про них слід прочитати в розділі «Перенесення коду Python» (Porting Python code) цього документа.

(Реалізація Бреттом Кенноном)

## Інші зміни мови

Деякі менші зміни, внесені до основної мови Python:

- Added support for Unicode name aliases and named sequences. Both `unicodedata.lookup()` and `'\N{...}'` now resolve name aliases, and `unicodedata.lookup()` resolves named sequences too.

  (Надав Еціо Мелотті в bpo-12753.)

- Базу даних Unicode оновлено до UCD версії 6.1.0

- Порівняння рівності об’єктів `range()` тепер повертає результат, що відображає рівність базових послідовностей, створених цими об’єктами діапазону. (bpo-13201)

- Методи `count()`, `find()`, `rfind()`, `index()` і `rindex()` `bytes` і: Об’єкти `bytearray` тепер приймають ціле число від 0 до 255 як перший аргумент.

  (Надав Петрі Лехтінен у bpo-12170.)

- Методи `rjust()`, `ljust()` і `center()` `bytes` і `bytearray` тепер приймають `bytearray` для аргумент `fill`. (Надав Петрі Лехтінен у bpo-12380.)

- До `list` і `bytearray` додано нові методи: `copy()` і `clear()` (bpo-10516). Отже, `MutableSequence` тепер також визначає метод `clear()` (bpo-11388).

- Необроблені байтові літерали тепер можна записати `rb"..."`, а також `br"..."`.

  (Надав Антуан Пітру в bpo-13748.)

- `dict.setdefault()` тепер виконує лише один пошук для даного ключа, що робить його атомарним при використанні з вбудованими типами.

  (Надав Філіп Грущинський у bpo-13521.)

- Повідомлення про помилки, які видаються, коли виклик функції не відповідає сигнатурі функції, було значно покращено.

  (Надав Бенджамін Петерсон.)

## Точне блокування імпорту

Попередні версії CPython завжди покладалися на глобальне блокування імпорту. Це призвело до неочікуваних проблем, наприклад, взаємоблокування під час імпортування модуля викликало б виконання коду в іншому потоці як побічний ефект. Інколи використовувалися незграбні обхідні шляхи, наприклад функція C API `PyImport_ImportModuleNoBlock()`.

У Python 3.3 імпортування модуля потребує блокування кожного модуля. Це правильно серіалізує імпорт певного модуля з кількох потоків (запобігаючи виявленню неповністю ініціалізованих модулів), одночасно усуваючи вищезгадані незручності.

(Надав Антуан Пітру в bpo-9260.)

## Вбудовані функції та типи

- `open()` gets a new opener parameter: the underlying file descriptor for the file object is then obtained by calling opener with (file, flags). It can be used to use custom flags like `os.O_CLOEXEC` for example. The `'x'` mode was added: open for exclusive creation, failing if the file already exists.

- `print()`: додано аргумент ключового слова flush. Якщо аргумент ключового слова flush має значення true, потік примусово очищається.

- `hash()`: рандомізація хешу ввімкнена за замовчуванням, див. `object.__hash__()` і `PYTHONHASHSEED`.

- Тип `str` отримує новий метод `casefold()`: повертає згорнуту копію рядка, згорнуті рядки можна використовувати для зіставлення без регістру. Наприклад, `'ß'.casefold()` повертає `'ss'`.

- Документацію послідовності було суттєво переписано, щоб краще пояснити різницю між двійковою та текстовою послідовністю та надати окремі розділи документації для окремих вбудованих типів послідовностей (bpo-4966).

## Нові модулі

### обробник помилок

Цей новий модуль налагодження `faulthandler` містить функції для явного створення дампу трасування Python у разі помилки (збій, як помилка сегментації), після тайм-ауту або за сигналом користувача. Викличте `faulthandler.enable()`, щоб установити обробники помилок для `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS` і `SIGILL` сигнали. Ви також можете ввімкнути їх під час запуску, встановивши змінну середовища `PYTHONFAULTHANDLER` або використовуючи параметр командного рядка `-X` `faulthandler`.

Приклад помилки сегментації в Linux:

    $ python -q -X faulthandler
    >>> import ctypes
    >>> ctypes.string_at(0)
    Fatal Python error: Segmentation fault

    Current thread 0x00007fb899f39700:
      File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
      File "<stdin>", line 1 in <module>
    Segmentation fault

### IP-адреса

Новий модуль `ipaddress` надає інструменти для створення та керування об’єктами, що представляють адреси IPv4 та IPv6, мережі та інтерфейси (тобто IP-адресу, пов’язану з певною підмережею IP).

(Надано Google і Пітером Муді в PEP 3144.)

### lzma

The newly added `lzma` module provides data compression and decompression using the LZMA algorithm, including support for the `.xz` and `.lzma` file formats.

(Надім Вавда та Пер Ойвінд Карлсен у bpo-6715.)

## Покращені модулі

### абв

Покращена підтримка абстрактних базових класів, що містять дескриптори, складені за допомогою абстрактних методів. Рекомендованим підходом до оголошення абстрактних дескрипторів тепер є надання `__isabstractmethod__` як динамічно оновлюваної властивості. Вбудовані дескриптори були відповідно оновлені.

- `abc.abstractproperty` застаріло, замість цього використовуйте `property` з `abc.abstractmethod()`.

- `abc.abstractclassmethod` застаріло, замість нього використовуйте `classmethod` з `abc.abstractmethod()`.

- `abc.abstractstaticmethod` застарів, замість нього використовуйте `staticmethod` з `abc.abstractmethod()`.

(Надав Даррен Дейл у bpo-11610.)

`abc.ABCMeta.register()` тепер повертає зареєстрований підклас, що означає, що тепер його можна використовувати як декоратор класу (bpo-10868).

### масив

The `array` module supports the long long type using `q` and `Q` type codes.

(Надано Ореном Тірошем і Хірокадзу Ямамото в bpo-1172711.)

### база64

Функції декодування сучасного інтерфейсу `base64` тепер приймають рядки Unicode лише для ASCII. Наприклад, `base64.b64decode('YWJj')` повертає `b'abc`. (Надав Каталін Якоб у bpo-13641.)

### binascii

На додаток до двійкових об’єктів, які вони зазвичай приймають, усі функції `a2b_` тепер також приймають як вхідні рядки лише ASCII. (Надав Антуан Пітру в bpo-13637.)

### bz2

Модуль `bz2` було переписано з нуля. У процесі було додано кілька нових функцій:

- Нова функція `bz2.open()`: відкриває файл, стиснутий за допомогою bzip2, у двійковому або текстовому режимі.

- `bz2.BZ2File` тепер може читати та записувати довільні файлоподібні об’єкти за допомогою аргументу fileobj свого конструктора.

  (Надім Вавда в bpo-5863.)

- `bz2.BZ2File` і `bz2.decompress()` тепер можуть розпакувати багатопотокові вхідні дані (наприклад, створені інструментом pbzip2). `bz2.BZ2File` тепер також можна використовувати для створення цього типу файлу, використовуючи режим `'a'` (додавання).

  (Надано Nir Aides у bpo-1625.)

- `bz2.BZ2File` тепер реалізує всі API `io.BufferedIOBase`, крім методів `detach()` і `truncate()`.

### кодеки

Кодек `mbcs` було переписано для правильної обробки обробників помилок `replace` та `ignore` у всіх версіях Windows. Кодек `mbcs` тепер підтримує всі обробники помилок, замість лише `replace` для кодування та `ignore` для декодування.

Додано новий кодек лише для Windows: `cp65001` (bpo-13216). Це кодова сторінка Windows 65001 (Windows UTF-8, `CP_UTF8`). Наприклад, він використовується `sys.stdout`, якщо для кодової сторінки консолі встановлено значення cp65001 (наприклад, за допомогою команди `chcp 65001`).

Багатобайтові декодери CJK тепер повторно синхронізуються швидше. Вони ігнорують лише перший байт недійсної послідовності байтів. Наприклад, `b'\xff\n'.decode('gb2312', 'replace')` тепер повертає `\n` після символу заміни.

(bpo-12016)

Інкрементні кодеки CJK більше не скидаються під час кожного виклику методів encode(). Наприклад:

    >>> import codecs
    >>> encoder = codecs.getincrementalencoder('hz')('strict')
    >>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
    b'~{NpJ)l6HK!#~} Bye.'

Цей приклад дає `b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} До побачення.''` зі старішими версіями Python.

(bpo-12100)

Кодек `unicode_internal` застарів.

### колекції

Додано новий клас `ChainMap`, щоб дозволити обробляти кілька відображень як єдине ціле. (Написано Реймондом Геттінгером для bpo-11089, оприлюднено в bpo-11297.)

Базові абстрактні класи переміщено в новий модуль `collections.abc`, щоб краще розрізняти абстрактні та конкретні класи колекцій. Псевдоніми для ABC все ще присутні в модулі `collections`, щоб зберегти існуючий імпорт. (bpo-11085)

Клас `Counter` тепер підтримує унарні оператори `+` і `-`, а також оператори на місці `+=`, `-=`, `|=` і `&=`. (Надав Раймонд Геттінгер у bpo-13121.)

### contextlib

`ExitStack` тепер забезпечує міцну основу для програмного маніпулювання менеджерами контексту та подібними функціями очищення. На відміну від попереднього API `contextlib.nested` (який був застарілим і видалений), новий API розроблено для правильної роботи незалежно від того, чи менеджери контексту отримують свої ресурси в своєму методі `__init__` (наприклад, файлові об’єкти). або в їх методі `__enter__` (наприклад, об’єкти синхронізації з модуля `threading`).

(bpo-13585)

### склеп

Addition of salt and modular crypt format (hashing method) and the `mksalt()` function to the `crypt` module.

(bpo-10924)

### прокльони

- Якщо модуль `curses` пов’язано з бібліотекою ncursesw, використовуйте функції Unicode, коли передаються рядки або символи Unicode (наприклад, `waddwstr()`), і функції bytes в іншому випадку (наприклад, `waddstr()`).

- Використовуйте кодування мови замість `utf-8` для кодування рядків Unicode.

- `curses.window` має новий атрибут `curses.window.encoding`.

- Клас `curses.window` має новий метод `get_wch()` для отримання широкого символу

- Модуль `curses` має нову функцію `unget_wch()`, яка надсилає широкий символ, щоб наступний `get_wch()` повертав його

(Надав Іньїго Серна в bpo-6755.)

### дата, час

- Порівняння рівності між простими та обізнаними екземплярами `datetime` тепер повертає `False` замість того, щоб викликати `TypeError` (bpo-15006).

- Новий метод `datetime.datetime.timestamp()`: повертає позначку часу POSIX, що відповідає екземпляру `datetime`.

- Метод `datetime.datetime.strftime()` підтримує форматування років старше 1000.

- Метод `datetime.datetime.astimezone()` тепер можна викликати без аргументів для перетворення екземпляра datetime у системний часовий пояс.

### десятковий

bpo-7652 - інтегрувати швидку власну десяткову арифметику.

  C-module і libmpdec, написані Stefan Krah.

The new C version of the decimal module integrates the high speed libmpdec library for arbitrary precision correctly rounded decimal floating-point arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.

Performance gains range from 10x for database applications to 100x for numerically intensive applications. These numbers are expected gains for standard precisions used in decimal floating-point arithmetic. Since the precision is user configurable, the exact figures may vary. For example, in integer bignum arithmetic the differences can be significantly higher.

The following table is meant as an illustration. Benchmarks are available at https://www.bytereef.org/mpdecimal/quickstart.html.

> | decimal.py | _десятковий | прискорювати
> --- | --- | --- | ---
> пі | 42,02с | 0,345с | 120x
> телекомунікаційна компанія | 172,19с | 5,68с | 30x
> psycopg | 3,57с | 0,29 с | 12x

#### особливості

- Сигнал `FloatOperation` додатково вмикає суворішу семантику для змішування чисел з плаваючою точкою та десяткових знаків.

- If Python is compiled without threads, the C version automatically disables the expensive thread local context machinery. In this case, the variable `HAVE_THREADS` is set to `False`.

#### Зміни API

- Модуль C має такі контекстні обмеження, залежно від архітектури машини:

  > | 32-розрядний | 64-розрядний
  > --- | --- | ---
  > `MAX_PREC` | `425000000` | `999999999999999999`
  > `MAX_EMAX` | `425000000` | `999999999999999999`
  > `MIN_EMIN` | `-425000000` | `-999999999999999999`

- In the context templates (`DefaultContext`, `BasicContext` and `ExtendedContext`) the magnitude of `Emax` and `Emin` has changed to `999999`.

- Конструктор `Decimal` у decimal.py не дотримується контекстних обмежень і точно перетворює значення з довільним показником ступеня чи точністю. Оскільки версія C має внутрішні обмеження, використовується така схема: якщо можливо, значення перетворюються точно, інакше `InvalidOperation` викликається, і результатом є NaN. В останньому випадку завжди можна використовувати `create_decimal()`, щоб отримати округлене або неточне значення.

- The power function in decimal.py is always correctly rounded. In the C version, it is defined in terms of the correctly rounded `exp()` and `ln()` functions, but the final result is only «almost always correctly rounded».

- У версії C контекстний словник, що містить сигнали, є `MutableMapping`. З міркувань швидкості `flags` і `traps` завжди посилаються на той самий `MutableMapping`, яким було ініціалізовано контекст. Якщо призначено новий словник сигналів, `flags` і `traps` оновлюються новими значеннями, але вони не посилаються на словник RHS.

- Видалення `Context` створює інший вихід, щоб мати загальний формат обміну для версій Python і C.

- Порядок аргументів у конструкторі `Context` змінено відповідно до порядку, який відображає `repr()`.

- Параметр `watchexp` у методі `quantize()` застарів.

### електронною поштою

#### Рамкова політика

Пакет електронної пошти тепер має структуру `policy`. `Policy` — це об’єкт із кількома методами та властивостями, які контролюють поведінку пакета електронної пошти. Основною політикою для Python 3.3 є політика `Compat32`, яка забезпечує зворотну сумісність із пакетом електронної пошти в Python 3.2. `Політику` можна вказати, коли повідомлення електронної пошти аналізується `parser`, або коли створюється об’єкт `Message`, або коли електронний лист серіалізовано за допомогою `generator`. Якщо політика, передана аналізатору, не перевизначена, успадковується всіма об’єктами Message і підоб’єктами, створеними синтаксичним аналізатором. За замовчуванням `генератор` використовуватиме політику об’єкта `Message`, який він серіалізує. Політика за умовчанням: `compat32`.

Мінімальний набір елементів керування, реалізований усіма об’єктами `policy`:

максимальна_довжина_рядка | Максимальна довжина окремих рядків, за винятком символів рядків, може бути у серіалізованому `повідомленні`. За замовчуванням 78.
linesep | Символ, який використовується для розділення окремих рядків, коли `Message` серіалізується. За замовчуванням `\n`.
cte_type | `7bit` або `8bit`. `8bit` застосовується лише до `генератора` `Bytes` і означає, що не-ASCII може використовуватися там, де це дозволено протоколом (або там, де воно існує у вихідному введенні).
підвищення_на_дефект | Примушує `аналізатор` викликати помилку, коли трапляються дефекти, замість того, щоб додавати їх до списку `дефектів` об’єкта `Message`.

Новий екземпляр політики з новими налаштуваннями створюється за допомогою методу об’єктів політики `clone()`. `clone` приймає будь-який із наведених вище елементів керування як аргумент ключового слова. Будь-який елемент керування, не вказаний у виклику, зберігає значення за замовчуванням. Таким чином, ви можете створити політику, яка використовує символи рядка `\r\n`, як це:

    mypolicy = compat32.clone(linesep='\r\n')

Політики можна використовувати для спрощення створення повідомлень у форматі, необхідному вашій програмі. Замість того, щоб не забувати вказувати `linesep='\r\n'` у всіх місцях, які ви називаєте `генератором`, ви можете вказати його один раз, коли ви встановлюєте політику, яку використовує `'парсер'` або `Message`, залежно від того, що ваша програма використовує для створення об’єктів `Message`. З іншого боку, якщо вам потрібно генерувати повідомлення в кількох формах, ви можете вказати параметри у відповідному виклику `generator`. Або ви можете мати спеціальні екземпляри політики для різних випадків і передати їх під час створення `генератора`.

#### Попередня політика з новим API заголовка

Незважаючи на те, що структура політики сама по собі варта уваги, головною мотивацією для її впровадження є можливість створення нових політик, які реалізують нові функції для пакета електронної пошти таким чином, щоб підтримувати зворотну сумісність для тих, хто не використовує нові політики. Оскільки нові політики вводять новий API, ми випускаємо їх у Python 3.3 як попередню політику. Зворотні несумісні зміни (аж до видалення коду) можуть відбуватися, якщо основні розробники вважають це за потрібне.

Нові політики є екземплярами `EmailPolicy` і додають такі додаткові елементи керування:

refold_source | Контролює, чи заголовки, які розбираються `parser`, повторно згортаються `generator`. Це може бути `none`, `long` або `all`. Типовим значенням є `long`, що означає, що вихідні заголовки з рядком, довшим за `max_line_length`, згортаються повторно. `none` означає, що жоден рядок не буде повторно згорнутий, а `all` означає, що всі рядки будуть повторно згорнуті.
header_factory | Викликається, що приймає `ім’я` і `значення` і створює спеціальний об’єкт заголовка.

`header_factory` є ключем до нових функцій, наданих новими політиками. Коли використовується одна з нових політик, будь-який заголовок, отриманий з об’єкта `Message`, є об’єктом, створеним `header_factory`, і щоразу, коли ви встановлюєте заголовок `Message`, він стає об’єктом створений `header_factory`. Усі такі об’єкти заголовка мають атрибут `name`, що дорівнює імені заголовка. Заголовки Address і Date мають додаткові атрибути, які надають вам доступ до проаналізованих даних заголовка. Це означає, що тепер ви можете робити такі речі:

    >>> m = Message(policy=SMTP)
    >>> m['To'] = 'Éric <foo@example.com>'
    >>> m['to']
    'Éric <foo@example.com>'
    >>> m['to'].addresses
    (Address(display_name='Éric', username='foo', domain='example.com'),)
    >>> m['to'].addresses[0].username
    'foo'
    >>> m['to'].addresses[0].display_name
    'Éric'
    >>> m['Date'] = email.utils.localtime()
    >>> m['Date'].datetime
    datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
    >>> m['Date']
    'Fri, 25 May 2012 21:44:27 -0400'
    >>> print(m)
    To: =?utf-8?q?=C3=89ric?= <foo@example.com>
    Date: Fri, 25 May 2012 21:44:27 -0400

Ви помітите, що відображуване ім’я Unicode автоматично кодується як `utf-8`, коли повідомлення серіалізується, але коли до заголовка звертається безпосередньо, ви отримуєте версію Unicode. Це усуває будь-яку потребу працювати з функціями `email.header` `decode_header()` або `make_header()`.

Ви також можете створювати адреси з частин:

    >>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
    ...                           Address('Sally', 'sally', 'example.com')]),
    ...            Address('Bonzo', addr_spec='bonz@laugh.com')]
    >>> print(m)
    To: =?utf-8?q?=C3=89ric?= <foo@example.com>
    Date: Fri, 25 May 2012 21:44:27 -0400
    cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>

Декодування в Юнікод виконується автоматично:

    >>> m2 = message_from_string(str(m))
    >>> m2['to']
    'Éric <foo@example.com>'

Коли ви аналізуєте повідомлення, ви можете використовувати атрибути `addresses` і `groups` об’єктів заголовка для доступу до груп та окремих адрес:

    >>> m2['cc'].addresses
    (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'))
    >>> m2['cc'].groups
    (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'),))

Підсумовуючи, якщо ви використовуєте одну з нових політик, маніпулювання заголовками працює так, як і повинно бути: ваша програма працює з рядками Unicode, а пакет електронної пошти прозоро кодує та декодує Unicode до стандарту RFC Content Transfer Encodings.

#### Інші зміни API

Новий `BytesHeaderParser`, доданий до модуля `parser`, щоб доповнити `HeaderParser` і завершити Bytes API.

Нові корисні функції:

- `format_datetime()`: враховуючи `datetime`, створити рядок, відформатований для використання в заголовку електронної пошти.

- `parsedate_to_datetime()`: отримавши рядок дати із заголовка електронної пошти, перетворити його на усвідомлений `datetime` або простий `datetime`, якщо зсув `-0000`.

- `localtime()`: без аргументів повертає поточний місцевий час як відомий `datetime` з використанням локального `timezone`. Дано aware `datetime`, перетворює його на aware `datetime` за допомогою локального `timezone`.

### ftplib

- `ftplib.FTP` тепер приймає аргумент ключового слова `source_address`, щоб вказати `(хост, порт)` для використання як адреси джерела у виклику зв’язування під час створення вихідного сокета. (Надав Джампаоло Родола в bpo-8594.)

- Клас `FTP_TLS` тепер надає нову функцію `ccc()` для повернення каналу керування назад до відкритого тексту. Це може бути корисним, щоб скористатися перевагами брандмауерів, які знають, як обробляти NAT із незахищеним FTP без відкриття фіксованих портів. (Надав Джампаоло Родола в bpo-12139.)

- Додано метод `ftplib.FTP.mlsd()`, який забезпечує аналізований формат списку каталогів і не підтримує `ftplib.FTP.nlst()` і `ftplib.FTP.dir()`. (Надав Джампаоло Родола в bpo-11072.)

### functools

Декоратор `functools.lru_cache()` тепер приймає аргумент ключового слова `typed` (який за замовчуванням має значення `False`, щоб забезпечити кешування значень різних типів, які порівнюються, в окремих слотах кешу. (Надано Raymond Hettinger у bpo-13227.)

### gc

Тепер можна реєструвати зворотні виклики, викликані збирачем сміття до та після збирання, використовуючи новий список `callbacks`.

### hmac

Додано нову функцію `compare_digest()`, щоб запобігти атакам бічних каналів на дайджести за допомогою аналізу часу. (Надано Ніком Когланом і Крістіаном Хеймсом у bpo-15061.)

### http

`http.server.BaseHTTPRequestHandler` тепер буферизує заголовки та записує їх усі одночасно під час виклику `end_headers()`. Новий метод `flush_headers()` можна використовувати для безпосереднього керування надсиланням накопичених заголовків. (Надав Ендрю Шааф у bpo-3709.)

`http.server` тепер створює дійсний вихід `HTML 4.01 strict`. (Надав Еціо Мелотті в bpo-13295.)

`http.client.HTTPResponse` тепер має метод `readinto()`, що означає, що його можна використовувати як клас `io.RawIOBase`. (Надав Джон Кун у bpo-13464.)

### html

`html.parser.HTMLParser` тепер може аналізувати пошкоджену розмітку, не викликаючи помилок, тому аргумент strict конструктора та виняток `HTMLParseError` тепер застаріли. Можливість аналізу пошкодженої розмітки є результатом ряду виправлень помилок, які також доступні в останніх версіях виправлень помилок Python 2.7/3.2. (Надав Еціо Мелотті в bpo-15114 і bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)

Додано новий словник `html5`, який відображає посилання на іменовані символи HTML5 на еквівалентні символи Unicode (наприклад, `html5['gt;'] == '>'`). до модуля `html.entities`. Словник тепер також використовується `HTMLParser`. (Надав Еціо Мелотті в bpo-11113 і bpo-15156.)

### імапліб

Конструктор `IMAP4_SSL` тепер приймає параметр SSLContext для керування параметрами безпечного каналу.

(Надав Сіджин Джозеф у bpo-8808.)

### оглядати

Додано нову функцію `getclosurevars()`. Ця функція повідомляє про поточне зв’язування всіх імен, на які посилається тіло функції, і про те, де ці імена були розпізнані, що полегшує перевірку правильності внутрішнього стану під час тестування коду, який покладається на закриття зі збереженням стану.

(Надано Meador Inge та Nick Coghlan у bpo-13062.)

Додано нову функцію `getgeneratorlocals()`. Ця функція повідомляє про поточне зв’язування локальних змінних у стековому кадрі генератора, що полегшує перевірку правильності внутрішнього стану під час тестування генераторів.

(Надано Meador Inge у bpo-15153.)

### io

Функція `open()` має новий режим `'x''`, який можна використовувати виключно для створення нового файлу та викликати `FileExistsError`, якщо файл уже існує. Він заснований на режимі C11 „x“ для fopen().

(Надав Девід Тауншенд у bpo-12760.)

Конструктор класу `TextIOWrapper` має новий необов’язковий аргумент write_through. Якщо write_through має значення `True`, виклики `write()` гарантовано не буферизуються: будь-які дані, записані в об’єкт `TextIOWrapper`, негайно обробляються базовий двійковий буфер.

### itertools

`accumulate()` тепер приймає додатковий аргумент `func` для надання наданої користувачем бінарної функції.

### лісозаготівля

Функція `basicConfig()` тепер підтримує необов’язковий аргумент `handlers`, який приймає ітерацію обробників для додавання до кореневого реєстратора.

Атрибут рівня класу `append_nul` додано до `SysLogHandler`, щоб дозволити контролювати додавання `NUL` (`\000`) байт до записів системного журналу, оскільки для деяких демонов він потрібен, а для інших він передається до журналу.

### математика

Модуль `math` має нову функцію, `log2()`, яка повертає логарифм x за основою 2.

(Написав Марк Дікінсон у bpo-11888.)

### mmap

Метод `read()` тепер більш сумісний з іншими файлоподібними об’єктами: якщо аргумент опущено або вказано як `None`, він повертає байти від поточної позиції файлу до кінця відображення. (Надав Петрі Лехтінен у bpo-12021.)

### багатопроцесорність

Нова функція `multiprocessing.connection.wait()` дозволяє опитувати кілька об’єктів (таких як з’єднання, сокети та канали) з тайм-аутом. (Надав Річард Оудкерк у bpo-12328.)

`multiprocessing.Connection` об’єкти тепер можна передавати через багатопроцесорні з’єднання. (Надав Річард Оудкерк у bpo-4892.)

`multiprocessing.Process` тепер приймає аргумент ключового слова `daemon`, щоб замінити типову поведінку успадкування прапора `daemon` від батьківського процесу (bpo-6064).

Новий атрибут `multiprocessing.Process.sentinel` дозволяє програмі очікувати на кілька об’єктів `Process` одночасно, використовуючи відповідні примітиви ОС (наприклад, `select` у системах posix ).

Нові методи `multiprocessing.pool.Pool.starmap()` і `starmap_async()` забезпечують `itertools.starmap()` еквіваленти існуючого `multiprocessing.pool.Pool Функції .map()` і `map_async()`. (Надав Хайнек Шлавак у bpo-12708.)

### nntplib

The `nntplib.NNTP` class now supports the context management protocol to unconditionally consume `socket.error` exceptions and to close the NNTP connection when done:

    >>> from nntplib import NNTP
    >>> with NNTP('news.gmane.org') as n:
    ...     n.group('gmane.comp.python.committers')
    ...
    ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
    >>>

(Надав Джампаоло Родола в bpo-9795.)

### ос

- The `os` module has a new `pipe2()` function that makes it possible to create a pipe with `O_CLOEXEC` or `O_NONBLOCK` flags set atomically. This is especially useful to avoid race conditions in multi-threaded programs.

- Модуль `os` має нову функцію `sendfile()`, яка забезпечує ефективний спосіб «нульового копіювання» для копіювання даних з одного дескриптора файлу (або сокета) до іншого. Фраза «нульове копіювання» стосується того факту, що все копіювання даних між двома дескрипторами виконується виключно ядром, без копіювання даних у буфери простору користувача. `sendfile()` можна використовувати для ефективного копіювання даних із файлу на диску в мережевий сокет, напр. для завантаження файлу.

  (Патч надіслано Россом Лагерваллом і Джампаоло Родола в bpo-10882.)

- Щоб уникнути таких ситуацій, як атаки символьних посилань і проблеми з тимчасовими файлами та каталогами, надійніше (а також швидше) маніпулювати дескрипторами файлів замість імен файлів. Python 3.3 покращує існуючі функції та представляє нові функції для роботи з дескрипторами файлів (bpo-4761, bpo-10755 та bpo-14626).

  - Модуль `os` має нову функцію `fwalk()`, подібну до `walk()` за винятком того, що він також видає дескриптори файлів, які посилаються на відвідані каталоги. Це особливо корисно, щоб уникнути перегонів символічних посилань.

  - Наступні функції отримують нові додаткові dir_fd (шляхи відносно дескрипторів каталогу) та/або follow_symlinks (не слідують символічним посиланням): `access()`, `chflags()`, `chmod()`, `chown()`, `link()`, `lstat()`, `mkdir()`, `mkfifo()`, `mknod()`, `open()`, `readlink()`, `remove()`, `rename()`, `replace()`, `rmdir()`, `stat()`, `symlink()`, `unlink()`, `utime()`. Підтримку платформи для використання цих параметрів можна перевірити за допомогою наборів `os.supports_dir_fd` і `os.supports_follows_symlinks`.

  - Наступні функції тепер підтримують дескриптор файлу для свого аргументу шляху: `chdir()`, `chmod()`, `chown()`, `execve()`, `listdir()`, `pathconf()`, `exists()`, `stat()`, `statvfs()`, `utime()`. Підтримку платформи для цього можна перевірити за допомогою набору `os.supports_fd`.

- `access()` приймає аргумент ключового слова `effective_ids`, щоб увімкнути використання ефективного uid/gid замість справжнього uid/gid під час перевірки доступу. Підтримку платформи для цього можна перевірити за допомогою набору `supports_effective_ids`.

- Модуль `os` має дві нові функції: `getpriority()` і `setpriority()`. Їх можна використовувати, щоб отримати або встановити зручність/пріоритет процесів подібно до `os.nice()`, але поширене на всі процеси, а не лише на поточний.

  (Патч надіслав Джампаоло Родола в bpo-10784.)

- Нова функція `os.replace()` дозволяє перейменовувати файл на різних платформах із перезаписом місця призначення. За допомогою `os.rename()` наявний цільовий файл перезаписується під POSIX, але викликає помилку під Windows. (Надав Антуан Пітру в bpo-8828.)

- Сімейство функцій stat (`stat()`, `fstat()` і `lstat()` тепер підтримує читання позначок часу файлу з наносекундною точністю. Симетрично, `utime()` тепер може записувати мітки часу файлу з точністю до наносекунд. (Надано Ларрі Гастінгсом у bpo-14127.)

- Нова функція `os.get_terminal_size()` запитує розмір терміналу, прикріпленого до дескриптора файлу. Дивіться також `shutil.get_terminal_size()`. (Надав Збігнєв Єнджеєвський-Шмек у bpo-13609.)

- Нові функції для підтримки розширених атрибутів Linux (bpo-12720): `getxattr()`, `listxattr()`, `removexattr()`, `setxattr()`.

- Новий інтерфейс планувальника. Ці функції контролюють, як процес розподіляє процесорний час операційною системою. Нові функції: `sched_get_priority_max()`, `sched_get_priority_min()`, `sched_getaffinity()`, `sched_getparam()`, `sched_getscheduler()`, `sched_rr_get_interval()`, `sched_setaffinity()`, `sched_setparam()`, `sched_setscheduler()`, `sched_yield()`,

- Нові функції для керування файловою системою:

  - `posix_fadvise()`: повідомляє про намір отримати доступ до даних за певним шаблоном, таким чином дозволяючи ядру робити оптимізацію.

  - `posix_fallocate()`: Переконується, що для файлу виділено достатньо місця на диску.

  - `sync()`: Примусовий запис усього на диск.

- Додаткові нові функції posix:

  - `lockf()`: Застосувати, перевірити або видалити блокування POSIX для дескриптора відкритого файлу.

  - `pread()`: читання з дескриптора файлу зі зміщенням, зміщення файлу залишається незмінним.

  - `pwrite()`: Запис у дескриптор файлу зі зсуву, залишаючи зміщення файлу незмінним.

  - `readv()`: Читання з дескриптора файлу в декілька записуваних буферів.

  - `truncate()`: Обрізати файл, що відповідає шляху, щоб він мав розмір не більше довжини байтів.

  - `waitid()`: Зачекайте на завершення одного чи кількох дочірніх процесів.

  - `writev()`: Записати вміст buffers у файловий дескриптор, де buffers — це довільна послідовність буферів.

  - `getgrouplist()` (bpo-9344): повертає список ідентифікаторів груп, до яких належить вказаний користувач.

- `times()` і `uname()`: тип повернення змінено з кортежу на кортеж-подібний об’єкт з іменованими атрибутами.

- Деякі платформи тепер підтримують додаткові константи для функції `lseek()`, такі як `os.SEEK_HOLE` і `os.SEEK_DATA`.

- New constants `RTLD_LAZY`, `RTLD_NOW`, `RTLD_GLOBAL`, `RTLD_LOCAL`, `RTLD_NODELETE`, `RTLD_NOLOAD`, and `RTLD_DEEPBIND` are available on platforms that support them. These are for use with the `sys.setdlopenflags()` function, and supersede the similar constants defined in `ctypes` and `DLFCN`. (Contributed by Victor Stinner in bpo-13226.)

- `os.symlink()` тепер приймає (і ігнорує) аргумент ключового слова `target_is_directory` на платформах, відмінних від Windows, щоб полегшити міжплатформенну підтримку.

### pdb

Завершення табуляції тепер доступне не тільки для імен команд, але й для їх аргументів. Наприклад, для команди `break` завершуються імена функцій і файлів.

(Надав Георг Брандл у bpo-14210)

### маринований огірок

Об’єкти `pickle.Pickler` тепер мають необов’язковий атрибут `dispatch_table`, який дозволяє встановлювати функції зменшення для кожного піклера.

(Надав Річард Оудкерк у bpo-14166.)

### pydoc

Графічний інтерфейс Tk і функцію `serve()` видалено з модуля `pydoc`: `pydoc -g` і `serve()` застаріли в Python 3.2.

### повторно

`str` регулярні вирази тепер підтримують екранування `\u` і `\U`.

(Надав Сергій Сторчака в bpo-3665.)

### розклад

- `run()` тепер приймає параметр blocking, який, якщо встановлено на false, змушує метод виконувати заплановані події, які мають закінчитися якнайшвидше (якщо такі є), а потім негайно повертатися. Це корисно, якщо ви хочете використовувати `scheduler` у неблокуючих програмах. (Надав Джампаоло Родола в bpo-13449.)

- `scheduler` клас тепер можна безпечно використовувати в багатопоточних середовищах. (Надано Джосіа Карлсоном і Джампаоло Родола в bpo-8684.)

- Параметри timefunc і delayfunct конструктора класу `scheduler` тепер є необов’язковими і за умовчанням мають значення `time.time()` і `time.sleep()` відповідно. (Надав Кріс Кларк у bpo-13245.)

- Параметр argument `enter()` і `enterabs()` тепер необов’язковий. (Надав Кріс Кларк у bpo-13245.)

- `enter()` і `enterabs()` тепер приймають параметр kwargs. (Надав Кріс Кларк у bpo-13245.)

### вибрати

Solaris і похідні платформи мають новий клас `select.devpoll` для високопродуктивних асинхронних сокетів через `/dev/poll`. (Надав Jesús Cea Avión у bpo-6397.)

### шлекс

The previously undocumented helper function `quote` from the `pipes` modules has been moved to the `shlex` module and documented. `quote()` properly escapes all characters in a string that might be otherwise given special meaning by the shell.

### шутил

- Нові функції:

  - `disk_usage()`: надає статистику загального, використаного та вільного дискового простору. (Надав Джампаоло Родола в bpo-12442.)

  - `chown()`: дозволяє змінювати користувача та/або групу заданого шляху, вказуючи також імена користувачів/груп, а не лише їхні цифрові ідентифікатори. (Надав Сандро Тосі в bpo-12191.)

  - `shutil.get_terminal_size()`: повертає розмір вікна терміналу, до якого приєднаний інтерпретатор. (Надав Збігнєв Єнджеєвський-Шмек у bpo-13609.)

- `copy2()` і `copystat()` тепер зберігають мітки часу файлу з точністю до наносекунд на платформах, які це підтримують. Вони також зберігають «розширені атрибути» файлів у Linux. (Надано Ларрі Гастінгсом у bpo-14127 та bpo-15238.)

- Кілька функцій тепер приймають необов’язковий аргумент `symlinks`: коли цей параметр має значення true, символічні посилання не розіменовуються, а операція натомість діє на саме символічне посилання (або створює його, якщо це необхідно). (Надав Хайнек Шлавак у bpo-12715.)

- Під час копіювання файлів до іншої файлової системи `move()` тепер обробляє символічні посилання так, як це робить команда posix `mv`, відтворюючи символічне посилання, а не копіюючи вміст цільового файлу. (Надано Джонатаном Нігофом у bpo-9993.) `move()` тепер також повертає аргумент `dst` як результат.

- `rmtree()` тепер стійкий до атак через символічні посилання на платформах, які підтримують новий параметр `dir_fd` у `os.open()` і `os.unlink()`. (Надано Мартіном фон Льовісом і Гінеком Шлаваком у bpo-4489.)

### сигнал

- Модуль `signal` має нові функції:

  - `pthread_sigmask()`: отримати та/або змінити маску сигналу викликаючого потоку (Надано Жаном-Полем Кальдероне в bpo-8407);

  - `pthread_kill()`: відправити сигнал до потоку;

  - `sigpending()`: перевірити незавершені функції;

  - `sigwait()`: чекати сигналу;

  - `sigwaitinfo()`: чекати сигналу, повертаючи детальну інформацію про нього;

  - `sigtimedwait()`: як `sigwaitinfo()`, але з тайм-аутом.

- Обробник сигналу записує номер сигналу як один байт замість нульового байта в дескриптор файлу пробудження. Таким чином, можна чекати більше ніж один сигнал і знати, які сигнали були підняті.

- `signal.signal()` і `signal.siginterrupt()` викликають OSError замість RuntimeError: OSError має атрибут errno.

### smtpd

The `smtpd` module now supports RFC 5321 (extended SMTP) and RFC 1870 (size extension). Per the standard, these extensions are enabled if and only if the client initiates the session with an `EHLO` command.

(Початкову підтримку `ELHO` виконав Альберто Тревіно. Розширення розміру здійснено Юханою Яухіайнен. Значну додаткову роботу над виправленням зробили Мікеле Орру та Ден Босвелл. bpo-8739)

### smtplib

Класи `SMTP`, `SMTP_SSL` і `LMTP` тепер приймають аргумент ключового слова `source_address` для визначення `(host, port)` для використання як адреси джерела у виклику зв’язування під час створення вихідного сокета. (Надав Paulo Scardine у bpo-11281.)

`SMTP` тепер підтримує протокол керування контекстом, що дозволяє використовувати екземпляр `SMTP` у операторі `with`. (Надав Джампаоло Родола в bpo-11289.)

Конструктор `SMTP_SSL` і метод `starttls()` тепер приймають параметр SSLContext для керування параметрами безпечного каналу. (Надано Kasun Herath у bpo-8809.)

### гніздо

- Клас `socket` тепер надає додаткові методи для обробки допоміжних даних, якщо вони підтримуються базовою платформою:

  - `sendmsg()`

  - `recvmsg()`

  - `recvmsg_into()`

  (Надано Девідом Вотсоном у bpo-6560, на основі попереднього патча Хайко Вундрама)

- Клас `socket` тепер підтримує сімейство протоколів PF_CAN (https://en.wikipedia.org/wiki/Socketcan) у Linux (https://lwn.net/Articles/253425).

  (Надано Маттіасом Фуксом, оновлено Тіаго Гонсалвесом у bpo-10141.)

- The `socket` class now supports the PF_RDS protocol family (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets and https://oss.oracle.com/projects/rds).

- Клас `socket` тепер підтримує сімейство протоколів `PF_SYSTEM` в OS X. (Надано Майклом Годербауером у bpo-13777.)

- New function `sethostname()` allows the hostname to be set on Unix systems if the calling process has sufficient privileges. (Contributed by Ross Lagerwall in bpo-10866.)

### сокетсервер

`BaseServer` тепер має замінений метод `service_actions()`, який викликається методом `serve_forever()` у циклі обслуговування. `ForkingMixIn` тепер використовує це для очищення дочірніх процесів-зомбі. (Надав Джастін Варкентін у bpo-11109.)

### sqlite3

Новий метод `sqlite3.Connection` `set_trace_callback()` можна використовувати для захоплення трасування всіх команд sql, оброблених sqlite. (Надав Торстен Ландшофф у bpo-11688.)

### ssl

- Модуль `ssl` має дві нові функції випадкової генерації:

  - `RAND_bytes()`: генерувати криптографічно надійні псевдовипадкові байти.

  - `RAND_pseudo_bytes()`: генерувати псевдовипадкові байти.

  (Надав Віктор Стіннер у bpo-12049.)

- Модуль `ssl` тепер надає детальнішу ієрархію винятків, щоб полегшити перевірку різних типів помилок. (Надав Антуан Пітру в bpo-11183.)

- `load_cert_chain()` тепер приймає аргумент пароль, який буде використовуватися, якщо закритий ключ зашифровано. (Надав Адам Сімпкінс у bpo-12803.)

- Обмін ключами Діффі-Хеллмана, як звичайний, так і на основі еліптичної кривої, тепер підтримується через методи `load_dh_params()` і `set_ecdh_curve()`. (Надав Антуан Пітру в bpo-13626 і bpo-13627.)

- SSL-сокети мають новий метод `get_channel_binding()`, який дозволяє реалізувати певні механізми автентифікації, такі як SCRAM-SHA-1-PLUS. (Надав Яцек Конєчний у bpo-12551.)

- You can query the SSL compression algorithm used by an SSL socket, thanks to its new `compression()` method. The new attribute `OP_NO_COMPRESSION` can be used to disable compression. (Contributed by Antoine Pitrou in bpo-13634.)

- Додано підтримку розширення Next Protocol Negotiation за допомогою методу `ssl.SSLContext.set_npn_protocols()`. (Надав Колін Марк у bpo-14204.)

- Помилки SSL тепер легше аналізувати завдяки атрибутам `library` і `reason`. (Надав Антуан Пітру в bpo-14837.)

- Функція `get_server_certificate()` тепер підтримує IPv6. (Надав Шарль-Франсуа Наталі в bpo-11811.)

- New attribute `OP_CIPHER_SERVER_PREFERENCE` allows setting SSLv3 server sockets to use the server’s cipher ordering preference rather than the client’s (bpo-13635).

### стат

Недокументовану функцію tarfile.filemode переміщено до `stat.filemode()`. Його можна використовувати для перетворення режиму файлу на рядок у формі „-rwxrwxrwx“.

(Надав Джампаоло Родола в bpo-14807.)

### структура

The `struct` module now supports `ssize_t` and `size_t` via the new codes `n` and `N`, respectively. (Contributed by Antoine Pitrou in bpo-3163.)

### підпроцес

Командні рядки тепер можуть бути об’єктами bytes на платформах posix. (Надав Віктор Стіннер у bpo-8513.)

A new constant `DEVNULL` allows suppressing output in a platform-independent fashion. (Contributed by Ross Lagerwall in bpo-5870.)

### система

Модуль `sys` має новий `thread_info` named tuple, що містить інформацію про реалізацію потоку (bpo-11223).

### tarfile

`tarfile` тепер підтримує кодування `lzma` через модуль `lzma`. (Надав Ларс Густебель у bpo-5689.)

### тимчасовий файл

Метод `tempfile.SpooledTemporaryFile` `truncate()` тепер приймає параметр `size`. (Надав Райан Келлі в bpo-9957.)

### обтікання текстом

Модуль `textwrap` має новий `indent()`, який дозволяє легко додавати загальний префікс до вибраних рядків у блоці тексту (bpo-13857).

### різьблення

`threading.Condition`, `threading.Semaphore`, `threading.BoundedSemaphore`, `threading.Event` і `threading.Timer`, усі з яких використовуються бути фабричними функціями, що повертають екземпляр класу, тепер є класами та можуть бути підкласами. (Надав Ерік Араужо в bpo-10968.)

Конструктор `threading.Thread` тепер приймає аргумент ключового слова `daemon`, щоб замінити типову поведінку успадкування значення прапора `daemon` від батьківського потоку (bpo-6064).

Раніше закрита функція `_thread.get_ident` тепер доступна як публічна функція `threading.get_ident()`. Це усуває декілька випадків прямого доступу до модуля `_thread` у stdlib. Код третьої сторони, який використовував `_thread.get_ident`, також слід змінити, щоб використовувати новий публічний інтерфейс.

### час

PEP 418 додав нові функції до модуля `time`:

- `get_clock_info()`: отримати інформацію про годинник.

- `monotonic()`: Монотонний годинник (не може повертатися назад), на нього не впливають оновлення системного годинника.

- `perf_counter()`: Лічильник продуктивності з найвищою доступною роздільною здатністю для вимірювання короткої тривалості.

- `process_time()`: сума системного та користувальницького процесорного часу поточного процесу.

Інші нові функції:

- `clock_getres()`, `clock_gettime()` and `clock_settime()` functions with `CLOCK_xxx` constants. (Contributed by Victor Stinner in bpo-10278.)

Щоб покращити узгодженість між платформами, `sleep()` тепер викликає `ValueError`, коли передається від’ємне значення сну. Раніше це була помилка на posix, але спричиняла нескінченний сон у Windows.

### види

Додайте новий клас `types.MappingProxyType`: проксі зіставлення лише для читання. (bpo-14386)

Нові функції `types.new_class()` і `types.prepare_class()` забезпечують підтримку для PEP 3115 сумісного створення динамічного типу. (bpo-14588)

### unittest

`assertRaises()`, `assertRaisesRegex()`, `assertWarns()` і `assertWarnsRegex()` тепер приймають аргумент ключового слова msg, коли використовуються як менеджери контексту. (Надано Еціо Мелотті та Вінстоном Евертом у bpo-10775.)

`unittest.TestCase.run()` тепер повертає об’єкт `TestResult`.

### urllib

Клас `Request` тепер приймає аргумент method, який використовується `get_method()`, щоб визначити, який метод HTTP слід використовувати. Наприклад, це надішле запит `'HEAD'`:

    >>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

### веб-браузер

Модуль `webbrowser` підтримує більше «браузерів»: Google Chrome (з назвами chrome, chromium, chrome-browser або chromium-browser залежно у версії й операційній системі), а також загальні засоби запуску xdg-open із проекту FreeDesktop.org і gvfs-open, який є обробником URI за замовчуванням для GNOME 3. ( перший надав Арно Кальметт у bpo-13620, другий — Матіас Клозе в bpo-14493.)

### xml.etree.ElementTree

Модуль `xml.etree.ElementTree` тепер імпортує свій прискорювач C за замовчуванням; більше немає потреби явно імпортувати `xml.etree.cElementTree` (цей модуль залишається для зворотної сумісності, але тепер він застарів). Крім того, сімейство методів `iter` `Element` було оптимізовано (переписано на C). Документацію модуля також було значно покращено, додано приклади та більш детальну довідку.

### zlib

New attribute `zlib.Decompress.eof` makes it possible to distinguish between a properly formed compressed stream and an incomplete or truncated one. (Contributed by Nadeem Vawda in bpo-12646.)

New attribute `zlib.ZLIB_RUNTIME_VERSION` reports the version string of the underlying `zlib` library that is loaded at runtime. (Contributed by Torsten Landschoff in bpo-12306.)

## Оптимізації

Додано основні покращення продуктивності:

- Завдяки PEP 393 деякі операції над рядками Unicode були оптимізовані:

  - обсяг пам’яті ділиться на 2-4 в залежності від тексту

  - кодувати рядок ASCII у UTF-8 більше не потрібно кодувати символи, представлення UTF-8 спільно з представленням ASCII

  - кодувальник UTF-8 оптимізовано

  - повторення однієї літери ASCII і отримання підрядка рядка ASCII відбувається в 4 рази швидше

- UTF-8 тепер у 2-4 рази швидше. Кодування UTF-16 тепер у 10 разів швидше.

  (Надав Сергій Сторчака, bpo-14624, bpo-14738 та bpo-15026.)

## Зміни збірки та C API

Зміни в процесі збирання Python і в API C включають:

- Нова пов’язана функція PEP 3118:

  - `PyMemoryView_FromMemory()`

- PEP 393 додано нові типи Unicode, макроси та функції:

  - API високого рівня:

    - `PyUnicode_CopyCharacters()`

    - `PyUnicode_FindChar()`

    - `PyUnicode_GetLength()`, `PyUnicode_GET_LENGTH`

    - `PyUnicode_New()`

    - `PyUnicode_Substring()`

    - `PyUnicode_ReadChar()`, `PyUnicode_WriteChar()`

  - API низького рівня:

    - Типи `Py_UCS1`, `Py_UCS2`, `Py_UCS4`

    - Структури `PyASCIIObject` і `PyCompactUnicodeObject`

    - `PyUnicode_READY`

    - `PyUnicode_FromKindAndData()`

    - `PyUnicode_AsUCS4()`, `PyUnicode_AsUCS4Copy()`

    - `PyUnicode_DATA`, `PyUnicode_1BYTE_DATA`, `PyUnicode_2BYTE_DATA`, `PyUnicode_4BYTE_DATA`

    - `PyUnicode_KIND` with `PyUnicode_Kind` enum: `PyUnicode_WCHAR_KIND`, `PyUnicode_1BYTE_KIND`, `PyUnicode_2BYTE_KIND`, `PyUnicode_4BYTE_KIND`

    - `PyUnicode_READ`, `PyUnicode_READ_CHAR`, `PyUnicode_WRITE`

    - `PyUnicode_MAX_CHAR_VALUE`

- `PyArg_ParseTuple` тепер приймає `bytearray` для формату `c` (bpo-12380).

## Застаріле

### Непідтримувані операційні системи

OS/2 і VMS більше не підтримуються через відсутність супроводжуючого.

Платформи Windows 2000 і Windows, які встановлюють для `COMSPEC` значення `command.com` більше не підтримуються через тягар обслуговування.

Підтримку OSF, яка була застарілою у версії 3.2, було повністю видалено.

### Застарілі модулі, функції та методи Python

- Передача непорожнього рядка в `object.__format__()` є застарілою та викличе `TypeError` у Python 3.4 (bpo-9856).

- Кодек `unicode_internal` застарів через PEP 393, використовуйте UTF-8, UTF-16 (`utf-16-le` або `utf-16-be`), або UTF-32 (`utf-32-le` або `utf-32-be`)

- `ftplib.FTP.nlst()` і `ftplib.FTP.dir()`: використовуйте `ftplib.FTP.mlsd()`

- `platform.popen()`: використовуйте модуль `subprocess`. Особливо перевірте розділ Заміна старих функцій модулем subprocess (bpo-11377).

- bpo-13374: Windows bytes API більше не підтримується в модулі `os`. Щоб більше не залежати від кодової сторінки ANSI та підтримувати будь-які назви файлів, використовуйте назви файлів у кодуванні Unicode замість імен файлів у байтах.

- bpo-13988: Модуль `xml.etree.cElementTree` застарів. Прискорювач використовується автоматично, коли він доступний.

- Поведінка `time.clock()` залежить від платформи: замість цього використовуйте нову функцію `time.perf_counter()` або `time.process_time()`, залежно від ваших вимог, щоб мати чітко визначену поведінку .

- Функція `os.stat_float_times()` застаріла.

- `abc` модуль:

  - `abc.abstractproperty` застаріло, замість цього використовуйте `property` з `abc.abstractmethod()`.

  - `abc.abstractclassmethod` застаріло, замість нього використовуйте `classmethod` з `abc.abstractmethod()`.

  - `abc.abstractstaticmethod` застарів, замість нього використовуйте `staticmethod` з `abc.abstractmethod()`.

- `importlib` пакет:

  - `importlib.abc.SourceLoader.path_mtime()` тепер не підтримується на користь `importlib.abc.SourceLoader.path_stats()`, оскільки файли байт-коду тепер зберігають як час модифікації, так і розмір вихідного файлу, файл байт-коду було скомпільовано від.

### Застарілі функції та типи C API

`Py_UNICODE` був застарілим PEP 393 і буде видалено в Python 4. Усі функції, що використовують цей тип, застаріли:

Unicode functions and methods using `Py_UNICODE` and Py_UNICODE* types:

- `PyUnicode_FromUnicode`: use `PyUnicode_FromWideChar()` or `PyUnicode_FromKindAndData()`

- `PyUnicode_AS_UNICODE`, `PyUnicode_AsUnicode()`, `PyUnicode_AsUnicodeAndSize()`: use `PyUnicode_AsWideCharString()`

- `PyUnicode_AS_DATA`: use `PyUnicode_DATA` with `PyUnicode_READ` and `PyUnicode_WRITE`

- `PyUnicode_GET_SIZE`, `PyUnicode_GetSize()`: use `PyUnicode_GET_LENGTH` or `PyUnicode_GetLength()`

- `PyUnicode_GET_DATA_SIZE`: use `PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)` (only work on ready strings)

- `PyUnicode_AsUnicodeCopy()`: use `PyUnicode_AsUCS4Copy()` or `PyUnicode_AsWideCharString()`

- `PyUnicode_GetMax()`

Функції та макроси, що маніпулюють рядками Py_UNICODE*:

- `Py_UNICODE_strlen()`: use `PyUnicode_GetLength()` or `PyUnicode_GET_LENGTH`

- `Py_UNICODE_strcat()`: use `PyUnicode_CopyCharacters()` or `PyUnicode_FromFormat()`

- `Py_UNICODE_strcpy()`, `Py_UNICODE_strncpy()`, `Py_UNICODE_COPY()`: use `PyUnicode_CopyCharacters()` or `PyUnicode_Substring()`

- `Py_UNICODE_strcmp()`: use `PyUnicode_Compare()`

- `Py_UNICODE_strncmp()`: use `PyUnicode_Tailmatch()`

- `Py_UNICODE_strchr()`, `Py_UNICODE_strrchr()`: use `PyUnicode_FindChar()`

- `Py_UNICODE_FILL()`: use `PyUnicode_Fill()`

- `Py_UNICODE_MATCH`

Кодери:

- `PyUnicode_Encode()`: use `PyUnicode_AsEncodedObject()`

- `PyUnicode_EncodeUTF7()`

- `PyUnicode_EncodeUTF8()`: use `PyUnicode_AsUTF8()` or `PyUnicode_AsUTF8String()`

- `PyUnicode_EncodeUTF32()`

- `PyUnicode_EncodeUTF16()`

- `PyUnicode_EncodeUnicodeEscape()` use `PyUnicode_AsUnicodeEscapeString()`

- `PyUnicode_EncodeRawUnicodeEscape()` use `PyUnicode_AsRawUnicodeEscapeString()`

- `PyUnicode_EncodeLatin1()`: use `PyUnicode_AsLatin1String()`

- `PyUnicode_EncodeASCII()`: use `PyUnicode_AsASCIIString()`

- `PyUnicode_EncodeCharmap()`

- `PyUnicode_TranslateCharmap()`

- `PyUnicode_EncodeMBCS()`: use `PyUnicode_AsMBCSString()` or `PyUnicode_EncodeCodePage()` (with `CP_ACP` code_page)

- `PyUnicode_EncodeDecimal()`, `PyUnicode_TransformDecimalToASCII()`

### Застарілі функції

Код формату `'u'` модуля `array` тепер не підтримується та буде видалено в Python 4 разом з рештою (`Py_UNICODE`) API.

## Перенесення на Python 3.3

У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.

### Перенесення коду Python

- Хеш-рандомізація ввімкнена за замовчуванням. Встановіть для змінної середовища `PYTHONHASHSEED` значення `0`, щоб вимкнути рандомізацію хешу. Дивіться також метод `object.__hash__()`.

- bpo-12326: У Linux sys.platform більше не містить основної версії. Тепер це завжди «linux», а не «linux2» або «linux3», залежно від версії Linux, яка використовується для створення Python. Замініть sys.platform == „linux2“ на sys.platform.startswith(„linux“) або безпосередньо sys.platform == „linux“, якщо вам не потрібна підтримка старіших версій Python.

- bpo-13847, bpo-14180: `time` і `datetime`: `OverflowError` тепер викликається замість `ValueError`, якщо немає позначки часу діапазону. `OSError` тепер виникає, якщо функції C `gmtime()` або `localtime()` не вдаються.

- Засоби пошуку за умовчанням, які використовуються імпортом, тепер використовують кеш того, що міститься в певному каталозі. Якщо ви створюєте вихідний файл Python або файл байт-коду без вихідного коду, обов’язково викличте `importlib.invalidate_caches()`, щоб очистити кеш, щоб шукачі помітили новий файл.

- `ImportError` тепер використовує повну назву модуля, який намагалися імпортувати. Доктести, які перевіряють повідомлення ImportErrors, потрібно буде оновити, щоб використовувати повну назву модуля, а не лише хвіст назви.

- Аргумент index для `__import__()` тепер має значення 0 замість -1 і більше не підтримує від’ємні значення. Коли PEP 328 було реалізовано, це було помилкою, що значення за замовчуванням залишилося -1. Якщо вам потрібно продовжити виконання відносного імпорту з подальшим абсолютним імпортом, тоді виконайте відносний імпорт із використанням індексу 1, а потім ще один імпорт із використанням індексу 0. Однак бажано використовувати `importlib.import_module()` замість безпосереднього виклику `__import__()`.

- `__import__()` більше не дозволяє використовувати значення індексу, відмінне від 0, для модулів верхнього рівня. наприклад `__import__('sys', level=1)` тепер є помилкою.

- Because `sys.meta_path` and `sys.path_hooks` now have finders on them by default, you will most likely want to use `list.insert()` instead of `list.append()` to add to those lists.

- Because `None` is now inserted into `sys.path_importer_cache`, if you are clearing out entries in the dictionary of paths that do not have a finder, you will need to remove keys paired with values of `None` and `imp.NullImporter` to be backwards-compatible. This will lead to extra overhead on older versions of Python that re-insert `None` into `sys.path_importer_cache` where it represents the use of implicit finders, but semantically it should not change anything.

- `importlib.abc.Finder` no longer specifies a `find_module()` abstract method that must be implemented. If you were relying on subclasses to implement that method, make sure to check for the method’s existence first. You will probably want to check for `find_loader()` first, though, in the case of working with path entry finders.

- `pkgutil` було перетворено на використання `importlib` внутрішньо. Це усуває багато граничних випадків, коли стара поведінка емуляції імпорту PEP 302 не збігалася з поведінкою реальної системи імпорту. Сама емуляція імпорту все ще присутня, але тепер не підтримується. Функції `pkgutil.iter_importers()` і `pkgutil.walk_packages()` представляють спеціальний варіант для стандартних хуків імпорту, тому вони все ще підтримуються, навіть якщо вони не забезпечують нестандартний метод `iter_modules()`.

- Виправлено давню помилку відповідності вимогам RFC (bpo-1079) у синтаксичному аналізі, виконаному `email.header.decode_header()`. Код, який використовує стандартну ідіому для перетворення закодованих заголовків у юнікод (`str(make_header(decode_header(h))`), не побачить жодних змін, але код, який переглядає окремі кортежі, повернуті decode_header, побачить пробіли, які передують або наступні розділи `ASCII` тепер включено в розділ `ASCII`. Код, який створює заголовки за допомогою `make_header`, також має продовжувати працювати без змін, оскільки `make_header` продовжує додавати пробіли між `ASCII` і не `ASCII` розділи, якщо вони ще не присутні у вхідних рядках.

- `email.utils.formataddr()` тепер виконує правильне кодування передачі вмісту, коли передаються відображувані імена, відмінні від `ASCII`. Будь-який код, який залежав від попередньої помилкової поведінки, яка зберігала не-`ASCII` Юнікод у форматованому вихідному рядку, потрібно буде змінити (bpo-1690608).

- `poplib.POP3.quit()` тепер може викликати помилки протоколу, як і всі інші методи `poplib`. Код, який припускає, що `вийти` не викликає помилки `poplib.error_proto`, може знадобитися змінити, якщо певна програма стикається з помилками `вийти` (bpo-11291).

- Аргумент `strict` для `email.parser.Parser`, застарілий з Python 2.4, нарешті видалено.

- Застарілий метод `unittest.TestCase.assertSameElements` було видалено.

- Застарілу змінну `time.accept2dyear` видалено.

- Застарілий атрибут `Context._clamp` було видалено з модуля `decimal`. Раніше він був замінений публічним атрибутом `clamp`. (Див. bpo-8540.)

- Недокументований внутрішній допоміжний клас `SSLFakeFile` було видалено з `smtplib`, оскільки його функціональні можливості протягом тривалого часу надавалися безпосередньо `socket.socket.makefile()`.

- Передача від’ємного значення `time.sleep()` у Windows тепер викликає помилку, а не сплячий режим назавжди. Це завжди викликало помилку на posix.

- The `ast.__version__` constant has been removed. If you need to make decisions affected by the AST version, use `sys.version_info` to make the decision.

- Код, який раніше обходив той факт, що модуль `threading` використовував фабричні функції, створюючи підкласи приватних класів, потрібно буде змінити, щоб створити підкласи публічних класів.

- Недокументований механізм налагодження в модулі обробки потоків було видалено, що спростило код. Це не повинно вплинути на робочий код, але згадується тут, якщо з ним взаємодіють будь-які фреймворки налагодження програм (bpo-13550).

### Перенесення коду C

- In the course of changes to the buffer API the undocumented `smalltable` member of the `Py_buffer` structure has been removed and the layout of the `PyMemoryViewObject` has changed.

  Усі розширення, що покладаються на відповідні частини в `memoryobject.h` або `object.h`, повинні бути перебудовані.

- Через PEP 393, тип `Py_UNICODE` та всі функції, що використовують цей тип, застаріли (але залишатимуться доступними щонайменше п’ять років). Якщо ви використовували низькорівневі API Unicode для створення та доступу до об’єктів Unicode та хочете скористатися перевагами зменшення обсягу пам’яті, яке забезпечує PEP 393, вам потрібно перетворити свій код на новий API Unicode.

  Однак, якщо ви використовували лише функції високого рівня, такі як `PyUnicode_Concat()`, `PyUnicode_Join()` або `PyUnicode_FromFormat()`, ваш код автоматично прийматиме переваги нових представлень Unicode.

- `PyImport_GetMagicNumber()` тепер повертає `-1` у разі помилки.

- Оскільки від’ємне значення для аргументу level для `__import__()` більше недійсне, те саме тепер стосується `PyImport_ImportModuleLevel()`. Це також означає, що значення level, яке використовується `PyImport_ImportModuleEx()`, тепер дорівнює `0` замість `-1`.

### Будівля C розширення

- Діапазон можливих імен файлів для розширень C було звужено. Дуже рідко використовувані варіанти написання були придушені: у POSIX файли з іменами `xxxmodule.so`, `xxxmodule.abi3.so` і `xxxmodule.cpython-*.so` більше не розпізнаються як такі, що реалізують` модуль xxx`. Якщо ви створювали такі файли, вам потрібно переключитися на інші варіанти написання (тобто видалити рядок `module` з імен файлів).

  (реалізовано в bpo-14040.)

### Зміни перемикача командного рядка

- Прапор командного рядка -Q і пов’язані артефакти видалено. Код перевірки sys.flags.division_warning потребує оновлення.

  (bpo-10998, надано Еріком Араухо.)

- Коли python запускається за допомогою `-S`, `import site` більше не додаватиме шляхи для сайту до шляхів пошуку модуля. У попередніх версіях так і було.

  (bpo-11591, надано Карлом Майєром з виданнями Еріка Араухо.)