# Що нового в Python 3.5

Редактори:

  Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

This article explains the new features in Python 3.5, compared to 3.4. Python 3.5 was released on September 13, 2015. See the changelog for a full list of changes.

Дивись також

PEP 478 - Графік випуску Python 3.5

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

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

- PEP 492, співпрограми з синтаксисом async і await.

- PEP 465, новий оператор множення матриці: `a @ b`.

- PEP 448, додаткові узагальнення розпакування.

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

- `typing`: PEP 484 – Типові підказки.

- `zipapp`: PEP 441 Покращення підтримки програм Python ZIP.

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

- `bytes % args`, `bytearray % args`: PEP 461 – Додано форматування `%` до байтів і bytearray.

- Нові методи `bytes.hex()`, `bytearray.hex()` і `memoryview.hex()`. (Надав Арнон Яарі в bpo-9951.)

- `memoryview` тепер підтримує індексування кортежів (включаючи багатовимірне). (Надав Антуан Пітру в bpo-23632.)

- Генератори мають новий атрибут `gi_yieldfrom`, який повертає об’єкт, який повторюється виразами `yield from`. (Надано Бенно Леслі та Юрієм Селівановим у bpo-24450.)

- Новий виняток `RecursionError` тепер викликається, коли досягається максимальна глибина рекурсії. (Надав Георг Брандл у bpo-19235.)

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

- Якщо локаль `LC_TYPE` є локаллю POSIX (`C` локаль), `sys.stdin` і `sys.stdout` тепер використовують `surrogateescape` обробник помилок замість `строгого` обробника помилок. (Надав Віктор Стіннер у bpo-19977.)

- Файли `.pyo` більше не використовуються і були замінені більш гнучкою схемою, яка включає рівень оптимізації явно в назві `.pyc`. (Див. Огляд PEP 488.)

- Вбудовані модулі та модулі розширення тепер ініціалізуються в багатофазному процесі, який подібний до того, як завантажуються модулі Python. (Див. Огляд PEP 489.)

Значні вдосконалення стандартної бібліотеки:

- `collections.OrderedDict` тепер реалізовано в C, що робить його від 4 до 100 разів швидшим.

- Модуль `ssl` отримав підтримку Memory BIO, що відокремлює обробку протоколу SSL від мережевого введення-виведення.

- Нова функція `os.scandir()` забезпечує кращий і значно швидший спосіб обходу каталогу.

- `functools.lru_cache()` був здебільшого перереалізований у C, що дало набагато кращу продуктивність.

- Нова функція `subprocess.run()` забезпечує впорядкований спосіб запуску підпроцесів.

- Модуль `traceback` був значно покращений для покращення продуктивності та зручності для розробників.

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

- SSLv3 тепер вимкнено в стандартній бібліотеці. Його все ще можна ввімкнути, створивши екземпляр `ssl.SSLContext` вручну. (Докладніше див. bpo-22638; цю зміну було перенесено до CPython 3.4 і 2.7.)

- Синтаксичний аналіз файлів cookie HTTP тепер суворіший, щоб захистити від потенційних ін’єкційних атак. (Надав Антуан Пітру в bpo-22796.)

Покращення Windows:

- Новий інсталятор для Windows замінив старий MSI. Перегляньте Використання Python у Windows для отримання додаткової інформації.

- Збірки Windows тепер використовують Microsoft Visual C++ 14.0, і модулі розширення мають використовувати те саме.

Будь ласка, прочитайте повний список змін, які стосуються користувачів, включаючи багато інших менших покращень, оптимізацію CPython, застарілі та потенційні проблеми з перенесенням.

## Нові можливості

### PEP 492 – співпрограми з синтаксисом async і await

PEP 492 значно покращує підтримку асинхронного програмування в Python, додаючи очікувані об’єкти, функції співпрограми, асинхронну ітерацію та асинхронну контекст менеджери.

Функції співпрограми оголошено за допомогою нового синтаксису `async def`:

    >>> async def coro():
    ...     return 'spam'

Inside a coroutine function, the new `await` expression can be used to suspend coroutine execution until the result is available. Any object can be awaited, as long as it implements the awaitable protocol by defining the `__await__()` method.

PEP 492 також додає оператор `async for` для зручної ітерації над асинхронними ітераціями.

Приклад елементарного клієнта HTTP, написаного з використанням нового синтаксису:

    import asyncio

    async def http_get(domain):
        reader, writer = await asyncio.open_connection(domain, 80)

        writer.write(b'\r\n'.join([
            b'GET / HTTP/1.1',
            b'Host: %b' % domain.encode('latin-1'),
            b'Connection: close',
            b'', b''
        ]))

        async for line in reader:
            print('>>>', line)

        writer.close()

    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(http_get('example.com'))
    finally:
        loop.close()

Подібно до асинхронної ітерації, існує новий синтаксис для менеджерів асинхронного контексту. Наступний сценарій:

    import asyncio

    async def coro(name, lock):
        print('coro {}: waiting for lock'.format(name))
        async with lock:
            print('coro {}: holding the lock'.format(name))
            await asyncio.sleep(1)
            print('coro {}: releasing the lock'.format(name))

    loop = asyncio.get_event_loop()
    lock = asyncio.Lock()
    coros = asyncio.gather(coro(1, lock), coro(2, lock))
    try:
        loop.run_until_complete(coros)
    finally:
        loop.close()

виведе:

    coro 2: waiting for lock
    coro 2: holding the lock
    coro 1: waiting for lock
    coro 2: releasing the lock
    coro 1: holding the lock
    coro 1: releasing the lock

Зауважте, що як `async for`, так і `async with` можна використовувати лише всередині функції співпрограми, оголошеної за допомогою `async def`.

Функції співпрограми призначені для виконання всередині сумісного циклу подій, такого як асинхронний цикл.

Примітка

Змінено в версії 3.5.2: Починаючи з CPython 3.5.2, `__aiter__` може безпосередньо повертати асинхронні ітератори. Повернення об’єкта awaitable призведе до появи `PendingDeprecationWarning`.

Дивіться більше деталей у розділі документації Асинхронні ітератори.

Дивись також

PEP 492 – Співпрограми з синтаксисом async і await

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

### PEP 465 – спеціальний інфіксний оператор для множення матриць

PEP 465 adds the `@` infix operator for matrix multiplication. Currently, no builtin Python types implement the new operator, however, it can be implemented by defining `__matmul__()`, `__rmatmul__()`, and `__imatmul__()` for regular, reflected, and in-place matrix multiplication. The semantics of these methods is similar to that of methods defining other infix arithmetic operators.

Матричне множення є досить поширеною операцією в багатьох галузях математики, науки, техніки, а додавання `@` дозволяє писати чистіший код:

    S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

замість:

    S = dot((dot(H, beta) - r).T,
            dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

NumPy 1.10 підтримує новий оператор:

    >>> import numpy

    >>> x = numpy.ones(3)
    >>> x
    array([ 1., 1., 1.])

    >>> m = numpy.eye(3)
    >>> m
    array([[ 1., 0., 0.],
           [ 0., 1., 0.],
           [ 0., 0., 1.]])

    >>> x @ m
    array([ 1., 1., 1.])

Дивись також

PEP 465 – Спеціальний інфіксний оператор для множення матриць

  PEP, написаний Натаніелем Дж. Смітом; реалізований Бенджаміном Петерсоном.

### PEP 448 - Додаткові узагальнення розпакування

PEP 448 розширює дозволене використання оператора ітераційного розпакування `*` та оператора розпакування словника `**`. Тепер можна використовувати довільну кількість розпакувань у викликах функцій:

    >>> print(*[1], *[2], 3, *[4, 5])
    1 2 3 4 5

    >>> def fn(a, b, c, d):
    ...     print(a, b, c, d)
    ...

    >>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
    1 2 3 4

Так само відображення кортежів, списків, наборів і словників дозволяють багаторазове розпакування (див. Списки виразів і Відображення словника):

    >>> *range(4), 4
    (0, 1, 2, 3, 4)

    >>> [*range(4), 4]
    [0, 1, 2, 3, 4]

    >>> {*range(4), 4, *(5, 6, 7)}
    {0, 1, 2, 3, 4, 5, 6, 7}

    >>> {'x': 1, **{'y': 2}}
    {'x': 1, 'y': 2}

Дивись також

PEP 448 – Додаткові узагальнення розпакування

  PEP, написаний Джошуа Ландау; реалізували Ніл Ґірдхар, Томас Воутерс і Джошуа Ландау.

### PEP 461 - підтримка відсоткового форматування для байтів і байтового масиву

PEP 461 додає підтримку для `%` оператора інтерполяції до `bytes` і `bytearray`.

Хоча інтерполяція зазвичай розглядається як рядкова операція, є випадки, коли інтерполяція на `bytes` або `bytearrays` має сенс, і робота, необхідна для компенсації цієї відсутньої функції, погіршує загальну читабельність коду. . Ця проблема особливо важлива при роботі з протоколами дротового формату, які часто є сумішшю двійкового та ASCII-сумісного тексту.

Приклади:

    >>> b'Hello %b!' % b'World'
    b'Hello World!'

    >>> b'x=%i y=%f' % (1, 2.5)
    b'x=1 y=2.500000'

Юнікод не дозволяється для `%b`, але він приймається `%a` (еквівалент `repr(obj).encode('ascii', 'backslashreplace')`:

    >>> b'Hello %b!' % 'World'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

    >>> b'price: %a' % '10€'
    b"price: '10\\u20ac'"

Зауважте, що типи перетворення `%s` і `%r`, хоча й підтримуються, слід використовувати лише в кодових базах, які потребують сумісності з Python 2.

Дивись також

PEP 461 – Додано форматування % до байтів і масиву байтів

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

### PEP 484 – Типові підказки

Синтаксис анотації функції є функцією Python з версії 3.0 ( PEP 3107), однак семантика анотацій залишилася невизначеною.

Досвід показав, що більшість анотацій функцій використовувалися для надання підказок типу для параметрів функції та повернення значень. Стало очевидним, що користувачам Python було б вигідно, якби стандартна бібліотека включала базові визначення та інструменти для анотацій типів.

PEP 484 представляє тимчасовий модуль, щоб надати ці стандартні визначення та інструменти, а також деякі умовності для ситуацій, коли анотації недоступні.

Наприклад, ось проста функція, чий аргумент і тип повернення оголошено в анотаціях:

    def greeting(name: str) -> str:
        return 'Hello ' + name

While these annotations are available at runtime through the usual `__annotations__` attribute, no automatic type checking happens at runtime. Instead, it is assumed that a separate off-line type checker (e.g. mypy) will be used for on-demand source code analysis.

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

Дивись також

- документація модуля `typing`

- PEP 484 – Підказки щодо типу

    PEP, написаний Гвідо ван Россумом, Юккою Лехтосало та Лукашем Лангою; реалізований Гвідо ван Россумом.

- PEP 483 – Теорія підказок типів

    PEP, написаний Гвідо ван Россумом

### PEP 471 — функція os.scandir() — кращий і швидший ітератор каталогу

PEP 471 додає нову функцію ітерації каталогу, `os.scandir()`, до стандартної бібліотеки. Крім того, `os.walk()` тепер реалізовано за допомогою `scandir`, що робить його в 3-5 разів швидшим у системах POSIX і в 7-20 разів швидшим у системах Windows. Це значною мірою досягається за рахунок значного зменшення кількості викликів `os.stat()`, необхідних для перегляду дерева каталогів.

Крім того, `scandir` повертає ітератор, на відміну від повернення списку імен файлів, що покращує ефективність пам’яті під час повторення дуже великих каталогів.

У наступному прикладі показано просте використання `os.scandir()` для відображення всіх файлів (за винятком каталогів) у заданому шляху, які не починаються з `'.'`. Виклик `entry.is_file()` зазвичай не виконує додаткових системних викликів:

    for entry in os.scandir(path):
        if not entry.name.startswith('.') and entry.is_file():
            print(entry.name)

Дивись також

PEP 471 – функція os.scandir() – кращий і швидший ітератор каталогу

  PEP написаний і реалізований Беном Хойтом за допомогою Віктора Стіннера.

### PEP 475: повторна спроба системних викликів, які не вдалися з EINTR

An `errno.EINTR` error code is returned whenever a system call, that is waiting for I/O, is interrupted by a signal. Previously, Python would raise `InterruptedError` in such cases. This meant that, when writing a Python application, the developer had two choices:

1. Ігноруйте `InterruptedError`.

2. Обробити `InterruptedError` і спробувати перезапустити перерваний системний виклик на кожному місці виклику.

Перший варіант призводить до періодичного збою програми. Другий варіант додає велику кількість шаблонів, що робить код майже нечитабельним. Порівняти:

    print("Hello World")

і:

    while True:
        try:
            print("Hello World")
            break
        except InterruptedError:
            continue

PEP 475 реалізує автоматичний повтор системних викликів на `EINTR`. Це знімає тягар роботи з `EINTR` або `InterruptedError` у коді користувача в більшості ситуацій і робить програми Python, включаючи стандартну бібліотеку, більш надійними. Зауважте, що повторна спроба системного виклику виконується, лише якщо обробник сигналу не викликає виняткової ситуації.

Нижче наведено список функцій, які зараз виконуються повторно, коли їх перериває сигнал:

- `open()` і `io.open()`;

- функції модуля `faulthandler`;

- `os` функції: `fchdir()`, `fchmod()`, `fchown()`, `fdatasync()`, `fstat()`, `fstatvfs()`, `fsync()`, `ftruncate()`, `mkfifo()`, `mknod()`, `open()`, `posix_fadvise()`, `posix_fallocate()`, `pread()`, `pwrite()`, `read()`, `readv()`, `sendfile()`, `wait3()`, `wait4()`, `wait()`, `waitid()`, `waitpid()`, `write()`, `writev()`;

- special cases: `os.close()` and `os.dup2()` now ignore `EINTR` errors; the syscall is not retried (see the PEP for the rationale);

- `select` функції: `devpoll.poll()`, `epoll.poll()`, `kqueue.control()`, `poll. poll()`, `select()`;

- методи класу `socket`: `accept()`, `connect()` (крім неблокуючих сокетів), `recv()`, `recvfrom()`, `recvmsg()`, `send()`, `sendall()`, `sendmsg()`, `sendto()`;

- `signal.sigtimedwait()` і `signal.sigwaitinfo()`;

- `time.sleep()`.

Дивись також

PEP 475 – Повторити системні виклики, які не вдалися з EINTR

  PEP та реалізація написані Шарлем-Франсуа Наталі та Віктором Стіннером за допомогою Антуана Пітру (французький зв’язок).

### PEP 479: змініть обробку StopIteration всередині генераторів

Взаємодія генераторів і `StopIteration` в Python 3.4 і раніших версіях іноді була несподіваною і могла приховувати незрозумілі помилки. Раніше `StopIteration`, викликаний випадково у функції генератора, інтерпретувався як кінець ітерації конструкцією циклу, що керує генератором.

PEP 479 змінює поведінку генераторів: коли всередині генератора виникає виняткова ситуація `StopIteration`, вона замінюється на `RuntimeError` перед тим, як вийти з кадру генератора. Основна мета цієї зміни полягає в тому, щоб полегшити налагодження в ситуації, коли незахищений виклик `next()` викликає `StopIteration` і змушує ітерацію, керовану генератором, мовчки завершувати. Це особливо згубно в поєднанні з конструкцією `вихід від`.

Це зворотно несумісна зміна, тому, щоб увімкнути нову поведінку, потрібен імпорт __future__:

    >>> from __future__ import generator_stop

    >>> def gen():
    ...     next(iter([]))
    ...     yield
    ...
    >>> next(gen())
    Traceback (most recent call last):
      File "<stdin>", line 2, in gen
    StopIteration

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    RuntimeError: generator raised StopIteration

Без імпорту `__future__` `PendingDeprecationWarning` буде викликано щоразу, коли всередині генератора буде викликано виключення `StopIteration`.

Дивись також

PEP 479 – Змінити обробку StopIteration всередині генераторів

  PEP, написаний Крісом Анджеліко та Гвідо ван Россумом. Реалізували Кріс Анжеліко, Юрій Селіванов та Нік Коглан.

### PEP 485: функція для перевірки приблизної рівності

PEP 485 додає функції `math.isclose()` і `cmath.isclose()`, які повідомляють, чи є два значення приблизно рівними або «близькими» одне до одного. Чи вважаються два значення близькими чи ні, визначається відповідно до заданих абсолютних і відносних допусків. Відносний допуск — це максимально дозволена різниця між аргументами `isclose` відносно більшого абсолютного значення:

    >>> import math
    >>> a = 5.0
    >>> b = 4.99998
    >>> math.isclose(a, b, rel_tol=1e-5)
    True
    >>> math.isclose(a, b, rel_tol=1e-6)
    False

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

    >>> import math
    >>> a = 5.0
    >>> b = 4.99998
    >>> math.isclose(a, b, abs_tol=0.00003)
    True
    >>> math.isclose(a, b, abs_tol=0.00001)
    False

Дивись також

PEP 485 – Функція для перевірки приблизної рівності

  PEP, написаний Крістофером Баркером; реалізували Кріс Баркер і Тал Ейнат.

### PEP 486: інформуйте програму запуску Python про віртуальні середовища

PEP 486 повідомляє програму запуску Windows (див. PEP 397) про активне віртуальне середовище. Якщо використовуватиметься інтерпретатор за замовчуванням і встановлено змінну середовища `VIRTUAL_ENV`, використовуватиметься інтерпретатор у віртуальному середовищі.

Дивись також

PEP 486 – Зробіть програму запуску Python інформованою про віртуальні середовища

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

### PEP 488: видалення файлів PYO

PEP 488 скасовує концепцію файлів `.pyo`. Це означає, що файли `.pyc` представляють як неоптимізований, так і оптимізований байт-код. Щоб уникнути необхідності постійного відновлення файлів байт-коду, файли `.pyc` тепер мають додатковий тег `opt-` у своїй назві, коли байт-код оптимізується. Побічним ефектом цього є відсутність зіткнень імен файлів байт-кодів під час роботи з `-O` або `-OO`. Отже, файли байт-коду, створені за допомогою `-O` і `-OO`, тепер можуть існувати одночасно. `importlib.util.cache_from_source()` має оновлений API, щоб допомогти з цією зміною.

Дивись також

PEP 488 – Видалення файлів PYO

  PEP написаний і реалізований Бреттом Кенноном.

### PEP 489: Ініціалізація багатофазного модуля розширення

PEP 489 оновлює ініціалізацію модуля розширення, щоб скористатися двоетапним механізмом завантаження модуля, представленим PEP 451 у Python 3.4.

Ця зміна наближає семантику імпорту модулів розширення, які вибирають використання нового механізму, до семантики вихідного коду Python і модулів байт-коду, включаючи можливість використовувати будь-який дійсний ідентифікатор як ім’я модуля, а не обмеження ASCII.

Дивись також

PEP 489 – Ініціалізація багатофазного модуля розширення

  PEP, написаний Петром Вікторіним, Стефаном Бенелем і Ніком Когланом; реалізував Петро Вікторін.

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

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

- Додано обробники помилок `"namereplace"`. Обробники помилок `"backslashreplace"` тепер працюють з декодуванням і перекладом. (Надав Сергій Сторчака в bpo-19676 і bpo-22286.)

- Параметр `-b` тепер впливає на порівняння `bytes` з `int`. (Надав Сергій Сторчака в bpo-23681.)

- Нові казахські `kz1048` і таджицькі `koi8_t` кодеки. (Надав Сергій Сторчака в bpo-22682 і bpo-22681.)

- Документаційні рядки властивостей тепер доступні для запису. Це особливо корисно для рядків документів `collections.namedtuple()`. (Надано Berker Peksag у bpo-24064.)

- Тепер підтримується циклічний імпорт із відносним імпортом. (Надано Бреттом Кенноном і Антуаном Пітру в bpo-17636.)

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

### введення тексту

Новий модуль `typing` provisional надає стандартні визначення та інструменти для анотацій типів функцій. Дивіться Підказки типу для отримання додаткової інформації.

### zipap

Новий модуль `zipapp` (зазначений у PEP 441) надає API та інструмент командного рядка для створення виконуваних програм Python Zip, які були представлені в Python 2.6 у bpo-1739468, але які були не було широко розголошено ні в той час, ні після.

З новим модулем об’єднати вашу програму так само просто, як помістити всі файли, включно з файлом `__main__.py`, у каталог `myapp` і запустити:

    $ python -m zipapp myapp
    $ python myapp.pyz

Реалізацію модуля надав Пол Мур у bpo-23491.

Дивись також

PEP 441 – Покращення підтримки програм Python ZIP

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

### argparse

Клас `ArgumentParser` тепер дозволяє вимкнути скорочене використання довгих параметрів, встановивши дозволити_скорочене значення `False`. (Надано Джонатаном По, Стівеном Бетардом, Полом j3 і Даніелем Ерікссоном у bpo-14910.)

### asyncio

Оскільки модуль `asyncio` є тимчасовим, усі зміни, внесені в Python 3.5, також було перенесено до Python 3.4.x.

Помітні зміни в модулі `asyncio` з Python 3.4.0:

- Нові API налагодження: методи `loop.set_debug()` і `loop.get_debug()`. (Надав Віктор Стіннер.)

- Цикл подій proactor тепер підтримує SSL. (Надано Антуаном Пітру та Віктором Стіннером у bpo-22560.)

- Новий метод `loop.is_closed()` для перевірки, чи замкнутий цикл подій. (Надав Віктор Стіннер у bpo-21326.)

- Новий `loop.create_task()` для зручного створення та планування нового `Task` для співпрограми. Метод `create_task` також використовується всіма асинхронними функціями, які об’єднують співпрограми в завдання, наприклад `asyncio.wait()`, `asyncio.gather()` тощо (Надано Віктором Стіннером.)

- Новий метод `transport.get_write_buffer_limits()` для запиту високих і низьких обмежень води для керування потоком. (Надав Віктор Стіннер.)

- The `async()` function is deprecated in favor of `ensure_future()`. (Contributed by Yury Selivanov.)

- Нові методи `loop.set_task_factory()` і `loop.get_task_factory()` для налаштування фабрики завдань, яку використовує метод `loop.create_task()`. (Уклав Юрій Селіванов.)

- Нові методи черги `Queue.join()` і `Queue.task_done()`. (Надав Віктор Стіннер.)

- Клас `JoinableQueue` було видалено на користь класу `asyncio.Queue`. (Надав Віктор Стіннер.)

Оновлення в 3.5.1:

- Функція `ensure_future()` і всі функції, які її використовують, такі як `loop.run_until_complete()`, тепер приймають усі типи awaitable об’єктів. (Уклав Юрій Селіванов.)

- Нова функція `run_coroutine_threadsafe()` для надсилання співпрограм до циклів подій з інших потоків. (Надав Вінсент Мішель.)

- Новий метод `Transport.is_closing()` для перевірки, закривається чи закривається транспорт. (Уклав Юрій Селіванов.)

- Метод `loop.create_server()` тепер може приймати список хостів. (Надав Ян Сіно.)

Оновлення в 3.5.2:

- Новий метод `loop.create_future()` для створення об’єктів Future. Це дозволяє альтернативним реалізаціям циклу подій, таким як uvloop, забезпечити швидшу реалізацію `asyncio.Future`. (Уклав Юрій Селіванов.)

- Новий метод `loop.get_exception_handler()` для отримання поточного обробника винятків. (Уклав Юрій Селіванов.)

- Новий метод `StreamReader.readuntil()` для читання даних із потоку, доки не з’явиться послідовність байтів-роздільників. (Надав Марк Коренберг.)

- Методи `loop.create_connection()` і `loop.create_server()` оптимізовано, щоб уникнути виклику системної функції `getaddrinfo`, якщо адресу вже визначено. (Надав А. Джессі Джірю Девіс.)

- `loop.sock_connect(sock, address)` більше не вимагає визначення адреси перед викликом. (Надав А. Джессі Джірю Девіс.)

### bz2

Метод `BZ2Decompressor.decompress` тепер приймає додатковий аргумент max_length для обмеження максимального розміру розпакованих даних. (Надав Ніколаус Рат у bpo-15955.)

### cgi

The `FieldStorage` class now supports the context manager protocol. (Contributed by Berker Peksag in bpo-20289.)

### cmath

Нова функція `isclose()` надає спосіб перевірити приблизну рівність. (Надано Крісом Баркером і Тал Ейнатом у bpo-24270.)

### код

Метод `InteractiveInterpreter.showtraceback()` тепер друкує повний ланцюжок трасування, як і інтерактивний інтерпретатор. (Надав Клаудіу Попа в bpo-17442.)

### колекції

Клас `OrderedDict` тепер реалізовано в C, що робить його від 4 до 100 разів швидшим. (Надав Ерік Сноу в bpo-16991.)

`OrderedDict.items()`, `OrderedDict.keys()`, and `OrderedDict.values()` views now support `reversed()` iteration. (Contributed by Serhiy Storchaka in bpo-19505.)

Клас `deque` тепер визначає `index()`, `insert()` і `copy()`, і підтримує оператори `+` і `*`. Це дозволяє розпізнавати двокомпонентні послідовності як `MutableSequence` і покращує їх замінність списками. (Надав Реймонд Геттінгер у bpo-23704.)

Рядки документів, створені `namedtuple()`, тепер можна оновлювати:

    Point = namedtuple('Point', ['x', 'y'])
    Point.__doc__ += ': Cartesian coordinate'
    Point.x.__doc__ = 'abscissa'
    Point.y.__doc__ = 'ordinate'

(Надано Berker Peksag у bpo-24064.)

The `UserString` class now implements the `__getnewargs__()`, `__rmod__()`, `casefold()`, `format_map()`, `isprintable()`, and `maketrans()` methods to match the corresponding methods of `str`. (Contributed by Joe Jevnik in bpo-22189.)

### колекції.abc

The `Sequence.index()` method now accepts start and stop arguments to match the corresponding methods of `tuple`, `list`, etc. (Contributed by Devin Jeanpierre in bpo-23086.)

Новий `Generator` абстрактний базовий клас. (Надав Стефан Бенель у bpo-24018.)

Нові `Awaitable`, `Coroutine`, `AsyncIterator` і `AsyncIterable` анотація базові класи. (Надав Юрій Селіванов у bpo-24184.)

For earlier Python versions, a backport of the new ABCs is available in an external PyPI package.

### compileall

Нова опція `compileall`, `-j N`, дозволяє запускати N робочих процесів одночасно для виконання паралельної компіляції байт-коду. Функція `compile_dir()` має відповідний параметр `workers`. (Надав Клаудіу Попа в bpo-16104.)

Ще один новий параметр, `-r`, дозволяє контролювати максимальний рівень рекурсії для підкаталогів. (Надав Клаудіу Попа в bpo-19628.)

Параметр командного рядка `-q` тепер можна вказувати кілька разів, у цьому випадку всі виведення, включаючи помилки, будуть придушені. Відповідний параметр `quiet` у `compile_dir()`, `compile_file()` і `compile_path()` тепер може приймати ціле значення, що вказує на рівень виведення придушення. (Надав Томас Клюйвер у bpo-21338.)

### concurrent.futures

Метод `Executor.map()` тепер приймає аргумент chunksize, щоб дозволити групування завдань для підвищення продуктивності, коли використовується `ProcessPoolExecutor()`. (Надав Ден О’Райлі в bpo-11271.)

Кількість робітників у конструкторі `ThreadPoolExecutor` тепер необов’язкова. Значення за замовчуванням у 5 разів перевищує кількість ЦП. (Надав Клаудіу Попа в bpo-21527.)

### аналізатор конфігурації

`configparser` тепер надає можливість налаштувати перетворення значень, вказавши словник перетворювачів у конструкторі `ConfigParser` або визначивши їх як методи в підкласах `ConfigParser`. Конвертери, визначені в екземплярі аналізатора, успадковуються його проксі-серверами розділів.

Приклад:

    >>> import configparser
    >>> conv = {}
    >>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
    >>> cfg = configparser.ConfigParser(converters=conv)
    >>> cfg.read_string("""
    ... [s]
    ... list = a b c d e f g
    ... """)
    >>> cfg.get('s', 'list')
    'a b c d e f g'
    >>> cfg.getlist('s', 'list')
    ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> section = cfg['s']
    >>> section.getlist('list')
    ['a', 'b', 'c', 'd', 'e', 'f', 'g']

(Надав Łukasz Langa в bpo-18159.)

### contextlib

Новий `redirect_stderr()` context manager (схожий на `redirect_stdout()`) спрощує роботу сценаріїв утиліт з негнучкими API, які записують свій вихід до `sys.stderr` і не надає жодних опцій для його перенаправлення:

    >>> import contextlib, io, logging
    >>> f = io.StringIO()
    >>> with contextlib.redirect_stderr(f):
    ...     logging.warning('warning')
    ...
    >>> f.getvalue()
    'WARNING:root:warning\n'

(Надано Berker Peksag у bpo-22389.)

### csv

Метод `writerow()` тепер підтримує довільні ітерації, а не лише послідовності. (Надав Сергій Сторчака в bpo-23171.)

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

The new `update_lines_cols()` function updates the `LINES` and `COLS` module variables. This is useful for detecting manual screen resizing. (Contributed by Arnon Yaari in bpo-4254.)

### dbm

`dumb.open` завжди створює нову базу даних, якщо прапорець має значення `"n"`. (Надав Клаудіу Попа в bpo-18039.)

### difflib

Набір символів HTML-документів, згенерованих `HtmlDiff.make_file()`, тепер можна налаштувати за допомогою нового аргументу charset, що містить лише ключове слово. Стандартний набір кодів HTML-документа змінено з `"ISO-8859-1"` на `"utf-8"`. (Надано Berker Peksag у bpo-2052.)

Функція `diff_bytes()` тепер може порівнювати списки рядків байтів. Це виправляє регресію з Python 2. (Надано Terry J. Reedy і Greg Ward у bpo-17445.)

### distutils

Обидві команди `build` і `build_ext` тепер приймають опцію `-j`, щоб увімкнути паралельне створення модулів розширення. (Надав Антуан Пітру в bpo-5309.)

The `distutils` module now supports `xz` compression, and can be enabled by passing `xztar` as an argument to `bdist --format`. (Contributed by Serhiy Storchaka in bpo-16314.)

### doctest

Функція `DocTestSuite()` повертає порожній `unittest.TestSuite`, якщо module не містить рядків документації, замість того, щоб викликати `ValueError`. (Надав Гленн Джонс у bpo-15916.)

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

Нова опція політики `Policy.mangle_from_` контролює, чи додають генератори до рядків, які починаються з `"From "`, у тексті електронної пошти префікс `">"`. За замовчуванням для `compat32` є `True` і `False` для всіх інших політик. (Надано Міланом Оберкірхом у bpo-20098.)

Новий метод `Message.get_content_disposition()` забезпечує легкий доступ до канонічного значення для заголовка Content-Disposition. (Надав Абхілаш Радж у bpo-21083.)

Для нового параметра політики `EmailPolicy.utf8` можна встановити значення `True` для кодування заголовків електронної пошти за допомогою набору символів UTF-8 замість використання закодованих слів. Це дозволяє форматувати `повідомлення` відповідно до RFC 6532 і використовувати їх із сервером SMTP, який підтримує RFC 6531 розширення `SMTPUTF8`. (Надав Р. Девід Мюррей у bpo-24211.)

Конструктор `mime.text.MIMEText` тепер приймає екземпляр `charset.Charset`. (Надано Клодом Парозом і Беркером Пексагом у bpo-16324.)

### enum

Викликаний `Enum` має новий параметр start для визначення початкової кількості значень переліку, якщо надано лише імена:

    >>> Animal = enum.Enum('Animal', 'cat dog', start=10)
    >>> Animal.cat
    <Animal.cat: 10>
    >>> Animal.dog
    <Animal.dog: 11>

(Надав Ітан Фурман у bpo-21706.)

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

Функції `enable()`, `register()`, `dump_traceback()` і `dump_traceback_later()` тепер приймають дескриптори файлів на додаток до file- як предмети. (Надав Вей Ву в bpo-23566.)

### functools

Більшість механізмів `lru_cache()` тепер реалізовано на C, що робить його значно швидшим. (Надано Метом Джойнером, Олексієм Качаєвим і Сергієм Сторчакою в bpo-14373.)

### глоб

Функції `iglob()` і `glob()` тепер підтримують рекурсивний пошук у підкаталогах за шаблоном `"**"`. (Надав Сергій Сторчака в bpo-13968.)

### gzip

Аргумент mode конструктора `GzipFile` тепер приймає `"x"` для запиту ексклюзивного створення. (Надав Тім Хіні в bpo-19222.)

### heapq

Порівняння елементів у `merge()` тепер можна налаштувати, передавши key function в новий необов’язковий аргумент ключового слова key, а новий додатковий аргумент ключового слова reverse можна використовувати для зворотного порівняння елементів:

    >>> import heapq
    >>> a = ['9', '777', '55555']
    >>> b = ['88', '6666']
    >>> list(heapq.merge(a, b, key=len))
    ['9', '88', '777', '6666', '55555']
    >>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
    ['55555', '6666', '777', '88', '9']

(Надав Реймонд Геттінгер у bpo-13742.)

### http

Новий перелік `HTTPStatus`, який визначає набір кодів стану HTTP, фраз причин і довгих описів, написаних англійською мовою. (Надав Деміан Брехт у bpo-21793.)

### http.client

`HTTPConnection.getresponse()` тепер викликає виняток `RemoteDisconnected`, коли з’єднання з віддаленим сервером неочікувано закривається. Крім того, якщо виникає `ConnectionError` (підкласом якого є `RemoteDisconnected`), клієнтський сокет тепер автоматично закривається та підключатиметься за наступним запитом:

    import http.client
    conn = http.client.HTTPConnection('www.python.org')
    for retries in range(3):
        try:
            conn.request('GET', '/')
            resp = conn.getresponse()
        except http.client.RemoteDisconnected:
            pass

(Надав Мартін Пантер у bpo-3566.)

### idlelib і IDLE

Оскільки idlelib реалізує оболонку та редактор IDLE і не призначений для імпорту іншими програмами, він отримує покращення з кожним випуском. Дивіться `Lib/idlelib/NEWS.txt` для сукупного списку змін, внесених після версії 3.4.0, а також змін, внесених у майбутніх версіях 3.5.x. Цей файл також доступний у діалоговому вікні IDLE Довідка ‣ Про IDLE.

### імапліб

Клас `IMAP4` тепер підтримує протокол context manager. У разі використання в операторі `with` команда `LOGOUT` IMAP4 буде викликана автоматично в кінці блоку. (Надано Тареком Зіаде та Сергієм Сторчакою в bpo-4972.)

Модуль `imaplib` тепер підтримує RFC 5161 (розширення ENABLE) і RFC 6855 (підтримка UTF-8) через метод `IMAP4.enable()`. Новий атрибут `IMAP4.utf8_enabled` відстежує, чи ввімкнено підтримку RFC 6855. (Надано Міланом Оберкірхом, Р. Девідом Мюрреєм і Мацеєм Шуліком у bpo-21800.)

Модуль `imaplib` тепер автоматично кодує рядкові імена користувачів і паролі, відмінні від ASCII, за допомогою UTF-8, як рекомендовано RFC. (Надав Мілан Оберкірх у bpo-21800.)

### imghdr

The `what()` function now recognizes the OpenEXR format (contributed by Martin Vignali and Claudiu Popa in bpo-20295), and the WebP format (contributed by Fabrice Aneche and Claudiu Popa in bpo-20197.)

### importlib

Клас `util.LazyLoader` дозволяє відкладено завантажувати модулі в програмах, де важливий час запуску. (Надано Бреттом Кенноном у bpo-17621.)

Метод `abc.InspectLoader.source_to_code()` тепер є статичним методом. Це полегшує ініціалізацію об’єкта модуля кодом, скомпільованим із рядка, запустивши `exec(code, module.__dict__)`. (Надано Бреттом Кенноном у bpo-21156.)

Нова функція `util.module_from_spec()` тепер є кращим способом створення нового модуля. На відміну від безпосереднього створення екземпляра `types.ModuleType`, ця нова функція встановлюватиме різні контрольовані імпортом атрибути на основі переданого специфікаційного об’єкта. (Надано Бреттом Кенноном у bpo-20383.)

### оглядати

Обидва класи `Signature` і `Parameter` тепер можна вибирати та хешувати. (Надав Юрій Селіванов у bpo-20726 і bpo-20334.)

Новий метод `BoundArguments.apply_defaults()` забезпечує спосіб встановлення значень за замовчуванням для відсутніх аргументів:

    >>> def foo(a, b='ham', *args): pass
    >>> ba = inspect.signature(foo).bind('spam')
    >>> ba.apply_defaults()
    >>> ba.arguments
    OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

(Надав Юрій Селіванов у bpo-24190.)

Новий метод класу `Signature.from_callable()` полегшує створення підкласів `Signature`. (Надано Юрієм Селівановим та Еріком Сноу в bpo-17373.)

Функція `signature()` тепер приймає необов’язковий аргумент ключового слова follow_wrapped, який, якщо встановлено значення `False`, вимикає автоматичне перехід за посиланнями `__wrapped__`. (Надав Юрій Селіванов у bpo-20691.)

Додано набір нових функцій для перевірки функцій співпрограми та об’єктів співпрограми: `iscoroutine()`, `iscoroutinefunction()`, `isawaitable()`, `getcoroutinelocals()` і `getcoroutinestate()`. (Надав Юрій Селіванов у bpo-24017 та bpo-24400.)

Функції `stack()`, `trace()`, `getouterframes()` і `getinnerframes()` тепер повертають список іменованих кортежів. (Надав Даніель Шахаф у bpo-16808.)

### io

Новий метод `BufferedIOBase.readinto1()`, який використовує не більше одного виклику базового необробленого потоку методів `RawIOBase.read()` або `RawIOBase.readinto() a0c114382bc`922z0 . (Надав Ніколаус Рат у :issue:`20578()`.)

### IP-адреса

Обидва класи `IPv4Network` і `IPv6Network` тепер приймають аргумент кортежу `(адреса, маска мережі)`, щоб легко створювати мережеві об’єкти з існуючих адрес:

    >>> import ipaddress
    >>> ipaddress.IPv4Network(('127.0.0.0', 8))
    IPv4Network('127.0.0.0/8')
    >>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
    IPv4Network('127.0.0.0/8')

(Надано Пітером Муді та Антуаном Пітру в bpo-16531.)

A new `reverse_pointer` attribute for the `IPv4Address` and `IPv6Address` classes returns the name of the reverse DNS PTR record:

    >>> import ipaddress
    >>> addr = ipaddress.IPv4Address('127.0.0.1')
    >>> addr.reverse_pointer
    '1.0.0.127.in-addr.arpa'
    >>> addr6 = ipaddress.IPv6Address('::1')
    >>> addr6.reverse_pointer
    '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(Надав Леон Вебер у bpo-20480.)

### json

Інтерфейс командного рядка `json.tool` тепер зберігає порядок ключів в об’єктах JSON, переданих у вхідних даних. Новий параметр `--sort-keys` можна використовувати для сортування ключів за алфавітом. (Надано Berker Peksag у bpo-21650.)

Декодер JSON тепер викликає `JSONDecodeError` замість `ValueError`, щоб надати кращу контекстну інформацію про помилку. (Надав Сергій Сторчака в bpo-19361.)

### лінійний кеш

Нову функцію `lazycache()` можна використовувати для захоплення інформації про нефайловий модуль, щоб дозволити отримати його рядки пізніше через `getline()`. Це дозволяє уникнути введення/виведення, доки рядок дійсно не знадобиться, без необхідності носити глобальні модулі безкінечно. (Надав Роберт Коллінз у bpo-17911.)

### локаль

Нову функцію `delocalize()` можна використовувати для перетворення рядка в нормалізований рядок чисел, враховуючи параметри `LC_NUMERIC`:

    >>> import locale
    >>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
    'de_DE.UTF-8'
    >>> locale.delocalize('1.234,56')
    '1234.56'
    >>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
    'en_US.UTF-8'
    >>> locale.delocalize('1,234.56')
    '1234.56'

(Надав Седрик Крієр у bpo-13918.)

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

Усі методи журналювання (`Logger` `log()`, `exception()`, `critical()`, `debug()` тощо), тепер приймають випадки винятків як аргумент exc_info на додаток до логічних значень і кортежів винятків:

    >>> import logging
    >>> try:
    ...     1/0
    ... except ZeroDivisionError as ex:
    ...     logging.error('exception', exc_info=ex)
    ERROR:root:exception

(Надав Юрій Селіванов у bpo-20537.)

Клас `handlers.HTTPHandler` тепер приймає додатковий екземпляр `ssl.SSLContext` для налаштування параметрів SSL, які використовуються в HTTP-з’єднанні. (Надав Алекс Гейнор у bpo-22788.)

Клас `handlers.QueueListener` тепер приймає аргумент ключового слова respect_handler_level, який, якщо встановити значення `True`, передаватиме повідомлення обробникам з урахуванням рівнів обробників. (Надав Віней Саджип.)

### lzma

Метод `LZMADecompressor.decompress()` тепер приймає додатковий аргумент max_length для обмеження максимального розміру розпакованих даних. (Надав Мартін Пантер у bpo-15955.)

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

До модуля `math` додано дві нові константи: `inf` і `nan`. (Надав Марк Дікінсон у bpo-23185.)

Нова функція `isclose()` надає спосіб перевірити приблизну рівність. (Надано Крісом Баркером і Тал Ейнатом у bpo-24270.)

A new `gcd()` function has been added. The `fractions.gcd()` function is now deprecated. (Contributed by Mark Dickinson and Serhiy Storchaka in bpo-22486.)

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

`sharedctypes.synchronized()` об’єкти тепер підтримують протокол context manager. (Надав Шарль-Франсуа Наталі в bpo-21565.)

### оператор

Об’єкти `attrgetter()`, `itemgetter()` і `methodcaller()` тепер підтримують травлення. (Надано Джошем Розенбергом і Сергієм Сторчакою в bpo-22955.)

Нові функції `matmul()` і `imatmul()` для виконання множення матриць. (Надав Бенджамін Петерсон у bpo-21176.)

### ос

Додано нову функцію `scandir()`, яка повертає ітератор об’єктів `DirEntry`. Якщо можливо, `scandir()` витягує атрибути файлів під час сканування каталогу, усуваючи необхідність виконувати наступні системні виклики для визначення типу файлу або атрибутів, що може значно покращити продуктивність. (Надано Беном Хойтом за допомогою Віктора Стіннера в bpo-22524.)

У Windows тепер доступний новий атрибут `stat_result.st_file_attributes`. Він відповідає члену `dwFileAttributes` структури `BY_HANDLE_FILE_INFORMATION`, яку повертає `GetFileInformationByHandle()`. (Надав Бен Хойт у bpo-21719.)

Функція `urandom()` тепер використовує системний виклик `getrandom()` у Linux 3.17 або новіших версіях і `getentropy()` в OpenBSD 5.6 і новіших версіях, усуваючи необхідність використовувати `/ dev/urandom` та уникнення збоїв через потенційне вичерпання дескриптора файлу. (Надав Віктор Стіннер у bpo-22181.)

New `get_blocking()` and `set_blocking()` functions allow getting and setting a file descriptor’s blocking mode (`O_NONBLOCK`.) (Contributed by Victor Stinner in bpo-22054.)

Функції `truncate()` і `ftruncate()` тепер підтримуються в Windows. (Надав Стів Дауер у bpo-23668.)

Існує нова функція `os.path.commonpath()`, яка повертає найдовший загальний підшлях кожного переданого шляху. На відміну від функції `os.path.commonprefix()`, вона завжди повертає дійсний шлях:

    >>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
    '/usr/l'

    >>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
    '/usr'

(Надано Рафіком Драуї та Сергієм Сторчакою в bpo-10395.)

### pathlib

Новий метод `Path.samefile()` можна використовувати, щоб перевірити, чи шлях вказує на той самий файл, що й інший шлях, який може бути іншим об’єктом `Path` або рядком

    >>> import pathlib
    >>> p1 = pathlib.Path('/etc/hosts')
    >>> p2 = pathlib.Path('/etc/../etc/hosts')
    >>> p1.samefile(p2)
    True

(Надано Vajrasky Kok і Antoine Pitrou у bpo-19775.)

Метод `Path.mkdir()` тепер приймає новий необов’язковий аргумент exist_ok для відповідності `mkdir -p` і функції `os.makedirs()`. (Надано Berker Peksag у bpo-21539.)

Існує новий метод `Path.expanduser()` для розширення префіксів `~` і `~user`. (Надано Сергієм Сторчакою та Клаудіу Попою в bpo-19776.)

Новий метод класу `Path.home()` можна використовувати для отримання екземпляра `Path`, який представляє домашній каталог користувача. (Надано Віктором Сальгадо та Маянком Тріпаті в bpo-19777.)

Нові методи `Path.write_text()`, `Path.read_text()`, `Path.write_bytes()`, `Path.read_bytes()` для спрощення операцій з читання/запису файлів.

Наступний фрагмент коду створить або перепише існуючий файл `~/spam42`:

    >>> import pathlib
    >>> p = pathlib.Path('~/spam42')
    >>> p.expanduser().write_text('ham')
    3

(Надав Крістофер Велборн у bpo-20218.)

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

Вкладені об’єкти, такі як незв’язані методи чи вкладені класи, тепер можна вибирати за допомогою протоколів pickle, старших за протокол версії 4. Протокол версії 4 уже підтримує ці випадки. (Надав Сергій Сторчака в bpo-23611.)

### попліб

Нова команда `POP3.utf8()` вмикає підтримку RFC 6856 (інтернаціоналізованої електронної пошти), якщо це підтримує POP-сервер. (Надано Milan OberKirch у bpo-21804.)

### повторно

Посилання та умовні посилання на групи з фіксованою довжиною тепер дозволені в ретроспективних твердженнях:

    >>> import re
    >>> pat = re.compile(r'(a|b).(?<=\1)c')
    >>> pat.match('aac')
    <_sre.SRE_Match object; span=(0, 3), match='aac'>
    >>> pat.match('bbc')
    <_sre.SRE_Match object; span=(0, 3), match='bbc'>

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

Кількість груп захоплення в регулярних виразах більше не обмежується 100. (Надано Сергієм Сторчакою в bpo-22437.)

Функції `sub()` і `subn()` тепер замінюють невідповідні групи порожніми рядками замість того, щоб викликати виключення. (Надав Сергій Сторчака в bpo-1519638.)

The `re.error` exceptions have new attributes, `msg`, `pattern`, `pos`, `lineno`, and `colno`, that provide better context information about the error:

    >>> re.compile("""
    ...     (?x)
    ...     .++
    ... """)
    Traceback (most recent call last):
       ...
    sre_constants.error: multiple repeat at position 16 (line 3, column 7)

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

### readline

Нову функцію `append_history_file()` можна використовувати для додавання вказаної кількості кінцевих елементів в історії до даного файлу. (Надав Бруно Кауе в bpo-22940.)

### селектори

Новий `DevpollSelector` підтримує ефективне опитування `/dev/poll` у Solaris. (Надав Джампаоло Родола в bpo-18931.)

### шутил

Функція `move()` тепер приймає аргумент copy_function, що дозволяє, наприклад, використовувати функцію `copy()` замість стандартного `copy2()` якщо необхідно ігнорувати метадані файлу під час переміщення. (Надав Клаудіу Попа в bpo-19840.)

Функція `make_archive()` тепер підтримує формат xztar. (Надав Сергій Сторчака в bpo-5411.)

### сигнал

У Windows функція `set_wakeup_fd()` тепер також підтримує дескриптори сокетів. (Надав Віктор Стіннер у bpo-22018.)

Різні константи `SIG*` в модулі `signal` були перетворені в `Enums`. Це дозволяє друкувати осмислені імена під час налагодження замість цілих «магічних чисел». (Надав Джампаоло Родола в bpo-21076.)

### smtpd

Both the `SMTPServer` and `SMTPChannel` classes now accept a decode_data keyword argument to determine if the `DATA` portion of the SMTP transaction is decoded using the `"utf-8"` codec or is instead provided to the `SMTPServer.process_message()` method as a byte string. The default is `True` for backward compatibility reasons, but will change to `False` in Python 3.6. If decode_data is set to `False`, the `process_message` method must be prepared to accept keyword arguments. (Contributed by Maciej Szulik in bpo-19662.)

The `SMTPServer` class now advertises the `8BITMIME` extension ( RFC 6152) if decode_data has been set `True`. If the client specifies `BODY=8BITMIME` on the `MAIL` command, it is passed to `SMTPServer.process_message()` via the mail_options keyword. (Contributed by Milan Oberkirch and R. David Murray in bpo-21795.)

The `SMTPServer` class now also supports the `SMTPUTF8` extension ( RFC 6531: Internationalized Email). If the client specified `SMTPUTF8 BODY=8BITMIME` on the `MAIL` command, they are passed to `SMTPServer.process_message()` via the mail_options keyword. It is the responsibility of the `process_message` method to correctly handle the `SMTPUTF8` data. (Contributed by Milan Oberkirch in bpo-21725.)

It is now possible to provide, directly or via name resolution, IPv6 addresses in the `SMTPServer` constructor, and have it successfully connect. (Contributed by Milan Oberkirch in bpo-14758.)

### smtplib

Новий метод `SMTP.auth()` забезпечує зручний спосіб реалізації спеціальних механізмів автентифікації. (Надав Мілан Оберкірх у bpo-15014.)

Метод `SMTP.set_debuglevel()` тепер приймає додатковий рівень налагодження (2), який умикає мітки часу в повідомленнях налагодження. (Надано Гевіном Чаппеллом і Мацеєм Шуліком у bpo-16914.)

Обидва методи `SMTP.sendmail()` і `SMTP.send_message()` тепер підтримують RFC 6531 (SMTPUTF8). (Надано Міланом Оберкірхом і Р. Девідом Мюрреєм у bpo-22027.)

### sndhdr

The `what()` and `whathdr()` functions now return a `namedtuple()`. (Contributed by Claudiu Popa in bpo-18615.)

### гніздо

Функції з тайм-аутами тепер використовують монотонний годинник замість системного. (Надав Віктор Стіннер у bpo-22043.)

Новий метод `socket.sendfile()` дозволяє надсилати файл через сокет за допомогою високопродуктивної функції `os.sendfile()` в UNIX, що призводить до завантаження в 2-3 рази швидше, ніж при використанні простого `socket.send()`. (Надав Джампаоло Родола в bpo-17552.)

Метод `socket.sendall()` більше не скидає тайм-аут сокета кожного разу, коли байти надходять або надсилаються. Час очікування сокета тепер є максимальною загальною тривалістю надсилання всіх даних. (Надав Віктор Стіннер у bpo-23853.)

Аргумент backlog методу `socket.listen()` тепер необов’язковий. За замовчуванням встановлено `SOMAXCONN` або `128`, залежно від того, що менше. (Надав Шарль-Франсуа Наталі в bpo-21455.)

### ssl

#### Підтримка BIO пам’яті

(Надав Герт Янсен у bpo-21965.)

Новий клас `SSLObject` було додано, щоб забезпечити підтримку протоколу SSL у випадках, коли можливості мережевого вводу/виводу `SSLSocket` не потрібні або неоптимальні. `SSLObject` представляє екземпляр протоколу SSL, але не реалізує жодних мережевих методів вводу/виводу, натомість надає інтерфейс буфера пам’яті. Новий клас `MemoryBIO` можна використовувати для передачі даних між Python і екземпляром протоколу SSL.

Підтримка SSL BIO пам’яті в першу чергу призначена для використання в структурах, що реалізують асинхронний ввід-вивід, для яких модель готовності `SSLSocket` («вибір/опитування») неефективна.

Новий метод `SSLContext.wrap_bio()` можна використати для створення нового екземпляра `SSLObject`.

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

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

Там, де є підтримка OpenSSL, модуль `ssl` тепер реалізує розширення TLS Application-Layer Protocol Negotiation, як описано в RFC 7301.

Новий `SSLContext.set_alpn_protocols()` можна використовувати, щоб вказати, які протоколи сокет має оголосити під час рукостискання TLS.

The new `SSLSocket.selected_alpn_protocol()` returns the protocol that was selected during the TLS handshake. The `HAS_ALPN` flag indicates whether ALPN support is present.

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

Існує новий метод `SSLSocket.version()` для запиту фактичної версії протоколу, що використовується. (Надав Антуан Пітру в bpo-20421.)

The `SSLSocket` class now implements a `SSLSocket.sendfile()` method. (Contributed by Giampaolo Rodola“ in bpo-17552.)

The `SSLSocket.send()` method now raises either the `ssl.SSLWantReadError` or `ssl.SSLWantWriteError` exception on a non-blocking socket if the operation would block. Previously, it would return `0`. (Contributed by Nikolaus Rath in bpo-20951.)

Функція `cert_time_to_seconds()` тепер інтерпретує введений час як UTC, а не як місцевий час відповідно до RFC 5280. Крім того, повертається значення завжди `int`. (Надав Акіра Лі в bpo-19940.)

New `SSLObject.shared_ciphers()` and `SSLSocket.shared_ciphers()` methods return the list of ciphers sent by the client during the handshake. (Contributed by Benjamin Peterson in bpo-23186.)

The `SSLSocket.do_handshake()`, `SSLSocket.read()`, `SSLSocket.shutdown()`, and `SSLSocket.write()` methods of the `SSLSocket` class no longer reset the socket timeout every time bytes are received or sent. The socket timeout is now the maximum total duration of the method. (Contributed by Victor Stinner in bpo-23853.)

The `match_hostname()` function now supports matching of IP addresses. (Contributed by Antoine Pitrou in bpo-23239.)

### sqlite3

Клас `Row` тепер повністю підтримує протокол послідовності, зокрема `reversed()` ітерацію та індексування фрагментів. (Надано Клаудіу Попою в bpo-10203; Лукасом Сінклером, Джесікою Маккеллар і Сергієм Сторчакою в bpo-13583.)

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

Додано нову функцію `run()`. Він виконує вказану команду та повертає об’єкт `CompletedProcess`, який описує завершений процес. Новий API є більш послідовним і є рекомендованим підходом до виклику підпроцесів у коді Python, якому не потрібно підтримувати сумісність із попередніми версіями Python. (Надав Томас Клюйвер у bpo-23342.)

Приклади:

    >>> subprocess.run(["ls", "-l"])  # doesn't capture output
    CompletedProcess(args=['ls', '-l'], returncode=0)

    >>> subprocess.run("exit 1", shell=True, check=True)
    Traceback (most recent call last):
      ...
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

    >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
    CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
    stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

### система

A new `set_coroutine_wrapper()` function allows setting a global hook that will be called whenever a coroutine object is created by an `async def` function. A corresponding `get_coroutine_wrapper()` can be used to obtain a currently set wrapper. Both functions are provisional, and are intended for debugging purposes only. (Contributed by Yury Selivanov in bpo-24017.)

Нову функцію `is_finalizing()` можна використати, щоб перевірити, чи інтерпретатор Python вимикає. (Надав Антуан Пітру в bpo-22696.)

### sysconfig

Назва каталогу сценаріїв користувача в Windows тепер включає перші два компоненти версії Python. (Надав Пол Мур у bpo-23437.)

### tarfile

Аргумент mode функції `open()` тепер приймає `"x"` для запиту ексклюзивного створення. (Надано Berker Peksag у bpo-21717.)

Методи `TarFile.extractall()` і `TarFile.extract()` тепер приймають аргумент ключового слова numeric_owner. Якщо встановлено значення `True`, витягнуті файли та каталоги будуть належати числовим `uid` і `gid` з tarfile. Якщо встановлено значення `False` (за умовчанням і поведінка у версіях до 3.5), вони належатимуть вказаному користувачеві та групі в tar-файлі. (Надано Майклом Фогтом і Еріком Смітом у bpo-23193.)

`TarFile.list()` тепер приймає необов’язковий аргумент ключового слова members, який можна встановити як підмножину списку, який повертає `TarFile.getmembers()`. (Надав Сергій Сторчака в bpo-21549.)

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

Обидва методи `Lock.acquire()` і `RLock.acquire()` тепер використовують монотонний годинник для керування часом очікування. (Надав Віктор Стіннер у bpo-22043.)

### час

Функція `monotonic()` тепер доступна завжди. (Надав Віктор Стіннер у bpo-22043.)

### timeit

Новий параметр командного рядка `-u` або `--unit=U` можна використовувати для визначення одиниці часу для виведення таймером. Підтримувані параметри: `usec`, `msec` або `sec`. (Надав Джуліан Гінді в bpo-18983.)

Функція `timeit()` має новий параметр globals для визначення простору імен, у якому виконуватиметься код. (Надав Бен Робертс у bpo-2527.)

### tkinter

The `tkinter._fix` module used for setting up the Tcl/Tk environment on Windows has been replaced by a private function in the `_tkinter` module which makes no permanent changes to environment variables. (Contributed by Zachary Ware in bpo-20035.)

### простежити

New `walk_stack()` and `walk_tb()` functions to conveniently traverse frame and traceback objects. (Contributed by Robert Collins in bpo-17911.)

Нові спрощені класи: `TracebackException`, `StackSummary` і `FrameSummary`. (Надав Роберт Коллінз у bpo-17911.)

Функції `print_tb()` і `print_stack()` тепер підтримують від’ємні значення для аргументу limit. (Надав Дмитро Казаков у bpo-22619.)

### види

Нова функція `coroutine()` для перетворення об’єктів generator і `generator-like` в awaitables. (Надав Юрій Селіванов у bpo-24017.)

Новий тип під назвою `CoroutineType`, який використовується для об’єктів coroutine, створених функціями `async def`. (Надав Юрій Селіванов у bpo-24400.)

### unicodedata

The `unicodedata` module now uses data from Unicode 8.0.0.

### unittest

Метод `TestLoader.loadTestsFromModule()` тепер приймає аргумент pattern лише з ключовим словом, який передається в `load_tests` як третій аргумент. Знайдені пакунки тепер перевіряються на `load_tests` незалежно від того, чи відповідає їхній шлях шаблону, оскільки назва пакета не може відповідати шаблону за замовчуванням. (Надано Робертом Коллінзом і Баррі А. Варшавою в bpo-16662.)

Помилки виявлення Unittest тепер виявляються в атрибуті `TestLoader.errors` екземпляра `TestLoader`. (Надано Робертом Коллінзом у bpo-19746.)

Новий параметр командного рядка `--locals` для відображення локальних змінних у відстеженнях. (Надав Роберт Коллінз у bpo-22936.)

### unittest.mock

Клас `Mock` має наступні покращення:

- Конструктор класу має новий параметр unsafe, який змушує фіктивні об’єкти викликати помилку `AttributeError` для імен атрибутів, що починаються з `"assert"`. (Надав Кушал Дас у bpo-21238.)

- Новий метод `Mock.assert_not_ called()` для перевірки, чи був викликаний макетний об’єкт. (Надав Кушал Дас у bpo-21262.)

The `MagicMock` class now supports `__truediv__()`, `__divmod__()` and `__matmul__()` operators. (Contributed by Johannes Baiter in bpo-20968, and Håkan Lövdahl in bpo-23581 and bpo-23568.)

Більше не потрібно явно передавати `create=True` функції `patch()` під час виправлення вбудованих імен. (Надав Кушал Дас у bpo-17660.)

### urllib

Новий клас `request.HTTPPasswordMgrWithPriorAuth` дозволяє керувати обліковими даними базової автентифікації HTTP, щоб усунути непотрібну обробку відповіді `401` або безумовно надсилати облікові дані на перший запит для зв’язку з серверами, які повертають відповідь `404` замість `401`, якщо заголовок `Authorization` не надіслано. (Надано Матеєм Чеплем у bpo-19494 та Akshit Khurana у bpo-7159.)

Новий аргумент quote_via для функції `parse.urlencode()` забезпечує спосіб керування кодуванням частин запиту, якщо це необхідно. (Надано Samwyse та Arnon Yaari у bpo-13866.)

Функція `request.urlopen()` приймає об’єкт `ssl.SSLContext` як аргумент context, який використовуватиметься для з’єднання HTTPS. (Надав Алекс Гейнор у bpo-22366.)

`parse.urljoin()` було оновлено, щоб використовувати семантику RFC 3986 для розділення відносних URL-адрес замість RFC 1808 і RFC 2396. (Надано Деміаном Брехтом і Сентилом Кумараном у bpo-22118.)

### wsgiref

Аргумент headers конструктора класу `headers.Headers` тепер необов’язковий. (Надано Пабло Торресом Наваррете та SilentGhost у bpo-5800.)

### xmlrpc

Клас `client.ServerProxy` тепер підтримує протокол context manager. (Надав Клаудіу Попа в bpo-20627.)

Конструктор `client.ServerProxy` тепер приймає додатковий екземпляр `ssl.SSLContext`. (Надав Алекс Гейнор у bpo-22960.)

### xml.sax

Синтаксичні аналізатори SAX тепер підтримують потік символів об’єкта `xmlreader.InputSource`. (Надав Сергій Сторчака в bpo-2175.)

`parseString()` тепер приймає екземпляр `str`. (Надав Сергій Сторчака в bpo-10590.)

### zip-файл

Вихідний файл ZIP тепер можна записувати в потоки, які неможливо шукати. (Надав Сергій Сторчака в bpo-23252.)

Аргумент mode методу `ZipFile.open()` тепер приймає `"x"` для запиту ексклюзивного створення. (Надав Сергій Сторчака в bpo-21717.)

## Інші зміни на рівні модуля

Many functions in the `mmap`, `ossaudiodev`, `socket`, `ssl`, and `codecs` modules now accept writable bytes-like objects. (Contributed by Serhiy Storchaka in bpo-23001.)

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

Функцію `os.walk()` було прискорено в 3-5 разів на системах POSIX і в 7-20 разів на Windows. Це було зроблено за допомогою нової функції `os.scandir()`, яка відкриває інформацію про файл із базових системних викликів `readdir` або `FindFirstFile`/`FindNextFile`. (Надано Беном Хойтом за допомогою Віктора Стіннера в bpo-23605.)

Створення `bytes(int)` (заповненого нульовими байтами) відбувається швидше та використовує менше пам’яті для великих об’єктів. `calloc()` використовується замість `malloc()` для виділення пам’яті для цих об’єктів. (Надав Віктор Стіннер у bpo-21233.)

Деякі операції в `ipaddress` `IPv4Network` і `IPv6Network` були значно прискорені, наприклад `subnets()`, `supernet()`, `summarize_address_range()`, `collapse_addresses()`. Прискорення може бути від 3 до 15 разів. (Надано Антуаном Пітру, Мішелем Альбертом і Маркусом у bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

Видалення об’єктів `ipaddress` було оптимізовано для отримання значно менших результатів. (Надав Сергій Сторчака в bpo-23133.)

Багато операцій на `io.BytesIO` тепер на 50% до 100% швидше. (Надано Сергієм Сторчакою у bpo-15381 та Девідом Вілсоном у bpo-22003.)

Функція `marshal.dumps()` тепер працює швидше: 65–85% з версіями 3 і 4, 20–25% з версіями 0-2 на типових даних і до 5 разів у найкращих випадках. (Надав Сергій Сторчака в bpo-20416 і bpo-23344.)

Кодер UTF-32 тепер у 3-7 разів швидший. (Надав Сергій Сторчака в bpo-15027.)

Регулярні вирази тепер аналізуються на 10% швидше. (Надав Сергій Сторчака в bpo-19380.)

Функцію `json.dumps()` було оптимізовано для роботи з `ensure_ascii=False` так само швидко, як і з `ensure_ascii=True`. (Надав Наокі Інада в bpo-23206.)

Функції `PyObject_IsInstance()` і `PyObject_IsSubclass()` було пришвидшено у типовому випадку, коли другий аргумент має `type` як метаклас. (Надав Георг Брандл у bpo-22540.)

Кешування методів було дещо покращено, що дало підвищення продуктивності на 5% у деяких тестах. (Надав Антуан Пітру в bpo-22847.)

Об’єкти з модуля `random` тепер використовують на 50% менше пам’яті в 64-розрядних версіях. (Надав Сергій Сторчака в bpo-23488.)

Виклики методу отримання `property()` на 25% швидші. (Надав Джо Джевнік у bpo-23910.)

Створення екземпляра `fractions.Fraction` тепер на 30% швидше. (Надав Стефан Бенель у bpo-22464.)

Рядкові методи `find()`, `rfind()`, `split()`, `partition()` та рядок `in` тепер значно швидше для пошуку підрядків з 1 символу. (Надав Сергій Сторчака в bpo-23573.)

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

Додано нові функції callloc:

- `PyMem_RawCalloc()`,

- `PyMem_Calloc()`,

- `PyObject_Calloc()`.

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

Нові допоміжні функції кодування/декодування:

- `Py_DecodeLocale()` (замінено `_Py_char2wchar()`),

- `Py_EncodeLocale()` (замінено `_Py_wchar2char()`).

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

Нова функція `PyCodec_NameReplaceErrors()` замінює помилку кодування Unicode на `\N{...}`. (Надав Сергій Сторчака в bpo-19676.)

A new `PyErr_FormatV()` function similar to `PyErr_Format()`, but accepts a `va_list` argument. (Contributed by Antoine Pitrou in bpo-18711.)

Новий виняток `PyExc_RecursionError`. (Надав Георг Брандл у bpo-19235.)

Нові функції `PyModule_FromDefAndSpec()`, `PyModule_FromDefAndSpec2()` і `PyModule_ExecDef()`, представлені PEP 489 – багатофазова ініціалізація модуля розширення. (Надав Петро Вікторін у bpo-24268.)

Нові функції `PyNumber_MatrixMultiply()` і `PyNumber_InPlaceMatrixMultiply()` для виконання множення матриць. (Надано Бенджаміном Петерсоном у bpo-21176. Докладніше див. також PEP 465.)

Слот `PyTypeObject.tp_finalize` тепер є частиною стабільного ABI.

Windows builds now require Microsoft Visual C++ 14.0, which is available as part of Visual Studio 2015.

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

- У Linux імена файлів модулів розширення закінчуються на `.cpython- <major> <minor> m- <architecture> - <os> .pyd`:

  - `<major>` - головний номер версії Python; для Python 3.5 це `3`.

  - `<minor>` є другорядним номером версії Python; для Python 3.5 це `5`.

  - `<architecture>` - це апаратна архітектура, для роботи на якій створено модуль розширення. Найчастіше це `i386` для 32-розрядних платформ Intel або `x86_64` для 64-розрядних платформ Intel (і AMD).

  - `<os>` завжди `linux-gnu`, за винятком розширень, створених для спілкування з 32-розрядним ABI на 64-розрядних платформах, у цьому випадку це `linux-gnu32` (і `<architecture>` буде `x86_64`).

- У Windows назви файлів модулів розширення закінчуються на `<debug> .cp <major> <minor> - <platform> .pyd`:

  - `<major>` - головний номер версії Python; для Python 3.5 це `3`.

  - `<minor>` є другорядним номером версії Python; для Python 3.5 це `5`.

  - `<platform>` — це платформа, для якої створено модуль розширення, або `win32` для Win32, `win_amd64` для Win64, `win_ia64` для Windows Itanium 64 і `win_arm` для Windows на ARM.

  - Якщо створено в режимі налагодження, `<debug>` буде `_d`, інакше він буде порожнім.

- На платформах OS X імена файлів модулів розширення тепер закінчуються на `-darwin.so`.

- На всіх інших платформах імена файлів модулів розширення такі ж, як і в Python 3.4.

## Застаріле

### Нові ключові слова

`async` і `await` не рекомендується використовувати як імена змінних, класів, функцій або модулів. Представлені PEP 492 у Python 3.5, вони стануть правильними ключовими словами в Python 3.7.

### Застаріла поведінка Python

Викликання винятку `StopIteration` всередині генератора тепер генеруватиме мовчазне `PendingDeprecationWarning`, яке стане немовчазним попередженням про застаріння в Python 3.6 і викличе `RuntimeError` у Python 3.7. Перегляньте PEP 479: Змініть обробку StopIteration всередині генераторів для деталей.

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

Windows XP більше не підтримується корпорацією Майкрософт, тому, відповідно до PEP 11, CPython 3.5 більше не офіційно підтримується в цій ОС.

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

The `formatter` module has now graduated to full deprecation and is still slated for removal in Python 3.6.

The `asyncio.async()` function is deprecated in favor of `ensure_future()`.

The `smtpd` module has in the past always decoded the DATA portion of email messages using the `utf-8` codec. This can now be controlled by the new decode_data keyword to `SMTPServer`. The default value is `True`, but this default is deprecated. Specify the decode_data keyword with an appropriate value to avoid the deprecation warning.

Пряме призначення значень `key`, `value` і `coded_value` Об’єкти `http.cookies.Morsel` застаріли. Натомість використовуйте метод `set()`. Крім того, незадокументований параметр LegalChars `set()` застарів і тепер ігнорується.

Передача рядка формату як аргументу ключового слова format_string у метод `format()` класу `string.Formatter` застаріла. (Надав Сергій Сторчака в bpo-23671.)

The `platform.dist()` and `platform.linux_distribution()` functions are now deprecated. Linux distributions use too many different ways of describing themselves, so the functionality is left to a package. (Contributed by Vajrasky Kok and Berker Peksag in bpo-1322.)

Раніше недокументовані методи `from_function` і `from_builtin` `inspect.Signature` застаріли. Натомість використовуйте новий метод `Signature.from_callable()`. (Надав Юрій Селіванов у bpo-24248.)

Функція `inspect.getargspec()` є застарілою та планується її видалення в Python 3.6. (Докладніше див. bpo-20438.)

The `inspect` `getfullargspec()`, `getcallargs()`, and `formatargspec()` functions are deprecated in favor of the `inspect.signature()` API. (Contributed by Yury Selivanov in bpo-20438.)

Функції `getargvalues()` і `formatargvalues()` були ненавмисно позначені як застарілі з випуском Python 3.5.0.

Використання прапора `re.LOCALE` із шаблонами str або `re.ASCII` тепер застаріло. (Надав Сергій Сторчака в bpo-22407.)

Використання нерозпізнаних спеціальних послідовностей, що складаються з `'\'` і літери ASCII у шаблонах регулярних виразів і шаблонах заміни, тепер викликає попередження про застаріння та буде заборонено в Python 3.6. (Надав Сергій Сторчака в bpo-23622.)

Недокументований і неофіційний аргумент use_load_tests за замовчуванням методу `unittest.TestLoader.loadTestsFromModule()` тепер застарілий і ігнорується. (Надано Робертом Коллінзом і Баррі А. Варшавою в bpo-16662.)

## Видалено

### Видалення API та функцій

Наступні застарілі API та функції, які раніше не підтримувалися, видалено:

- Атрибут `__version__` видалено з пакета електронної пошти. Код електронної пошти не надсилався окремо від stdlib протягом тривалого часу, а рядок `__version__` не оновлювався в останніх кількох випусках.

- Внутрішній клас `Netrc` у модулі `ftplib` було визнано застарілим у версії 3.4 і тепер його видалено. (Надав Мет Чапут у bpo-6623.)

- Поняття файлів `.pyo` було видалено.

- Клас JoinableQueue у попередньому модулі `asyncio` був застарілим у версії 3.4.4 і тепер видалений. (Надав А. Джессі Джірю Девіс у bpo-23464.)

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

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

### Зміни в поведінці Python

- Через помилку попередні версії Python помилково приймали такий синтаксис:

      f(1 for x in [1], *args)
      f(1 for x in [1], **kwargs)

  Python 3.5 тепер правильно викликає `SyntaxError`, оскільки вирази генератора потрібно поміщати в дужки, якщо вони не є єдиним аргументом функції.

### Зміни в API Python

- PEP 475: Системні виклики тепер повторюються, коли їх перериває сигнал, замість того, щоб викликати `InterruptedError`, якщо обробник сигналів Python не викликає виключення.

- До Python 3.5 об’єкт `datetime.time` вважався хибним, якщо він представляв північ за UTC. Таку поведінку вважали незрозумілою та схильною до помилок, тому її було видалено в Python 3.5. Дивіться bpo-13936 для повної інформації.

- The `ssl.SSLSocket.send()` method now raises either `ssl.SSLWantReadError` or `ssl.SSLWantWriteError` on a non-blocking socket if the operation would block. Previously, it would return `0`. (Contributed by Nikolaus Rath in bpo-20951.)

- Атрибут `__name__` генераторів тепер встановлюється з імені функції, а не з кодового імені. Використовуйте `gen.gi_code.co_name`, щоб отримати кодову назву. Генератори також мають новий атрибут `__qualname__`, кваліфіковане ім’я, яке тепер використовується для представлення генератора (`repr(gen)`). (Надав Віктор Стіннер у bpo-21205.)

- The deprecated «strict» mode and argument of `HTMLParser`, `HTMLParser.error()`, and the `HTMLParserError` exception have been removed. (Contributed by Ezio Melotti in bpo-15114.) The convert_charrefs argument of `HTMLParser` is now `True` by default. (Contributed by Berker Peksag in bpo-21047.)

- Хоча це формально не є частиною API, варто зазначити, що для цілей перенесення (тобто: виправлення тестів) повідомлення про помилки, які раніше мали форму «„sometype“ не підтримує буферний протокол», тепер мають форму «a bytes-like object потрібен, а не „sometype“». (Надав Еціо Мелотті в bpo-16518.)

- Якщо поточний каталог встановлено на каталог, який більше не існує, тоді `FileNotFoundError` більше не буде викликано, а замість цього `find_spec()` поверне `None` без кешування `None` у `sys.path_importer_cache`, що відрізняється від типового випадку (bpo-22834).

- Код статусу HTTP та повідомлення від `http.client` і `http.server` були перетворені в загальний перелік `HTTPStatus`. Значення в `http.client` і `http.server` залишаються доступними для зворотної сумісності. (Надав Деміан Брехт у bpo-21793.)

- When an import loader defines `exec_module()` it is now expected to also define `create_module()` (raises a `DeprecationWarning` now, will be an error in Python 3.6). If the loader inherits from `importlib.abc.Loader` then there is nothing to do, else simply define `create_module()` to return `None`. (Contributed by Brett Cannon in bpo-23014.)

- Функція `re.split()` завжди ігнорувала збіги порожнього шаблону, тому шаблон `"x*"` працював так само, як `"x+"`, а шаблон `"\b"` ніколи не працював. Тепер `re.split()` викликає попередження, якщо шаблон може збігатися з порожнім рядком. Для сумісності використовуйте шаблони, які ніколи не відповідають порожньому рядку (наприклад, `"x+"` замість `"x*"`). Шаблони, які можуть відповідати лише порожньому рядку (наприклад, `"\b"`), тепер викликають помилку. (Надав Сергій Сторчака в bpo-22818.)

- Dict-подібний інтерфейс `http.cookies.Morsel` був узгоджений: порівняння шматків тепер використовує `key` і `value`, `copy()` тепер призводить до екземпляра `Morsel` замість `dict`, і `update()` тепер викличе виняток, якщо будь-який із ключів у словнику оновлення недійсний. Крім того, недокументований параметр LegalChars `set()` застарів і тепер ігнорується. (Надав Деміан Брехт у bpo-2211.)

- PEP 488 has removed `.pyo` files from Python and introduced the optional `opt-` tag in `.pyc` file names. The `importlib.util.cache_from_source()` has gained an optimization parameter to help control the `opt-` tag. Because of this, the debug_override parameter of the function is now deprecated. `.pyo` files are also no longer supported as a file argument to the Python interpreter and thus serve no purpose when distributed on their own (i.e. sourceless code distribution). Due to the fact that the magic number for bytecode has changed in Python 3.5, all old `.pyo` files from previous versions of Python are invalid regardless of this PEP.

- The `socket` module now exports the `CAN_RAW_FD_FRAMES` constant on linux 3.6 and greater.

- Функція `ssl.cert_time_to_seconds()` тепер інтерпретує введений час як UTC, а не як місцевий час відповідно до RFC 5280. Крім того, повертається значення завжди `int`. (Надав Акіра Лі в bpo-19940.)

- Інструмент `pygettext.py` тепер використовує стандартний формат +NNNN для часових поясів у заголовку POT-Creation-Date.

- The `smtplib` module now uses `sys.stderr` instead of the previous module-level `stderr` variable for debug output. If your (test) program depends on patching the module-level variable to capture the debug output, you will need to update it to capture sys.stderr instead.

- Методи `str.startswith()` і `str.endswith()` більше не повертають значення `True`, коли знаходять порожній рядок, а індекси повністю виходять за межі діапазону. (Надав Сергій Сторчака в bpo-24284.)

- Функція `inspect.getdoc()` тепер повертає рядки документації, успадковані від базових класів. Рядки документації більше не потрібно дублювати, якщо успадкована документація підходить. Щоб приховати успадкований рядок, необхідно вказати порожній рядок (або можна заповнити документацію). Ця зміна впливає на вихідні дані модуля `pydoc` і функції `help()`. (Надав Сергій Сторчака в bpo-15582.)

- Вкладені виклики `functools.partial()` тепер зведені. Якщо ви покладалися на попередню поведінку, тепер ви можете додати атрибут до об’єкта `functools.partial()` або створити підклас `functools.partial()`. (Надав Олександр Бєлопольський у bpo-7830.)

### Зміни в C API

- The undocumented `format` member of the (non-public) `PyMemoryViewObject` structure has been removed. All extensions relying on the relevant parts in `memoryobject.h` must be rebuilt.

- The `PyMemAllocator` structure was renamed to `PyMemAllocatorEx` and a new `calloc` field was added.

- Removed non-documented macro `PyObject_REPR()` which leaked references. Use format character `%R` in `PyUnicode_FromFormat()`-like functions to format the `repr()` of the object. (Contributed by Serhiy Storchaka in bpo-22453.)

- Because the lack of the `__module__` attribute breaks pickling and introspection, a deprecation warning is now raised for builtin types without the `__module__` attribute. This will be an `AttributeError` in the future. (Contributed by Serhiy Storchaka in bpo-20204.)

- As part of the PEP 492 implementation, the `tp_reserved` slot of `PyTypeObject` was replaced with a `tp_as_async` slot. Refer to Об’єкти співпрограми for new types, structures and functions.

## Помітні зміни в Python 3.5.4

### Нова ціль збірки `make regen-all`

Щоб спростити крос-компіляцію та гарантувати, що CPython можна надійно скомпілювати без наявності наявної версії Python, система збирання на основі autotools більше не намагається неявно перекомпілювати згенеровані файли на основі часу модифікації файлу.

Натомість додано нову команду `make regen-all`, щоб примусово повторно генерувати ці файли за бажанням (наприклад, після того, як початкова версія Python вже була створена на основі попередньо згенерованих версій).

Також визначено більш вибіркові цілі регенерації - подробиці див. Makefile.pre.in.

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

Added in version 3.5.4.

### Видалення цілі збірки `make touch`

Ціль збірки `make touch`, яка раніше використовувалася для запиту неявної регенерації згенерованих файлів шляхом оновлення часу їх модифікації, видалено.

Його було замінено новою метою `make regen-all`.

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

Змінено в версії 3.5.4.