# Що нового в Python 3.7

редактор:

  Elvis Pranskevichus <elvis@magic.io>

У цій статті пояснюється нові функції в Python 3.7 порівняно з 3.6. Python 3.7 було випущено 27 червня 2018 року. Щоб отримати повну інформацію, перегляньте журнал змін.

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

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

- PEP 563, відкладена оцінка анотацій типу.

Зворотно несумісні зміни синтаксису:

- `async` і `await` тепер є зарезервованими ключовими словами.

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

- `contextvars`: PEP 567 – Змінні контексту

- `dataclasses`: PEP 557 – Класи даних

- importlib.resources

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

- PEP 553, нова функція `breakpoint()`.

Покращення моделі даних Python:

- PEP 562, налаштування доступу до атрибутів модуля.

- PEP 560, основна підтримка модуля введення тексту та загальних типів.

- природа збереження порядку вставки dict об’єктів була оголошена (has been declared) офіційною частиною специфікації мови Python.

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

- Модуль `asyncio` отримав нові функції, значні зручність використання та покращення продуктивності.

- Модуль `time` отримав підтримку функцій з наносекундною роздільною здатністю.

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

- Уникнення використання ASCII як стандартного кодування тексту:

  - PEP 538, застаріла локалізація C

  - PEP 540, примусовий режим виконання UTF-8

- PEP 552, детермінований .pycs

- Новий режим розробки Python

- PEP 565, покращено обробку `DeprecationWarning`

Покращення C API:

- PEP 539, новий C API для потокового локального зберігання

Покращення документації:

- PEP 545, переклади документації Python

- Нові переклади документації: Японський, Французький, Корейський.

Цей випуск містить помітні покращення продуктивності в багатьох сферах. Розділ Оптимізації містить їх детальний перелік.

Перелік змін, які можуть вплинути на сумісність із попередніми випусками Python, див. у розділі Перенесення на Python 3.7.

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

### PEP 563: Відкладена оцінка анотацій

Поява підказок типу в Python виявила дві кричущі проблеми зручності використання функціональних можливостей анотацій, доданих у PEP 3107 і вдосконалених у PEP 526:

- анотації могли використовувати лише імена, які вже були доступні в поточному діапазоні, іншими словами, вони не підтримували жодних прямих посилань; і

- анотування вихідного коду мало негативний вплив на час запуску програм Python.

Обидві ці проблеми вирішуються шляхом відкладення оцінки анотацій. Замість компіляції коду, який виконує вирази в анотаціях під час їх визначення, компілятор зберігає анотацію у формі рядка, еквівалентну AST відповідного виразу. За потреби анотації можна розв’язати під час виконання за допомогою `typing.get_type_hints()`. У звичайному випадку, коли це не потрібно, анотації дешевше зберігати (оскільки короткі рядки інтернуються інтерпретатором) і пришвидшують час запуску.

З точки зору зручності використання анотації тепер підтримують прямі посилання, що робить наступний синтаксис дійсним:

    class C:
        @classmethod
        def from_string(cls, source: str) -> C:
            ...

        def validate_b(self, obj: B) -> bool:
            ...

    class B:
        ...

Оскільки ця зміна порушує сумісність, нову поведінку потрібно ввімкнути на основі кожного модуля в Python 3.7 за допомогою `__future__` import:

    from __future__ import annotations

Він стане типовим у Python 3.10.

Дивись також

PEP 563 – Відкладена оцінка анотацій

  PEP написав і реалізував Лукаш Ланга.

### PEP 538: Застаріле C Локальний примус

Постійним завданням у серії Python 3 було визначення розумної стратегії за замовчуванням для обробки припущення про кодування тексту «7-bit ASCII», яке зараз передбачається використанням стандартної локалі C або POSIX на платформах, відмінних від Windows.

PEP 538 оновлює інтерфейс командного рядка інтерпретатора за замовчуванням для автоматичного приведення цієї локалі до доступної локалі на основі UTF-8, як описано в документації нової змінної середовища `PYTHONCOERCECLOCALE`. Автоматичне встановлення `LC_CTYPE` таким чином означає, що як основний інтерпретатор, так і розширення C з урахуванням локалі (такі як `readline`) передбачатимуть використання UTF-8 як стандартне кодування тексту, а не ASCII.

Визначення підтримки платформи в PEP 11 також було оновлено, щоб обмежити підтримку обробки повного тексту належним чином налаштованими локалями, що не базуються на ASCII.

У рамках цієї зміни типовим обробником помилок для `stdin` і `stdout` тепер є `surrogateescape` (а не `strict`) під час використання будь-якого з визначені цільові локалі примусу (наразі `C.UTF-8`, `C.utf8` і `UTF-8`). Обробником помилок за замовчуванням для `stderr` залишається `backslashreplace`, незалежно від локалі.

За замовчуванням примусове налаштування локалі мовчить, але для допомоги в налагодженні потенційно пов’язаних з локалізацією проблем інтеграції можна запитати явні попередження (видані безпосередньо на `stderr`), встановивши `PYTHONCOERCECLOCALE=warn`. Цей параметр також призведе до того, що середовище виконання Python видасть попередження, якщо застаріла локаль C залишається активною під час ініціалізації основного інтерпретатора.

У той час як примусове налаштування локалі PEP 538 має перевагу, оскільки також впливає на модулі розширення (такі як GNU `readline`), а також на дочірні процеси (включно з тими, які запускають програми, відмінні від Python, і старіші версії Python), недоліком цього є те, що в запущеній системі потрібна відповідна цільова локаль. Для кращої обробки випадків, коли немає відповідної цільової локалі (як це відбувається, наприклад, у RHEL/CentOS 7), Python 3.7 також реалізує PEP 540: примусовий режим виконання UTF-8.

Дивись також

PEP 538 – Приведення застарілої локалі C до локалі на основі UTF-8

  PEP написав і реалізував Нік Коглан.

### PEP 540: примусовий режим виконання UTF-8

Новий параметр командного рядка `-X` `utf8` і змінну середовища `PYTHONUTF8` можна використовувати для ввімкнення режиму Python UTF-8.

У режимі UTF-8 CPython ігнорує налаштування мови та використовує кодування UTF-8 за замовчуванням. Обробники помилок для потоків `sys.stdin` і `sys.stdout` мають значення `surrogateescape`.

Примусовий режим UTF-8 можна використовувати для зміни поведінки обробки тексту у вбудованому інтерпретаторі Python без зміни налаштувань мови програми для вбудовування.

Хоча режим UTF-8 PEP 540 має перевагу в тому, що працює незалежно від того, які локалі доступні у запущеній системі, він має недолік — не впливає на модулі розширення (такі як GNU `readline`). , дочірні процеси, які запускають програми, відмінні від Python, і дочірні процеси, які запускають старіші версії Python. Щоб зменшити ризик пошкодження текстових даних під час обміну даними з такими компонентами, Python 3.7 також реалізує PEP 540: примусовий режим виконання UTF-8).

Режим UTF-8 увімкнуто за замовчуванням, якщо локаль `C` або `POSIX`, а функція примусового налаштування локалі PEP 538 не може змінити його на альтернативу на основі UTF-8 (чи це помилка спричинена встановленням `PYTHONCOERCECLOCALE=0`, `LC_ALL` або відсутністю відповідної цільової локалі).

Дивись також

PEP 540 – Додати новий режим UTF-8

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

### PEP 553: вбудована `breakpoint()`

Python 3.7 містить нову вбудовану функцію `breakpoint()` як простий і послідовний спосіб входу в налагоджувач Python.

Вбудований `breakpoint()` викликає `sys.breakpointhook()`. За замовчуванням останній імпортує `pdb`, а потім викликає `pdb.set_trace()`, але шляхом прив’язки `sys.breakpointhook()` до функції за вашим вибором, `breakpoint()` може ввести будь-який налагоджувач. Крім того, змінну середовища `PYTHONBREAKPOINT` можна встановити як виклик вашого вибраного налагоджувача. Встановіть `PYTHONBREAKPOINT=0`, щоб повністю вимкнути вбудовану `breakpoint()`.

Дивись також

PEP 553 – Вбудована точка зупину()

  PEP написаний і реалізований Баррі Варшавою

### PEP 539: новий C API для потокового локального зберігання

While Python provides a C API for thread-local storage support; the existing Thread Local Storage (TLS) API has used int to represent TLS keys across all platforms. This has not generally been a problem for officially support platforms, but that is neither POSIX-compliant, nor portable in any practical sense.

PEP 539 changes this by providing a new Thread Specific Storage (TSS) API to CPython which supersedes use of the existing TLS API within the CPython interpreter, while deprecating the existing API. The TSS API uses a new type `Py_tss_t` instead of int to represent TSS keys–an opaque type the definition of which may depend on the underlying TLS implementation. Therefore, this will allow to build CPython on platforms where the native TLS key is defined in a way that cannot be safely cast to int.

Note that on platforms where the native TLS key is defined in a way that cannot be safely cast to int, all functions of the existing TLS API will be no-op and immediately return failure. This indicates clearly that the old API is not supported on platforms where it cannot be used reliably, and that no effort will be made to add such support.

Дивись також

PEP 539 – Новий C-API для локального зберігання потоків у CPython

  PEP, автор Ерік М. Брей; виконання Масаюкі Ямамото.

### PEP 562: Налаштування доступу до атрибутів модуля

Python 3.7 дозволяє визначати `__getattr__()` для модулів і викликає його щоразу, коли атрибут модуля іншим чином не знайдено. Тепер також дозволено визначення `__dir__()` для модулів.

Типовим прикладом того, де це може бути корисним, є припинення використання атрибутів модуля та відкладене завантаження.

Дивись також

PEP 562 – Модуль `__getattr__` і `__dir__`

  PEP написав і реалізував Іван Левківський

### PEP 564: Нові функції часу з наносекундною роздільною здатністю

The resolution of clocks in modern systems can exceed the limited precision of a floating point number returned by the `time.time()` function and its variants. To avoid loss of precision, PEP 564 adds six new «nanosecond» variants of the existing timer functions to the `time` module:

- `time.clock_gettime_ns()`

- `time.clock_settime_ns()`

- `time.monotonic_ns()`

- `time.perf_counter_ns()`

- `time.process_time_ns()`

- `time.time_ns()`

Нові функції повертають кількість наносекунд як ціле число.

Measurements show that on Linux and Windows the resolution of `time.time_ns()` is approximately 3 times better than that of `time.time()`.

Дивись також

PEP 564 – Додайте нові функції часу з роздільною здатністю наносекунд

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

### PEP 565: Показати DeprecationWarning у `__main__`

Стандартну обробку `DeprecationWarning` було змінено таким чином, що ці попередження знову відображаються за замовчуванням, але лише тоді, коли код, який їх ініціює, виконується безпосередньо в модулі `__main__`. Як наслідок, розробники однофайлових сценаріїв і ті, хто використовує Python в інтерактивному режимі, повинні знову почати бачити попередження про застаріння для API, які вони використовують, але попередження про застаріння, викликані імпортованими програмними, бібліотечними та фреймворковими модулями, будуть і надалі приховані за замовчуванням.

У результаті цієї зміни стандартна бібліотека тепер дозволяє розробникам вибирати між трьома різними способами попередження про застарілу дію:

- `FutureWarning`: завжди відображається за умовчанням, рекомендовано для попереджень, призначених для перегляду кінцевими користувачами програми (наприклад, для застарілих налаштувань конфігурації програми).

- `DeprecationWarning`: відображається за замовчуванням лише в `__main__` і під час виконання тестів, рекомендовано для попереджень, призначених для перегляду іншими розробниками Python, коли оновлення версії може призвести до зміни поведінки або помилки.

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

Раніше і `DeprecationWarning`, і `PendingDeprecationWarning` були видимі лише під час виконання тестів, що означало, що розробники, які переважно пишуть однофайлові сценарії або використовують Python в інтерактивному режимі, можуть бути здивовані несправними змінами в API, які вони використовували.

Дивись також

PEP 565 – Показати DeprecationWarning у `__main__`

  PEP написав і реалізував Нік Коглан

### PEP 560: Основна підтримка модуля `введення` і загальних типів

Спочатку PEP 484 було розроблено таким чином, щоб не вносити жодних змін до основного інтерпретатора CPython. Тепер підказки щодо типів і модуль `typing` широко використовуються спільнотою, тому це обмеження знято. PEP представляє два спеціальні методи `__class_getitem__()` і `__mro_entries__`, ці методи тепер використовуються більшістю класів і спеціальних конструкцій у `typing`. В результаті швидкість різних операцій з типами зросла до 7 разів, загальні типи можна використовувати без конфліктів метакласів, а також виправлено кілька давніх помилок в модулі `typing`.

Дивись також

PEP 560 – Основна підтримка модуля введення тексту та загальних типів

  PEP написав і реалізував Іван Левківський

### PEP 552: Файли .pyc на основі хешу

Python традиційно перевіряє актуальність файлів кешу байт-кодів (тобто файлів `.pyc`), порівнюючи метадані джерела (мітку часу та розмір останньої зміни) із метаданими джерела, збереженими в заголовку файлу кешу, коли він був створений. Хоча цей метод визнання недійсним ефективний, він має свої недоліки. Якщо мітки часу файлової системи занадто грубі, Python може пропустити вихідні оновлення, що призведе до плутанини користувачів. Крім того, наявність мітки часу у файлі кешу є проблематичною для відтворюваності збірки і систем збірки на основі вмісту.

PEP 552 розширює формат pyc, дозволяючи використовувати хеш вихідного файлу для визнання недійсним замість мітки часу джерела. Такі файли `.pyc` називаються «на основі хешу». За замовчуванням Python усе ще використовує недійсність на основі мітки часу та не створює файли `.pyc` на основі хешу під час виконання. Файли `.pyc` на основі хешу можуть бути згенеровані за допомогою `py_compile` або `compileall`.

Файли `.pyc` на основі хешу бувають двох варіантів: позначені та не позначені. Python перевіряє перевірені хеш-файли `.pyc` на відповідність вихідним файлам під час виконання, але не робить цього для неперевірених хеш-файлів pycs. Файли `.pyc` на основі неперевірених хешів є корисною оптимізацією продуктивності для середовищ, де зовнішня по відношенню до Python система (наприклад, система збірки) відповідає за підтримку файлів `.pyc` в актуальному стані.

Перегляньте Анулювання кешованого байт-коду для отримання додаткової інформації.

Дивись також

PEP 552 – Детерміновані зображення

  PEP написав і реалізував Бенджамін Петерсон

### PEP 545: Переклади документації Python

PEP 545 описує процес створення та підтримки перекладів документації Python.

Додано три нові переклади:

- Японська: https://docs.python.org/ja/

- Французька: https://docs.python.org/fr/

- Корейська: https://docs.python.org/ko/

Дивись також

PEP 545 – Переклади документації Python

  PEP написаний і реалізований Жульєном Палардом, Інадою Наокі та Віктором Стіннером.

### Режим розробки Python (-X dev)

Новий параметр командного рядка `-X` `dev` або нову змінну середовища `PYTHONDEVMODE` можна використовувати, щоб увімкнути Режим розробки Python. У режимі розробки Python виконує додаткові перевірки під час виконання, які занадто дорогі, щоб їх можна було ввімкнути за замовчуванням. Дивіться документацію Python Development Mode для повного опису.

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

- Вираз `await` і розуміння, що містять пункт `async for`, були незаконними у виразах у форматованих рядкових літералах через проблему з реалізацією. У Python 3.7 це обмеження було знято.

- Функції тепер можна передати більше 255 аргументів, а функція тепер може мати більше 255 параметрів. (Надав Сергій Сторчака в bpo-12844 і bpo-18896.)

- `bytes.fromhex()` і `bytearray.fromhex()` тепер ігнорують усі пробіли ASCII, а не лише пробіли. (Надав Роберт Сяо в bpo-28927.)

- `str`, `bytes` і `bytearray` отримали підтримку нового методу `isascii()`, який можна використовувати для перевірки того, чи рядок або байти містять лише символи ASCII. (Надано INADA Naoki в bpo-32677.)

- `ImportError` тепер відображає назву модуля та шлях до модуля `__file__`, коли `from ... import ...` не вдається. (Надав Матіас Бюссонньє в bpo-29546.)

- Тепер підтримується циклічний імпорт, що включає абсолютний імпорт із прив’язкою підмодуля до імені. (Надав Сергій Сторчака в bpo-30024.)

- `object.__format__(x, '')` тепер еквівалентний `str(x)`, а не `format(str(self), '')`. (Надав Сергій Сторчака в bpo-28974.)

- In order to better support dynamic creation of stack traces, `types.TracebackType` can now be instantiated from Python code, and the `tb_next` attribute on tracebacks is now writable. (Contributed by Nathaniel J. Smith in bpo-30579.)

- Якщо використовується перемикач `-m`, `sys.path[0]` тепер швидко розгортається до повного початкового шляху каталогу, а не залишається порожнім каталогом (що дозволяє імпортувати з поточного робочий каталог під час імпорту) (Надано Ніком Когланом у bpo-33053.)

- Новий параметр `-X` `importtime` або змінну середовища `PYTHONPROFILEIMPORTTIME` можна використовувати для відображення часу імпорту кожного модуля. (Надано Інадою Наокі в bpo-31415.)

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

### контекстні змінні

Новий модуль `contextvars` і набір нових API C запроваджують підтримку контекстних змінних. Змінні контексту концептуально подібні до локальних змінних потоку. На відміну від TLS, контекстні змінні правильно підтримують асинхронний код.

Модулі `asyncio` і `decimal` оновлено для використання та підтримки контекстних змінних із коробки. Зокрема, активний десятковий контекст тепер зберігається в контекстній змінній, що дозволяє десятковим операціям працювати з правильним контекстом в асинхронному коді.

Дивись також

PEP 567 – Контекстні змінні

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

### класи даних

Новий декоратор `dataclass()` забезпечує спосіб оголошення класів даних. Клас даних описує свої атрибути за допомогою анотацій змінних класу. Його конструктор та інші чарівні методи, такі як `__repr__()`, `__eq__()` і `__hash__()` генеруються автоматично.

Приклад:

    @dataclass
    class Point:
        x: float
        y: float
        z: float = 0.0

    p = Point(1.5, 2.5)
    print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

Дивись також

PEP 557 – Класи даних

  PEP написаний і реалізований Еріком В. Смітом

### importlib.resources

The new `importlib.resources` module provides several new APIs and one new ABC for access to, opening, and reading resources inside packages. Resources are roughly similar to files inside packages, but they needn’t be actual files on the physical file system. Module loaders can provide a `get_resource_reader()` function which returns a `importlib.abc.ResourceReader` instance to support this new API. Built-in file path loaders and zip file loaders both support this.

Надано Баррі Варшау та Бреттом Кенноном у bpo-32248.

Дивись також

importlib_resources – a PyPI backport for earlier Python versions.

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

### argparse

Новий метод `ArgumentParser.parse_intermixed_args()` дозволяє змішувати параметри та позиційні аргументи. (Надано paul.j3 у bpo-14191.)

### asyncio

Модуль `asyncio` отримав багато нових функцій, зручність використання та покращення продуктивності. Помітні зміни включають:

- Нову функцію provisional `asyncio.run()` можна використовувати для запуску співпрограми з синхронного коду шляхом автоматичного створення та знищення циклу подій. (Надав Юрій Селіванов у bpo-32314.)

- asyncio отримав підтримку для `contextvars`. `loop.call_soon()`, `loop.call_soon_threadsafe()`, `loop.call_later()`, `loop.call_at()`, and `Future.add_done_callback()` має новий необов’язковий параметр context. `Tasks` тепер автоматично відстежують свій контекст. Дивіться PEP 567 для більш детальної інформації. (Надав Юрій Селіванов у bpo-32436.)

- Нову функцію `asyncio.create_task()` додано як ярлик до `asyncio.get_event_loop().create_task()`. (Надав Ендрю Свєтлов у bpo-32311.)

- Новий метод `loop.start_tls()` можна використовувати для оновлення наявного підключення до TLS. (Надав Юрій Селіванов у bpo-23749.)

- Новий метод `loop.sock_recv_into()` дозволяє зчитувати дані з сокета безпосередньо в наданий буфер, що дозволяє зменшити кількість копій даних. (Надав Антуан Пітру в bpo-31819.)

- The new `asyncio.current_task()` function returns the currently running `Task` instance, and the new `asyncio.all_tasks()` function returns a set of all existing `Task` instances in a given loop. The `Task.current_task()` and `Task.all_tasks()` methods have been deprecated. (Contributed by Andrew Svetlov in bpo-32250.)

- Новий тимчасовий клас `BufferedProtocol` дозволяє реалізувати потокові протоколи з ручним керуванням буфером отримання. (Надав Юрій Селіванов у bpo-32251.)

- Нова функція `asyncio.get_running_loop()` повертає поточний запущений цикл і викликає `RuntimeError`, якщо жоден цикл не запущено. Це відрізняється від `asyncio.get_event_loop()`, який створить новий цикл подій, якщо жодна з них не запущена. (Надав Юрій Селіванов у bpo-32269.)

- Новий метод співпрограми `StreamWriter.wait_closed()` дозволяє чекати, доки закриється записувач потоку. Новий метод `StreamWriter.is_closing()` можна використовувати, щоб визначити, чи закривається записувач. (Надав Ендрю Свєтлов у bpo-32391.)

- Новий метод `loop.sock_sendfile()` дозволяє надсилати файли за допомогою `os.sendfile`, коли це можливо. (Надав Ендрю Свєтлов у bpo-32410.)

- Нові методи `Future.get_loop()` і `Task.get_loop()` повертають екземпляр циклу, у якому було створено завдання або майбутнє. `Server.get_loop()` дозволяє робити те саме для об’єктів `asyncio.Server`. (Надав Юрій Селіванов у bpo-32415 та Шрінівас Редді Татіпарті у bpo-32418.)

- Тепер можна контролювати, як екземпляри `asyncio.Server` починають обслуговувати. Раніше сервер починав обслуговувати одразу після створення. Новий аргумент ключового слова start_serving для `loop.create_server()` і `loop.create_unix_server()`, а також `Server.start_serving()`, і `Server.serve_forever()` можна використовувати, щоб роз’єднати інстанціювання сервера та обслуговування. Новий метод `Server.is_serving()` повертає `True`, якщо сервер обслуговує. `Server` об’єкти тепер є асинхронними контекстними менеджерами:

      srv = await loop.create_server(...)

      async with srv:
          # some code

      # At this point, srv is closed and no longer accepts new connections.

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

- Об’єкти зворотного виклику, повернуті `loop.call_later()`, отримали новий метод `when()`, який повертає абсолютну позначку часу зворотного виклику за розкладом. (Надав Ендрю Свєтлов у bpo-32741.)

- Метод `loop.create_datagram_endpoint()` отримав підтримку сокетів Unix. (Надав Квентін Даванс у bpo-31245.)

- Функції `asyncio.open_connection()`, `asyncio.start_server()`, `loop.create_connection()`, `loop.create_server()`, `loop. create_accepted_socket()` методи та їхні відповідні варіанти сокетів UNIX тепер приймають аргумент ключового слова ssl_handshake_timeout. (Надав Ніл Аспінолл у bpo-29970.)

- Новий метод `Handle.cancelled()` повертає `True`, якщо зворотний виклик було скасовано. (Надав Марат Шарафутдінов у bpo-31943.)

- Джерело asyncio було перетворено на використання синтаксису `async`/`await`. (Надав Ендрю Свєтлов у bpo-32193.)

- Новий метод `ReadTransport.is_reading()` можна використовувати для визначення стану читання транспорту. Крім того, виклики `ReadTransport.resume_reading()` і `ReadTransport.pause_reading()` тепер ідемпотентні. (Надав Юрій Селіванов у bpo-32356.)

- Методи циклу, які приймають шляхи до сокетів, тепер підтримують передачу path-подібних об’єктів. (Надав Юрій Селіванов у bpo-32066.)

- У `asyncio` TCP-сокети в Linux тепер створюються з прапорцем `TCP_NODELAY`, установленим за замовчуванням. (Надано Юрієм Селівановим і Віктором Стіннером у bpo-27456.)

- Винятки, що виникають у скасованих завданнях, більше не реєструються. (Надав Юрій Селіванов у bpo-30508.)

- Нові класи `WindowsSelectorEventLoopPolicy` і `WindowsProactorEventLoopPolicy`. (Надав Юрій Селіванов у bpo-33792.)

Кілька `asyncio` API були застарілими.

### binascii

Функція `b2a_uu()` тепер приймає додатковий аргумент ключового слова backtick. Коли це істина, нулі представлені `'`'` замість пробілів. (Надав Xiang Zhang у bpo-30103.)

### календар

Клас `HTMLCalendar` має нові атрибути класу, які спрощують налаштування класів CSS у створеному HTML-календарі. (Надав Оз Тірам у bpo-30095.)

### колекції

`collections.namedtuple()` тепер підтримує значення за замовчуванням. (Надав Реймонд Геттінгер у bpo-32320.)

### compileall

`compileall.compile_dir()` отримав новий параметр invalidation_mode, який можна використовувати для ввімкнення анулювання .pyc на основі хешу. Режим недійсності також можна вказати в командному рядку за допомогою нового аргументу `--invalidation-mode`. (Надав Бенджамін Петерсон у bpo-31650.)

### concurrent.futures

`ProcessPoolExecutor` і `ThreadPoolExecutor` тепер підтримують нові аргументи конструктора initializer і initargs. (Надав Антуан Пітру в bpo-21423.)

`ProcessPoolExecutor` тепер може приймати багатопроцесорний контекст за допомогою нового аргументу mp_context. (Надав Томас Моро в bpo-31540.)

### contextlib

Новий `nullcontext()` є простішим і швидшим безопераційним менеджером контексту, ніж `ExitStack`. (Надано Jesse-Bakker у bpo-10049.)

Нові `asynccontextmanager()`, `AbstractAsyncContextManager` і `AsyncExitStack` додано, щоб доповнити їх синхронні аналоги. (Надано Джелле Зійлстра в bpo-29679 і bpo-30241, а також Олександром Мором та Іллею Кулаковим у bpo-29302.)

### cProfile

Командний рядок `cProfile` тепер приймає `-m module_name` як альтернативу шляху сценарію. (Надано Sanyam Khurana в bpo-21862.)

### склеп

The `crypt` module now supports the Blowfish hashing method. (Contributed by Serhiy Storchaka in bpo-31664.)

The `mksalt()` function now allows specifying the number of rounds for hashing. (Contributed by Serhiy Storchaka in bpo-31702.)

### дата, час

Новий метод `datetime.fromisoformat()` створює об’єкт `datetime` із рядка в одному з форматів, виведених `datetime.isoformat()`. (Надав Пол Ганссле в bpo-15873.)

Клас `tzinfo` тепер підтримує субхвилинні зсуви. (Надав Олександр Бєлопольський у bpo-5288.)

### dbm

`dbm.dumb` тепер підтримує читання файлів лише для читання та більше не записує файл індексу, якщо він не змінений.

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

Модуль `decimal` тепер використовує контекстні змінні для зберігання десяткового контексту. (Надав Юрій Селіванов у bpo-32630.)

### дис

Функція `dis()` тепер може розбирати об’єкти вкладеного коду (код розуміння, вирази генератора та вкладені функції, а також код, який використовується для створення вкладених класів). Максимальна глибина рекурсії розбирання контролюється новим параметром depth. (Надав Сергій Сторчака в bpo-11822.)

### distutils

`README.rst` тепер включено до списку стандартних файлів README Distutils і, отже, включено до вихідних дистрибутивів. (Надав Райан Гонзалес у bpo-11913.)

### перелік

`Enum` отримав нову властивість класу `_ignore_`, яка дозволяє перераховувати назви властивостей, які не повинні стати членами переліку. (Надав Ітан Фурман у bpo-31801.)

У Python 3.8 спроба перевірити об’єкти, відмінні від Enum, у класах `Enum` викличе `TypeError` (наприклад, `1 in Color`); аналогічно спроба перевірити об’єкти без прапорців у члені `Flag` викличе `TypeError` (наприклад, `1 in Perm.RW`); наразі обидві операції замість цього повертають `False` і є застарілими. (Надав Ітан Фурман у bpo-33217.)

### functools

`functools.singledispatch()` тепер підтримує реєстрацію реалізацій за допомогою анотацій типів. (Надав Łukasz Langa в bpo-32227.)

### gc

Нова функція `gc.freeze()` дозволяє заморозити всі об’єкти, які відстежує збирач сміття, і виключити їх із майбутніх колекцій. Це можна використовувати перед викликом POSIX `fork()`, щоб зробити GC зручним для копіювання під час запису або прискорити збір. Нові функції `gc.unfreeze()` скасовують цю операцію. Крім того, `gc.get_freeze_count()` можна використовувати для отримання кількості заморожених об’єктів. (Надав Лі Зекун у bpo-31558.)

### hmac

Модуль `hmac` тепер має оптимізовану одноразову функцію `digest()`, яка втричі швидша, ніж `HMAC()`. (Надав Крістіан Хеймс у bpo-32433.)

### http.client

`HTTPConnection` і `HTTPSConnection` тепер підтримують новий аргумент blocksize для покращення пропускної здатності завантаження. (Надав Нір Соффер у bpo-31945.)

### http.сервер

`SimpleHTTPRequestHandler` тепер підтримує заголовок HTTP `If-Modified-Since`. Сервер повертає статус відповіді 304, якщо цільовий файл не було змінено після часу, зазначеного в заголовку. (Надано П’єром Квентелем у bpo-29654.)

`SimpleHTTPRequestHandler` приймає новий аргумент directory на додаток до нового аргументу командного рядка `--directory`. З цим параметром сервер обслуговує вказаний каталог, за замовчуванням він використовує поточний робочий каталог. (Надано Стефаном Віртелем і Жюльєном Палардом у bpo-28707.)

Новий клас `ThreadingHTTPServer` використовує потоки для обробки запитів за допомогою `ThreadingMixin`. Він використовується, коли `http.server` запускається з `-m`. (Надав Жюльєн Палард у bpo-31639.)

### idlelib і IDLE

Кілька виправлень для автозавершення. (Надав Луї Лу в bpo-15786.)

Браузер модулів (у меню «Файл», раніше називався «Браузер класів») тепер відображає вкладені функції та класи на додаток до функцій і класів верхнього рівня. (Надано Гільєрме Поло, Шеріл Сабелла та Террі Ян Ріді в bpo-1612262.)

Діалогове вікно налаштувань (параметри, налаштування IDLE) було частково переписано, щоб покращити зовнішній вигляд і функції. (Надано Шеріл Сабеллою та Террі Джен Ріді в кількох випусках.)

Зразок шрифту тепер містить вибірку нелатинських символів, щоб користувачі могли краще побачити ефект від вибору певного шрифту. (Надав Террі Ян Ріді в bpo-13802.) Зразок можна редагувати, щоб включити інші символи. (Надав Сергій Сторчака в bpo-31860.)

Функції IDLE, раніше реалізовані як розширення, були повторно реалізовані як звичайні функції. Їх налаштування переміщено з вкладки «Розширення» на інші вкладки діалогу. (Надано Чарльзом Волгангером і Террі Джаном Ріді в bpo-27099.)

Опцію контексту коду редактора переглянуто. Box відображає всі контекстні рядки до maxlines. Клацання на рядку контексту переводить редактор до цього рядка. Кольори контексту для спеціальних тем додано на вкладку «Висвітлення» діалогового вікна «Параметри». (Надано Шеріл Сабелла та Террі Ян Ріді в bpo-33642, bpo-33768 та bpo-33679.)

У Windows новий виклик API повідомляє Windows, що tk масштабується для DPI. У Windows 8.1+ або 10 із незмінними властивостями сумісності DPI двійкового коду Python і роздільною здатністю монітора понад 96 DPI текст і лінії мають бути чіткішими. В іншому випадку це не повинно мати ефекту. (Надав Террі Ян Ріді в bpo-33656.)

Нове в 3.7.1:

Виведення в N рядків (50 за замовчуванням) стиснуто до кнопки. N можна змінити в розділі PyShell на сторінці «Загальні» діалогового вікна «Параметри». Менше, але, можливо, дуже довгих рядків можна стиснути, клацнувши правою кнопкою миші на виведенні. Стиснутий вихід можна розгорнути на місці, подвійним клацанням кнопки або в буфер обміну чи окреме вікно, клацнувши кнопку правою кнопкою миші. (Надав Тал Ейнат у bpo-1529353.)

Зазначені вище зміни було перенесено до випусків обслуговування 3.6.

НОВЕ в 3.7.4:

Додайте «Run Customized» до меню «Run», щоб запустити модуль із налаштованими налаштуваннями. Будь-які введені аргументи командного рядка додаються до sys.argv. Вони знову з’являються в полі для наступного налаштованого запуску. Можна також придушити звичайний перезапуск головного модуля Shell. (Надано Шеріл Сабелла, Террі Ян Ріді та іншими в bpo-5680 і bpo-37627.)

Нове в 3.7.5:

Додайте додаткові номери рядків для вікон редактора IDLE. Вікна відкриваються без номерів рядків, якщо не встановлено інше на вкладці «Загальні» діалогового вікна налаштування. Номери рядків для існуючого вікна відображаються та ховаються в меню «Параметри». (Надано Тал Ейнат і Саймадхав Геблікар у bpo-17535.)

### importlib

`importlib.abc.ResourceReader` ABC було представлено для підтримки завантаження ресурсів із пакетів. Дивіться також importlib.resources. (Надано Баррі Варшау, Бреттом Кенноном у bpo-32248.)

`importlib.reload()` тепер викликає `ModuleNotFoundError`, якщо модуль не має специфікації. (Надав Гарвіт Хатрі в bpo-29851.)

`importlib.find_spec()` тепер викликає `ModuleNotFoundError` замість `AttributeError`, якщо вказаний батьківський модуль не є пакетом (тобто не має атрибута `__path__`). (Надав Мілан Оберкірх у bpo-30436.)

Новий `importlib.source_hash()` можна використовувати для обчислення хешу переданого джерела. файл .pyc на основі хешу вбудовує значення, яке повертає ця функція.

### io

Новий метод `TextIOWrapper.reconfigure()` можна використовувати для переналаштування текстового потоку з новими налаштуваннями. (Надано Антуаном Пітру в bpo-30526 та INADA Naoki в bpo-15216.)

### IP-адреса

Нові методи `subnet_of()` і `supernet_of()` `ipaddress.IPv6Network` і `ipaddress.IPv4Network` можна використовувати для перевірки обмеження мережі. (Надано Мішелем Альбертом і Шеріл Сабеллою в bpo-20825.)

### itertools

`itertools.islice()` тепер приймає `цілочисельні об’єкти` як аргументи запуску, зупинки та фрагмента. (Надав Вілл Робертс у bpo-30537.)

### локаль

Новий аргумент monetary для `locale.format_string()` можна використовувати, щоб перетворення використовувало грошові розділювачі тисяч і рядки групування. (Надано Гарвітом у bpo-10379.)

Функція `locale.getpreferredencoding()` тепер завжди повертає `'UTF-8'` на Android або в примусовому режимі UTF-8.

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

Тепер екземпляри `Logger` можна маринувати. (Надав Віней Саджип у bpo-30520.)

Новий метод `StreamHandler.setStream()` можна використовувати для заміни потоку реєстратора після створення обробника. (Надав Віней Саджип у bpo-30522.)

Тепер можна вказати ключові аргументи для конструкторів обробників у конфігурації, переданій у `logging.config.fileConfig()`. (Надано Престоном Лендерсом у bpo-31080.)

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

Нова функція `math.remainder()` реалізує операцію залишку у стилі IEEE 754. (Надав Марк Дікінсон у bpo-29962.)

### міметипи

Тип MIME .bmp змінено з `'image/x-ms-bmp` на `'image/bmp'`. (Надано Nitish Chandra в bpo-22589.)

### msilib

The new `Database.Close()` method can be used to close the MSI database. (Contributed by Berker Peksag in bpo-20486.)

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

Новий метод `Process.close()` явно закриває об’єкт процесу та звільняє всі пов’язані з ним ресурси. `ValueError` виникає, якщо основний процес все ще виконується. (Надав Антуан Пітру в bpo-30596.)

Новий метод `Process.kill()` можна використовувати для завершення процесу за допомогою сигналу `SIGKILL` в Unix. (Надав Вітор Перейра в bpo-30794.)

Недемонічні потоки, створені `Process`, тепер об’єднуються після виходу з процесу. (Надав Антуан Пітру в bpo-18966.)

### ос

`os.fwalk()` тепер приймає аргумент path як `bytes`. (Надав Сергій Сторчака в bpo-28682.)

`os.scandir()` отримав підтримку для дескрипторів файлів. (Надав Сергій Сторчака в bpo-25996.)

Нова функція `register_at_fork()` дозволяє реєструвати зворотні виклики Python для виконання в розгалуженні процесу. (Надав Антуан Пітру в bpo-16500.)

Додано функції `os.preadv()` (поєднує функції `os.readv()` і `os.pread()`) і `os.pwritev()` (поєднує функції `os.writev()` і `os.pwrite()`). (Надав Пабло Галіндо в bpo-31368.)

The mode argument of `os.makedirs()` no longer affects the file permission bits of newly created intermediate-level directories. (Contributed by Serhiy Storchaka in bpo-19930.)

`os.dup2()` тепер повертає новий дескриптор файлу. Раніше завжди повертався `None`. (Надав Бенджамін Петерсон у bpo-32441.)

Структура, яку повертає `os.stat()`, тепер містить атрибут `st_fstype` у Solaris та його похідних. (Надав Jesús Cea Avión у bpo-32659.)

### pathlib

Новий метод `Path.is_mount()` тепер доступний у системах POSIX і може використовуватися для визначення того, чи є шлях точкою монтування. (Надав Купер Рай Ліз у bpo-30897.)

### pdb

`pdb.set_trace()` тепер приймає необов’язковий аргумент заголовок, що містить лише ключове слово. Якщо вказано, воно друкується на консолі безпосередньо перед початком налагодження. (Надав Баррі Варшау у bpo-31389.)

`pdb` командний рядок тепер приймає `-m module_name` як альтернативу файлу сценарію. (Надав Маріо Корчеро в bpo-32206.)

### py_compile

`py_compile.compile()` – і за розширенням `compileall` – тепер поважає змінну середовища `SOURCE_DATE_EPOCH` шляхом безумовного створення файлів `.pyc` для перевірки на основі хешу. Це дозволяє гарантувати відтворювані збірки файлів `.pyc`, коли вони створюються з бажанням. (Надав Бернхард М. Відеманн у bpo-29708.)

### pydoc

Сервер pydoc тепер може прив’язуватися до довільного імені хоста, визначеного новим аргументом командного рядка `-n`. (Надав Feanil Patel у bpo-31128.)

### чергу

Новий клас `SimpleQueue` є необмеженою чергою FIFO. (Надав Антуан Пітру в bpo-14976.)

### повторно

Прапори `re.ASCII`, `re.LOCALE` і `re.UNICODE` можна встановити в межах групи. (Надав Сергій Сторчака в bpo-31690.)

`re.split()` тепер підтримує розбиття за шаблоном, таким як `r'\b'`, `'^$'` або `(?=-)`, який відповідає порожньому рядку. (Надав Сергій Сторчака в bpo-25054.)

Регулярні вирази, скомпільовані з прапорцем `re.LOCALE`, більше не залежать від локалі під час компіляції. Параметри мови застосовуються лише тоді, коли використовується скомпільований регулярний вираз. (Надав Сергій Сторчака в bpo-30215.)

`FutureWarning` тепер видається, якщо регулярний вираз містить конструкції набору символів, які зміняться семантично в майбутньому, наприклад вкладені набори та операції з наборами. (Надав Сергій Сторчака в bpo-30349.)

Зкомпільований регулярний вираз і відповідні об’єкти тепер можна копіювати за допомогою `copy.copy()` і `copy.deepcopy()`. (Надав Сергій Сторчака в bpo-10076.)

### сигнал

Новий аргумент warn_on_full_buffer для функції `signal.set_wakeup_fd()` дає змогу вказати, чи друкує Python попередження на stderr у разі переповнення буфера пробудження. (Надано Натаніелем Дж. Смітом у bpo-30050.)

### гніздо

Новий метод `socket.getblocking()` повертає `True`, якщо сокет перебуває в режимі блокування, і `False` в іншому випадку. (Надав Юрій Селіванов у bpo-32373.)

Нова функція `socket.close()` закриває переданий дескриптор файлу сокета. Цю функцію слід використовувати замість `os.close()` для кращої сумісності між платформами. (Надав Крістіан Хеймс у bpo-32454.)

The `socket` module now exposes the `socket.TCP_CONGESTION` (Linux 2.6.13), `socket.TCP_USER_TIMEOUT` (Linux 2.6.37), and `socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constants. (Contributed by Omar Sandoval in bpo-26273 and Nathaniel J. Smith in bpo-29728.)

Support for `socket.AF_VSOCK` sockets has been added to allow communication between virtual machines and their hosts. (Contributed by Cathy Avery in bpo-27584.)

Тепер сокети за замовчуванням автоматично визначають сімейство, тип і протокол із файлового дескриптора. (Надав Крістіан Хеймс у bpo-28134.)

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

`socketserver.ThreadingMixIn.server_close()` тепер чекає, поки завершаться всі потоки, що не є демонами. `socketserver.ForkingMixIn.server_close()` тепер очікує, поки завершаться всі дочірні процеси.

Додайте новий атрибут класу `socketserver.ForkingMixIn.block_on_close` до класів `socketserver.ForkingMixIn` і `socketserver.ThreadingMixIn`. Встановіть атрибут класу на `False`, щоб отримати поведінку до 3.7.

### sqlite3

`sqlite3.Connection` тепер надає метод `backup()`, якщо базова бібліотека SQLite має версію 3.6.11 або новішу. (Надано Леле Гайфакс у bpo-27645.)

Аргумент database `sqlite3.connect()` тепер приймає будь-який path-like object, а не просто рядок. (Надав Андерс Лоренцен у bpo-31843.)

### ssl

Модуль `ssl` тепер використовує вбудований API OpenSSL замість `match_hostname()` для перевірки імені хоста або IP-адреси. Значення перевіряються під час рукостискання TLS. Будь-яка помилка перевірки сертифіката, включно з помилкою перевірки імені хоста, тепер викликає `SSLCertVerificationError` і перериває рукостискання з належним повідомленням сповіщення TLS. Новий виняток містить додаткову інформацію. Перевірку імені хоста можна налаштувати за допомогою `SSLContext.hostname_checks_common_name`. (Надав Крістіан Хеймс у bpo-31399.)

Примітка

Покращена перевірка імені хоста вимагає реалізації libssl, сумісної з OpenSSL 1.0.2 або 1.1. Відповідно, OpenSSL 0.9.8 і 1.0.1 більше не підтримуються (див. Видалення підтримки платформи для отримання додаткової інформації). Модуль ssl здебільшого сумісний із LibreSSL 2.7.2 і новішими версіями.

Модуль `ssl` більше не надсилає IP-адреси в розширенні SNI TLS. (Надав Крістіан Хеймс у bpo-32185.)

`match_hostname()` більше не підтримує часткові символи підстановки, такі як `www*.example.org`. (Надано Мандіпом Сінгхом у bpo-23033 та Крістіаном Хеймсом у bpo-31399.)

Вибір набору шифрів за замовчуванням модуля `ssl` тепер використовує підхід чорного списку, а не жорстко закодований білий список. Python більше не вмикає повторно шифри, які були заблоковані оновленнями безпеки OpenSSL. Вибір набору шифрів за замовчуванням можна налаштувати під час компіляції. (Надав Крістіан Хеймс у bpo-31429.)

Тепер підтримується перевірка сертифікатів сервера, що містять інтернаціоналізовані доменні імена (IDN). У рамках цієї зміни атрибут `SSLSocket.server_hostname` тепер зберігає очікуване ім’я хоста у формі A-мітки (`"xn--pythn-mua.org"`), а не U-мітки форма (`"pythön.org"`). (Надано Натаніелем Дж. Смітом і Крістіаном Хеймсом у bpo-28414.)

Модуль `ssl` має попередню та експериментальну підтримку TLS 1.3 і OpenSSL 1.1.1. На момент випуску Python 3.7.0 OpenSSL 1.1.1 все ще перебуває в стадії розробки, а TLS 1.3 ще не завершено. Рукостискання та протокол TLS 1.3 поводяться дещо інакше, ніж TLS 1.2 і раніші версії, див. TLS 1.3. (Надано Крістіаном Хеймсом у bpo-32947, bpo-20995, bpo-29136, bpo-30622 та bpo-33618)

`SSLSocket` і `SSLObject` більше не мають відкритого конструктора. Пряме створення екземплярів ніколи не було задокументованою та підтримуваною функцією. Екземпляри мають бути створені за допомогою `SSLContext` методів `wrap_socket()` і `wrap_bio()`. (Надав Крістіан Хеймс у bpo-32951)

API OpenSSL 1.1 для встановлення мінімальної та максимальної версій протоколу TLS доступні як `SSLContext.minimum_version` і `SSLContext.maximum_version`. Підтримувані протоколи позначаються кількома новими прапорцями, наприклад `HAS_TLSv1_1`. (Надав Крістіан Хеймс у bpo-32609.)

Added `ssl.SSLContext.post_handshake_auth` to enable and `ssl.SSLSocket.verify_client_post_handshake()` to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in gh-78851.)

### рядок

`string.Template` тепер дозволяє вам окремо змінювати шаблон регулярного виразу для заповнювачів у дужках і без дужок. (Надав Баррі Варшава в bpo-1198569.)

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

The `subprocess.run()` function accepts the new capture_output keyword argument. When true, stdout and stderr will be captured. This is equivalent to passing `subprocess.PIPE` as stdout and stderr arguments. (Contributed by Bo Bayles in bpo-32102.)

Функція `subprocess.run` і конструктор `subprocess.Popen` тепер приймають аргумент ключового слова text як псевдонім universal_newlines. (Надав Ендрю Клегг у bpo-31756.)

У Windows стандартне значення для close_fds було змінено з `False` на `True` під час переспрямування стандартних дескрипторів. Тепер можна встановити для close_fds значення true під час перенаправлення стандартних дескрипторів. Перегляньте `subprocess.Popen`. Це означає, що close_fds тепер має значення `True` на всіх підтримуваних платформах. (Надав Сегев Файнер у bpo-19764.)

Модуль підпроцесу тепер більш витончений під час обробки `KeyboardInterrupt` під час `subprocess.call()`, `subprocess.run()` або в контекстному менеджері `Popen`. Тепер він деякий час очікує на вихід дочірнього елемента, перш ніж продовжити обробку виняткової ситуації `KeyboardInterrupt`. (Надав Грегорі П. Сміт у bpo-25942.)

### система

Нова функція `sys.breakpointhook()` викликається вбудованою `breakpoint()`. (Надав Баррі Варшау у bpo-31353.)

На Android новий `sys.getandroidapilevel()` повертає версію Android API під час збирання. (Надав Віктор Стіннер у bpo-28740.)

Нова функція `sys.get_coroutine_origin_tracking_depth()` повертає поточну глибину відстеження джерела співпрограми, встановлену новим `sys.set_coroutine_origin_tracking_depth()`. `asyncio` було перетворено на використання цього нового API замість застарілого `sys.set_coroutine_wrapper()`. (Надано Натаніелем Дж. Смітом у bpo-32591.)

### час

PEP 564 додає шість нових функцій із наносекундною роздільною здатністю до модуля `time`:

- `time.clock_gettime_ns()`

- `time.clock_settime_ns()`

- `time.monotonic_ns()`

- `time.perf_counter_ns()`

- `time.process_time_ns()`

- `time.time_ns()`

Додано нові ідентифікатори годинника:

- `time.CLOCK_BOOTTIME` (Linux): Identical to `time.CLOCK_MONOTONIC`, except it also includes any time that the system is suspended.

- `time.CLOCK_PROF` (FreeBSD, NetBSD and OpenBSD): High-resolution per-process CPU timer.

- `time.CLOCK_UPTIME` (FreeBSD, OpenBSD): Time whose absolute value is the time the system has been running and not suspended, providing accurate uptime measurement.

Нові функції `time.thread_time()` і `time.thread_time_ns()` можна використовувати для отримання вимірювань часу процесора для кожного потоку. (Надав Антуан Пітру в bpo-32025.)

Нова функція `time.pthread_getcpuclockid()` повертає ідентифікатор годинника ЦП-годинника для конкретного потоку.

### tkinter

Тепер доступний новий клас `tkinter.ttk.Spinbox`. (Надав Алан Мур у bpo-32585.)

### tracemalloc

`tracemalloc.Traceback` поводиться більше як звичайне трасування, сортуючи кадри від найстаріших до найновіших. `Traceback.format()` тепер приймає негативний ліміт, скорочуючи результат до найстаріших кадрів `abs(limit)`. Щоб отримати стару поведінку, використовуйте новий аргумент most_recent_first для `Traceback.format()`. (Надав Джессі Беккер у bpo-32121.)

### види

Тепер доступні нові класи `WrapperDescriptorType`, `MethodWrapperType`, `MethodDescriptorType` і `ClassMethodDescriptorType`. (Надано Мануелем Креббером і Гвідо ван Россумом у bpo-29377 та Сергієм Сторчакою у bpo-32265.)

Нова функція `types.resolve_bases()` динамічно вирішує записи MRO, як зазначено в PEP 560. (Надав Іван Левківський у bpo-32717.)

### unicodedata

The internal `unicodedata` database has been upgraded to use Unicode 11. (Contributed by Benjamin Peterson.)

### unittest

Новий параметр командного рядка `-k` command-line option allows filtering tests by a name substring or a Unix shell-like pattern. For example, `python -m unittest -k foo` runs `foo_tests.SomeTest.test_something`, `bar_tests.SomeTest.test_foo`, but not `bar_tests.FooTest.test_something`. (Надав by Jonas Haag in bpo-32071.)

### unittest.mock

Атрибути `sentinel` тепер зберігають свою ідентичність, коли їх `скопіюють` або `маринують`. (Надав Сергій Сторчака в bpo-20804.)

Нова функція `seal()` дозволяє запечатувати екземпляри `Mock`, що забороняє подальше створення макетів атрибутів. Печатка застосовується рекурсивно до всіх атрибутів, які самі по собі є макетами. (Надав Маріо Корчеро в bpo-30541.)

### urllib.parse

`urllib.parse.quote()` було оновлено з RFC 2396 до RFC 3986, додавши `~` до набору символів, які за замовчуванням ніколи не беруться в лапки. (Надано Крістіаном Теуном і Ратнадіпом Дебнатом у bpo-16285.)

### uu

The `uu.encode()` function now accepts an optional backtick keyword argument. When it’s true, zeros are represented by `'`'` instead of spaces. (Contributed by Xiang Zhang in bpo-30103.)

### uuid

Новий атрибут `UUID.is_safe` передає інформацію з платформи про те, чи згенеровані UUID генеруються за допомогою багатопроцесорного безпечного методу. (Надав Баррі Варшау у bpo-22807.)

`uuid.getnode()` тепер надає перевагу універсально адміністрованим MAC-адресам над локально адміністрованими MAC-адресами. Це забезпечує кращу гарантію глобальної унікальності UUID, що повертається з `uuid.uuid1()`. Якщо доступні лише локально адміністровані MAC-адреси, повертається перша така знайдена. (Надав Баррі Варшау у bpo-32107.)

### попередження

Ініціалізація стандартних фільтрів попереджень змінена таким чином:

- попередження, увімкнені за допомогою параметрів командного рядка (включно з параметрами `-b` і новим параметром `-X` `dev`) завжди передаються механізму попереджень через атрибут `sys.warnoptions`.

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

  - фільтр `BytesWarning` для `-b` (або `-bb`)

  - будь-які фільтри, визначені параметром `-W`

  - будь-які фільтри, указані за допомогою змінної середовища `PYTHONWARNINGS`

  - будь-які інші спеціальні фільтри CPython (наприклад, фільтр `за замовчуванням`, доданий для нового режиму `-X dev`)

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

- у CPython debug builds, усі попередження тепер відображаються за замовчуванням (неявний список фільтрів порожній)

(Надано Ніком Когланом і Віктором Стіннером у bpo-20361, bpo-32043 і bpo-32230.)

Попередження про застарілу знову відображаються за замовчуванням в однофайлових сценаріях та в інтерактивному запиті. Докладніше див. PEP 565: Показати DeprecationWarning у __main__. (Надав Нік Коглан у bpo-31975.)

### xml

As mitigation against DTD and external entity retrieval, the `xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. (Contributed by Christian Heimes in gh-61441.)

### xml.etree

Предикати ElementPath в методах `find()` тепер можуть порівнювати текст поточного вузла з `[. = "текст"]`, не тільки текст у дітей. Предикати також дозволяють додавати пробіли для кращої читабельності. (Надав Стефан Бенель у bpo-31648.)

### xmlrpc.server

`SimpleXMLRPCDispatcher.register_function` тепер можна використовувати як декоратор. (Надав Xiang Zhang у bpo-7769.)

### zipap

Функція `create_archive()` тепер приймає додатковий аргумент filter, щоб дозволити користувачеві вибрати, які файли слід включити в архів. (Надано Irmen de Jong у bpo-31072.)

Функція `create_archive()` тепер приймає додатковий аргумент compressed для створення стисненого архіву. Для підтримки стиснення також додано параметр командного рядка `--compress`. (Надав Zhiming Wang у bpo-31638.)

### zip-файл

`ZipFile` тепер приймає новий параметр compresslevel для керування рівнем стиснення. (Надав Бо Бейлс у bpo-21417.)

Підкаталоги в архівах, створених `ZipFile`, тепер зберігаються в алфавітному порядку. (Надав Bernhard M. Wiedemann у bpo-30693.)

## Зміни C API

Реалізовано новий API для локального зберігання потоків. Перегляньте PEP 539: новий C API для потокового локального зберігання для огляду та API для спеціального зберігання потоків (TSS). для повної довідки. (Надав Масаюкі Ямамото в bpo-25658.)

Нова функція контекстних змінних відкриває ряд нових API C.

Нова функція `PyImport_GetModule()` повертає попередньо імпортований модуль із вказаною назвою. (Надав Ерік Сноу в bpo-28411.)

Новий макрос `Py_RETURN_RICHCOMPARE` полегшує написання розширених функцій порівняння. (Надав Петро Вікторін у bpo-23699.)

Новий макрос `Py_UNREACHABLE` можна використовувати для позначення недоступних шляхів коду. (Надав Баррі Варшау у bpo-31338.)

`tracemalloc` тепер відкриває C API за допомогою нових функцій `PyTraceMalloc_Track()` і `PyTraceMalloc_Untrack()`. (Надав Віктор Стіннер у bpo-30054.)

Нові статичні маркери `import__find__load__start()` і `import__find__load__done()` можна використовувати для відстеження імпорту модуля. (Надав Крістіан Хеймс у bpo-31574.)

The fields `name` and `doc` of structures `PyMemberDef`, `PyGetSetDef`, `PyStructSequence_Field`, `PyStructSequence_Desc`, and `wrapperbase` are now of type `const char *` rather of `char *`. (Contributed by Serhiy Storchaka in bpo-28761.)

Результат `PyUnicode_AsUTF8AndSize()` і `PyUnicode_AsUTF8()` тепер має тип `const char *`, а не `char *`. (Надав Сергій Сторчака в bpo-28769.)

Результатом `PyMapping_Keys()`, `PyMapping_Values()` і `PyMapping_Items()` тепер завжди є список, а не список або кортеж. (Надав Орен Мілман у bpo-28280.)

Додано функції `PySlice_Unpack()` і `PySlice_AdjustIndices()`. (Надав Сергій Сторчака в bpo-27867.)

`PyOS_AfterFork()` застаріла на користь нових функцій `PyOS_BeforeFork()`, `PyOS_AfterFork_Parent()` і `PyOS_AfterFork_Child()`. (Надав Антуан Пітру в bpo-16500.)

Синглтон `PyExc_RecursionErrorInst`, який був частиною загальнодоступного API, було видалено, оскільки його члени, які ніколи не очищалися, можуть спричинити помилку сегмента під час фіналізації інтерпретатора. Надав Ксав’є де Гає в bpo-22898 і bpo-30697.

Додано підтримку C API для часових поясів за допомогою конструкторів часових поясів `PyTimeZone_FromOffset()` і `PyTimeZone_FromOffsetAndName()`, а також доступ до синглтона UTC за допомогою `PyDateTime_TimeZone_UTC`. Надав Пол Ганссле в bpo-10381.

The type of results of `PyThread_start_new_thread()` and `PyThread_get_thread_ident()`, and the id parameter of `PyThreadState_SetAsyncExc()` changed from long to unsigned long. (Contributed by Serhiy Storchaka in bpo-6532.)

`PyUnicode_AsWideCharString()` now raises a `ValueError` if the second argument is `NULL` and the wchar_t* string contains null characters. (Contributed by Serhiy Storchaka in bpo-30708.)

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

Новий `PyInterpreterState_GetID()` повертає унікальний ідентифікатор для заданого інтерпретатора. (Надав Ерік Сноу в bpo-29102.)

`Py_DecodeLocale()`, `Py_EncodeLocale()` тепер використовують кодування UTF-8, коли ввімкнено режим UTF-8. (Надав Віктор Стіннер у bpo-29240.)

`PyUnicode_DecodeLocaleAndSize()` і `PyUnicode_EncodeLocale()` тепер використовують поточне кодування мови для обробника помилок `surrogateescape`. (Надав Віктор Стіннер у bpo-29240.)

Параметри start і end `PyUnicode_FindChar()` тепер налаштовані так, щоб поводитися як фрагменти рядків. (Надав Xiang Zhang у bpo-28822.)

## Зміни збірки

Підтримку створення `--without-threads` видалено. Модуль `threading` тепер завжди доступний. (Надав Антуан Пітру в bpo-31370.).

Повна копія libffi більше не додається для використання під час створення модуля `_ctypes` на платформах UNIX, відмінних від OSX. Тепер для створення `_ctypes` на таких платформах потрібна встановлена копія libffi. (Надано Zachary Ware у bpo-27979.)

Процес збирання Windows більше не залежить від Subversion для залучення зовнішніх джерел, замість цього для завантаження zip-файлів із GitHub використовується сценарій Python. Якщо Python 3.6 не знайдено в системі (через `py -3.6`), NuGet використовується для завантаження копії 32-розрядної версії Python для цієї мети. (Надано Zachary Ware у bpo-30450.)

Для модуля `ssl` потрібен OpenSSL 1.0.2 або 1.1, сумісний libssl. Термін експлуатації OpenSSL 1.0.1 завершився 31 грудня 2016 року, тому він більше не підтримується. LibreSSL також тимчасово не підтримується. У версіях LibreSSL до версії 2.6.4 відсутні необхідні API OpenSSL 1.0.2.

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

Накладні витрати на виклик багатьох методів різних стандартних бібліотечних класів, реалізованих у C, були значно зменшені завдяки портуванню більшої кількості коду для використання конвенції `METH_FASTCALL`. (Надано Віктором Стіннером у bpo-29300, bpo-29507, bpo-29452 та bpo-29286.)

Різні оптимізації дозволили скоротити час запуску Python на 10% у Linux і до 30% у macOS. (Надано Віктором Стіннером, INADA Naoki у bpo-29585 та Іваном Левківським у bpo-31333.)

Виклики методів тепер на 20% швидші завдяки змінам байт-коду, що дозволяє уникнути створення зв’язаних екземплярів методів. (Надано Юрієм Селівановим та INADA Naoki у bpo-26110.)

Модуль `asyncio` отримав низку помітних оптимізацій для часто використовуваних функцій:

- Функцію `asyncio.get_event_loop()` було повторно реалізовано в C, щоб зробити її в 15 разів швидшою. (Надав Юрій Селіванов у bpo-32296.)

- `asyncio.Future` управління зворотними викликами оптимізовано. (Надав Юрій Селіванов у bpo-32348.)

- `asyncio.gather()` тепер на 15% швидше. (Надав Юрій Селіванов у bpo-32355.)

- `asyncio.sleep()` тепер у 2 рази швидше, якщо аргумент delay дорівнює нулю або від’ємний. (Надав Ендрю Свєтлов у bpo-32351.)

- Накладні витрати на продуктивність асинхронного режиму налагодження зменшено. (Надав Антуан Пітру в bpo-31970.)

У результаті PEP 560 work, час імпорту `typing` було зменшено в 7 разів, і багато операцій набору тексту тепер виконуються швидше. (Надав Іван Левківський у bpo-32226.)

`sorted()` і `list.sort()` оптимізовано для звичайних випадків, щоб працювати на 40-75% швидше. (Надав Еліот Гороховський у bpo-28685.)

`dict.copy()` тепер у 5,5 разів швидше. (Надав Юрій Селіванов у bpo-31179.)

`hasattr()` і `getattr()` тепер приблизно в 4 рази швидше, якщо name не знайдено і obj не перевизначає `object.__getattr__()` або `object.__getattribute__()` . (Надано INADA Naoki в bpo-32544.)

Пошук певних символів Unicode (наприклад, української великої «Є») у рядку був у 25 разів повільнішим, ніж пошук інших символів. Тепер це лише в 3 рази повільніше в гіршому випадку. (Надав Сергій Сторчака в bpo-24821.)

Фабрику `collections.namedtuple()` було оновлено, щоб зробити створення іменованих кортежів у 4-6 разів швидшим. (Надано Jelle Zijlstra з подальшими вдосконаленнями INADA Naoki, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)

`date.fromordinal()` і `date.fromtimestamp()` тепер на 30% швидше в звичайному регістрі. (Надав Пол Ганссле в bpo-32403.)

Функція `os.fwalk()` тепер у 2 рази швидша завдяки використанню `os.scandir()`. (Надав Сергій Сторчака в bpo-25996.)

Швидкість функції `shutil.rmtree()` покращено на 20–40% завдяки використанню функції `os.scandir()`. (Надав Сергій Сторчака в bpo-28564.)

Оптимізовано без урахування регістру зіставлення та пошук `регулярних виразів`. Тепер пошук деяких шаблонів може бути в 20 разів швидшим. (Надав Сергій Сторчака в bpo-30285.)

`re.compile()` тепер перетворює параметр `flags` на об’єкт int, якщо це `RegexFlag`. Тепер він такий же швидкий, як Python 3.5, і швидший за Python 3.6 приблизно на 10% залежно від шаблону. (Надано INADA Naoki в bpo-31671.)

Методи `modify()` класів `selectors.EpollSelector`, `selectors.PollSelector` і `selectors.DevpollSelector` можуть бути приблизно на 10% швидшими за великих навантажень . (Надав Джампаоло Родола в bpo-30014)

Постійне згортання було перенесено з оптимізатора вічка в новий оптимізатор AST, який може виконувати оптимізацію більш послідовно. (Надано Євгеном Тодером та INADA Naoki у bpo-29469 та bpo-11549.)

Більшість функцій і методів у `abc` було переписано на C. Це робить створення абстрактних базових класів і виклик `isinstance()` і `issubclass()` на них у 1,5 рази швидшим. Це також скорочує час запуску Python до 10%. (Надано Іваном Левківським та INADA Naoki у bpo-31333)

Значні покращення швидкості альтернативних конструкторів для `datetime.date` і `datetime.datetime` завдяки використанню конструкторів швидкого шляху, коли не створюються підкласи. (Надав Пол Ганссле в bpo-32403)

Швидкість порівняння екземплярів `array.array` була значно покращена в деяких випадках. Тепер це від 10 до 70 разів швидше під час порівняння масивів, що містять значення одного цілого типу. (Надав Adrian Wielgosik у bpo-24700.)

Функції `math.erf()` і `math.erfc()` тепер використовують (швидшу) реалізацію бібліотеки C на більшості платформ. (Надав Сергій Сторчака в bpo-26121.)

## Інші зміни в реалізації CPython

- Trace hooks may now opt out of receiving the `line` and opt into receiving the `opcode` events from the interpreter by setting the corresponding new `f_trace_lines` and `f_trace_opcodes` attributes on the frame being traced. (Contributed by Nick Coghlan in bpo-31344.)

- Виправлено деякі проблеми узгодженості з атрибутами модуля пакета простору імен. Об’єкти модуля простору імен тепер мають `__file__`, для якого встановлено значення `None` (раніше не було встановлено), а для їх `__spec__.origin` також встановлено значення `None` (раніше це був рядок `" простір імен"`). Див. bpo-32305. Крім того, об’єкт модуля простору імен `__spec__.loader` має те саме значення, що і `__loader__` (раніше для першого було встановлено значення `None`). Див. bpo-32303.

- Словник `locals()` тепер відображається в лексичному порядку, у якому були визначені змінні. Раніше порядок був невизначеним. (Надав Реймонд Геттінгер у bpo-32690.)

- The `distutils` `upload` command no longer tries to change CR end-of-line characters to CRLF. This fixes a corruption issue with sdists that ended with a byte equivalent to CR. (Contributed by Bo Bayles in bpo-32304.)

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

Вирази yield (як `yield`, так і `yield from` пункти) тепер застаріли у виразах розуміння та генераторі (окрім ітераційного виразу в крайньому лівому пункті `for`). Це гарантує, що розуміння завжди негайно повертатиме контейнер відповідного типу (замість потенційного повернення об’єкта generator iterator), тоді як вирази генератора не намагатимуться перемежовувати свій неявний вихід з виводом будь-яких явних виразів yield. У Python 3.7 такі вирази видають `DeprecationWarning` під час компіляції, у Python 3.8 це буде `SyntaxError`. (Надав Сергій Сторчака в bpo-10544.)

Повернення підкласу `complex` з `object.__complex__()` є застарілим і буде помилкою в майбутніх версіях Python. Це робить `__complex__()` сумісним з `object.__int__()` і `object.__float__()`. (Надав Сергій Сторчака в bpo-28894.)

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

### aifc

`aifc.openfp()` has been deprecated and will be removed in Python 3.9. Use `aifc.open()` instead. (Contributed by Brian Curtin in bpo-31985.)

### asyncio

Підтримка для `очікування` екземплярів `asyncio.Lock` та інших примітивів синхронізації asyncio застаріла. Для отримання та звільнення ресурсу синхронізації необхідно використовувати диспетчер асинхронного контексту. (Надав Ендрю Свєтлов у bpo-32253.)

The `asyncio.Task.current_task()` and `asyncio.Task.all_tasks()` methods have been deprecated. (Contributed by Andrew Svetlov in bpo-32250.)

### колекції

У Python 3.8 абстрактні базові класи в `collections.abc` більше не відображатимуться в звичайному модулі `collections`. Це допоможе створити більш чітке розмежування між конкретними класами та абстрактними базовими класами. (Надав Сергій Сторчака в bpo-25988.)

### dbm

`dbm.dumb` тепер підтримує читання файлів лише для читання та більше не записує файл індексу, якщо він не змінений. Тепер видається попередження про застаріння, якщо файл індексу відсутній і створений заново в режимах `'r'` і `'w'` (це буде помилка в майбутніх випусках Python). (Надав Сергій Сторчака в bpo-28847.)

### перелік

У Python 3.8 спроба перевірити об’єкти, що не належать до Enum, у класах `Enum` викличе `TypeError` (наприклад, `1 in Color`); аналогічно спроба перевірити об’єкти без прапорців у члені `Flag` викличе `TypeError` (наприклад, `1 in Perm.RW`); наразі обидві операції замість цього повертають `False`. (Надав Ітан Фурман у bpo-33217.)

### gettext

Використання нецілого значення для вибору форми множини в `gettext` тепер застаріло. Він ніколи не працював правильно. (Надав Сергій Сторчака в bpo-28692.)

### importlib

Methods `MetaPathFinder.find_module()` (replaced by `MetaPathFinder.find_spec()`) and `PathEntryFinder.find_loader()` (replaced by `PathEntryFinder.find_spec()`) both deprecated in Python 3.4 now emit `DeprecationWarning`. (Contributed by Matthias Bussonnier in bpo-29576)

`importlib.abc.ResourceLoader` ABC застаріло на користь `importlib.abc.ResourceReader`.

### локаль

`locale.format()` застаріло, замість нього використовуйте `locale.format_string()`. (Надано Гарвітом у bpo-10379.)

### macpath

`macpath` тепер не підтримується та буде видалено в Python 3.8. (Надано Чі Сюань Єном у bpo-9850.)

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

`dummy_threading` and `_dummy_thread` have been deprecated. It is no longer possible to build Python with threading disabled. Use `threading` instead. (Contributed by Antoine Pitrou in bpo-31370.)

### гніздо

Безмовне скорочення значення аргументу в `socket.htons()` і `socket.ntohs()` застаріло. У майбутніх версіях Python, якщо переданий аргумент перевищує 16 біт, буде створено виняток. (Надав Орен Мілман у bpo-28332.)

### ssl

`ssl.wrap_socket()` застаріло. Замість цього використовуйте `ssl.SSLContext.wrap_socket()`. (Надав Крістіан Хеймс у bpo-28124.)

### sunau

`sunau.openfp()` has been deprecated and will be removed in Python 3.9. Use `sunau.open()` instead. (Contributed by Brian Curtin in bpo-31985.)

### система

Застаріли `sys.set_coroutine_wrapper()` і `sys.get_coroutine_wrapper()`.

Недокументована функція `sys.callstats()` застаріла та буде видалена в майбутній версії Python. (Надав Віктор Стіннер у bpo-28799.)

### хвиля

`wave.openfp()` визнано застарілим і буде видалено в Python 3.9. Натомість використовуйте `wave.open()`. (Надав Браян Кертін у bpo-31985.)

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

Функція `PySlice_GetIndicesEx()` застаріла та замінена на макрос, якщо `Py_LIMITED_API` не встановлено або встановлено значення в діапазоні від `0x03050400` до `0x03060000` (не включно), або `0x03060100` або вище. (Надав Сергій Сторчака в bpo-27867.)

`PyOS_AfterFork()` застаріло. Замість цього використовуйте `PyOS_BeforeFork()`, `PyOS_AfterFork_Parent()` або `PyOS_AfterFork_Child()`. (Надав Антуан Пітру в bpo-16500.)

## Видалення підтримки платформи

- FreeBSD 9 і старіші більше офіційно не підтримуються.

- Для повної підтримки Unicode, включно з модулями розширення, очікується, що платформи *nix нададуть принаймні один із `C.UTF-8` (повна локаль), `C.utf8` (повна локаль) або `UTF-8` (`LC_CTYPE`-only locale) як альтернатива застарілому `ASCII` на основі `C` локалі.

- OpenSSL 0.9.8 і 1.0.1 більше не підтримуються, що означає, що створення CPython 3.7 із підтримкою SSL/TLS на старіших платформах, які все ще використовують ці версії, потребує спеціальних параметрів збірки, які посилаються на новішу версію OpenSSL.

  Зокрема, ця проблема стосується дистрибутивів LTS Linux Debian 8 (він же «jessie») і Ubuntu 14.04 (він же «Trusty»), оскільки вони все ще використовують OpenSSL 1.0.1 за замовчуванням.

  Debian 9 («stretch») і Ubuntu 16.04 («xenial»), а також останні випуски інших версій LTS Linux (наприклад, RHEL/CentOS 7.5, SLES 12-SP3) використовують OpenSSL 1.0.2 або пізнішої версії та залишаються підтримуваними у конфігурації збірки за замовчуванням.

  CPython’s own CI configuration file provides an example of using the SSL compatibility testing infrastructure in CPython’s test suite to build and link against OpenSSL 1.1.0 rather than an outdated system provided OpenSSL.

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

З Python 3.7 видалено наступні функції та API:

- Функцію `os.stat_float_times()` було видалено. Він був представлений у Python 2.3 для зворотної сумісності з Python 2.2, і був застарілим з Python 3.1.

- Невідомі вихідні коди, що складаються з `'\'` і літери ASCII у шаблонах заміни для `re.sub()` були застарілими в Python 3.5 і тепер викликають помилку.

- Вилучено підтримку аргументу exclude у `tarfile.TarFile.add()`. Він був застарілим у Python 2.7 і 3.2. Натомість використовуйте аргумент filter.

- The `ntpath.splitunc()` function was deprecated in Python 3.1, and has now been removed. Use `splitdrive()` instead.

- `collections.namedtuple()` більше не підтримує параметр verbose або атрибут `_source`, який показував згенерований вихідний код для іменованого класу кортежу. Це було частиною оптимізації, спрямованої на прискорення створення класів. (Надано Jelle Zijlstra з подальшими вдосконаленнями INADA Naoki, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)

- Функції `bool()`, `float()`, `list()` і `tuple()` більше не приймають аргументи ключових слів. Перший аргумент `int()` тепер можна передати лише як позиційний аргумент.

- Вилучено раніше застарілі в Python 2.4 класи `Plist`, `Dict` і `_InternalDict` у модулі `plistlib`. Значення Dict у результатах функцій `readPlist()` і `readPlistFromBytes()` тепер є звичайними dicts. Ви більше не можете використовувати доступ до атрибутів для доступу до елементів цих словників.

- Функцію `asyncio.windows_utils.socketpair()` видалено. Натомість використовуйте функцію `socket.socketpair()`, вона доступна на всіх платформах, починаючи з Python 3.5. `asyncio.windows_utils.socketpair` був просто псевдонімом `socket.socketpair` на Python 3.5 і новіших версіях.

- `asyncio` no longer exports the `selectors` and `_overlapped` modules as `asyncio.selectors` and `asyncio._overlapped`. Replace `from asyncio import selectors` with `import selectors`.

- Пряме створення об’єктів `ssl.SSLSocket` і `ssl.SSLObject` тепер заборонено. Конструктори ніколи не документувалися, не тестувалися і не проектувалися як публічні конструктори. Користувачі повинні були використовувати `ssl.wrap_socket()` або `ssl.SSLContext`. (Надав Крістіан Хеймс у bpo-32951.)

- The unused `distutils` `install_misc` command has been removed. (Contributed by Eric N. Vander Weele in bpo-29218.)

## Видалення модулів

Модуль `fpectl` видалено. Він ніколи не був увімкнений за замовчуванням, ніколи не працював правильно на x86-64, і він змінював Python ABI таким чином, що викликав неочікувану поломку розширень C. (Надано Натаніелем Дж. Смітом у bpo-29137.)

## Зміни лише для Windows

Засіб запуску Python (py.exe) може приймати 32- та 64-бітні специфікатори без необхідності вказувати проміжну версію. Тож `py -3-32` і `py -3-64` стають дійсними, а також `py -3.7-32`, а також -m-64 і -m.n-64 тепер дозволено використовувати 64-бітний Python, навіть якщо в іншому випадку використовувався б 32-бітний. Якщо зазначена версія недоступна, py.exe завершить роботу з помилкою. (Надав Стів Барнс у bpo-30291.)

Засіб запуску можна запустити як `py -0`, щоб створити список встановлених пітонів, за умовчанням позначених зірочкою. Запуск `py -0p` включатиме шляхи. Якщо py запускається зі специфікатором версії, який не може бути зіставлений, він також надрукує короткий список доступних специфікаторів. (Надав Стів Барнс у bpo-30362.)

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

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

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

- Імена `async` і `await` тепер є зарезервованими ключовими словами. Код, який використовує ці імена як ідентифікатори, тепер викличе `SyntaxError`. (Надано Jelle Zijlstra в bpo-30406.)

- PEP 479 увімкнено для всього коду в Python 3.7, тобто винятки `StopIteration`, викликані прямо чи опосередковано в співпрограмах і генераторах, перетворюються на винятки `RuntimeError`. (Надав Юрій Селіванов у bpo-32670.)

- Методи `object.__aiter__()` більше не можна оголошувати як асинхронні. (Надав Юрій Селіванов у bpo-31709.)

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

      f(1 for x in [1],)

      class C(1 for x in [1]):
          pass

  Python 3.7 тепер правильно викликає `SyntaxError`, оскільки вираз генератора завжди має бути безпосередньо всередині набору дужок і не може мати коми з обох боків, а дублювання дужок можна опустити лише під час викликів. (Надав Сергій Сторчака в bpo-32012 і bpo-32023.)

- Під час використання перемикача `-m` початковий робочий каталог тепер додається до `sys.path`, а не порожній рядок (який динамічно позначає поточний робочий каталог під час кожного імпорту). Будь-які програми, які перевіряють порожній рядок або іншим чином покладаються на попередню поведінку, потрібно буде відповідним чином оновити (наприклад, також перевіривши `os.getcwd()` або `os.path.dirname(__main__. __file__)`, залежно від того, чому код спочатку перевіряв порожній рядок).

### Зміни в API Python

- `socketserver.ThreadingMixIn.server_close()` тепер очікує, поки завершаться всі потоки, що не є демонами. Встановіть новий атрибут класу `socketserver.ThreadingMixIn.block_on_close` на `False`, щоб отримати поведінку до 3.7. (Надав Віктор Стіннер у bpo-31233 і bpo-33540.)

- `socketserver.ForkingMixIn.server_close()` тепер очікує, поки завершаться всі дочірні процеси. Встановіть новий атрибут класу `socketserver.ForkingMixIn.block_on_close` на `False`, щоб отримати поведінку до 3.7. (Надав Віктор Стіннер у bpo-31151 і bpo-33540.)

- У деяких випадках функція `locale.localeconv()` тепер тимчасово встановлює для локалі `LC_CTYPE` значення `LC_NUMERIC`. (Надав Віктор Стіннер у bpo-31900.)

- `pkgutil.walk_packages()` тепер викликає `ValueError`, якщо path є рядком. Раніше повертався порожній список. (Надано Sanyam Khurana в bpo-24744.)

- Аргумент рядка форматування для `string.Formatter.format()` тепер positional-only. Передача його як аргументу ключового слова застаріла в Python 3.5. (Надав Сергій Сторчака в bpo-29193.)

- Атрибути `key`, `value` і `coded_value` класу `http. cookies.Morsel` тепер доступні лише для читання. Призначення їм було застарілим у Python 3.5. Для їх налаштування використовуйте метод `set()`. (Надав Сергій Сторчака в bpo-29192.)

- The mode argument of `os.makedirs()` no longer affects the file permission bits of newly created intermediate-level directories. To set their file permission bits you can set the umask before invoking `makedirs()`. (Contributed by Serhiy Storchaka in bpo-19930.)

- Тип `struct.Struct.format` тепер `str` замість `bytes`. (Надав Віктор Стіннер у bpo-21071.)

- `parse_multipart()` now accepts the encoding and errors arguments and returns the same results as `FieldStorage`: for non-file fields, the value associated to a key is a list of strings, not bytes. (Contributed by Pierre Quentel in bpo-29979.)

- Через внутрішні зміни в `socket` виклик `socket.fromshare()` для сокета, створеного `socket.share` у старіших версіях Python, не підтримується.

- `repr` для `BaseException` змінено, щоб не включати кінцеву кому. Ця зміна стосується більшості винятків. (Надав Сергій Сторчака в bpo-30399.)

- `repr` для `datetime.timedelta` змінено, щоб включити ключові аргументи у вивід. (Надав Utkarsh Upadhyay у bpo-30302.)

- Оскільки `shutil.rmtree()` тепер реалізовано за допомогою функції `os.scandir()`, вказаний користувачем обробник onerror тепер викликається з першим аргументом `os.scandir` замість `os .listdir` під час перерахування каталогу не вдається.

- У майбутньому може бути додано підтримку вкладених наборів і операцій із наборами в регулярних виразах, як у Технічному стандарті Unicode #18. Це змінило б синтаксис. Для сприяння цій майбутній зміні `FutureWarning` на даний момент буде викликано у неоднозначних випадках. Це включає в себе набори, що починаються з літерала `'['` або містять літеральні послідовності символів `'--'`, `'&&'`, `'~~'` і `'| |'`. Щоб уникнути попередження, екрануйте їх за допомогою зворотної косої риски. (Надав Сергій Сторчака в bpo-30349.)

- Результат поділу рядка на `регулярний вираз`, який міг відповідати порожньому рядку, було змінено. Наприклад, розділення на `r'\s*'` тепер розділятиметься не лише на пробіли, як це було раніше, але також на порожні рядки перед усіма символами, які не є пробілами, і безпосередньо перед кінцем рядка. Попередню поведінку можна відновити, змінивши шаблон на `r'\s+'`. `FutureWarning` було видано для таких шаблонів, починаючи з Python 3.5.

  Для шаблонів, які відповідають як порожнім, так і непорожнім рядкам, результат пошуку всіх збігів також може бути змінений в інших випадках. Наприклад, у рядку `'a\n\n'`, шаблон `r'(?m)^\s*?$'` не лише відповідатиме порожнім рядкам у позиціях 2 і 3, але також рядок `'\n'` на позиціях 2–3. Щоб відповідати лише порожнім рядкам, шаблон слід переписати як `r'(?m)^[^\S\n]*$''`.

  `re.sub()` now replaces empty matches adjacent to a previous non-empty match. For example `re.sub('x*', '-', 'abxd')` returns now `'-a-b--d-'` instead of `'-a-b-d-'` (the first minus between „b“ and „d“ replaces „x“, and the second minus replaces an empty string between „x“ and „d“).

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

- Змініть `re.escape()`, щоб екранувати лише спеціальні символи регулярних виразів замість екранування всіх символів, крім літер ASCII, цифр і `'_'`. (Надав Сергій Сторчака в bpo-29995.)

- `tracemalloc.Traceback` кадри тепер сортуються від найстаріших до найновіших, щоб бути більш узгодженими з `traceback`. (Надав Джессі Беккер у bpo-32121.)

- В ОС, які підтримують `socket.SOCK_NONBLOCK` або `socket.SOCK_CLOEXEC` бітові прапорці, `socket.type` більше не застосовують їх. Тому такі перевірки, як `if sock.type == socket.SOCK_STREAM`, працюють належним чином на всіх платформах. (Надав Юрій Селіванов у bpo-32331.)

- У Windows стандартне значення для аргументу close_fds `subprocess.Popen` було змінено з `False` на `True` під час перенаправлення стандартних дескрипторів. Якщо раніше ви залежали від успадкованих дескрипторів під час використання `subprocess.Popen` зі стандартним переспрямуванням io, вам доведеться передати `close_fds=False`, щоб зберегти попередню поведінку, або використати `STARTUPINFO.lpAttributeList`.

- `importlib.machinery.PathFinder.invalidate_caches()` – що неявно впливає на `importlib.invalidate_caches()` – тепер видаляє записи в `sys.path_importer_cache`, для яких встановлено значення `None`. (Надано Бреттом Кенноном у bpo-33169.)

- У `asyncio`, `loop.sock_recv()`, `loop.sock_sendall()`, `loop.sock_accept()`, `loop. getaddrinfo()`, `loop.getnameinfo()` були змінені на належні методи співпрограми відповідно до їх документації. Раніше ці методи повертали екземпляри `asyncio.Future`. (Надав Юрій Селіванов у bpo-32327.)

- `asyncio.Server.sockets` тепер повертає копію внутрішнього списку серверних сокетів замість того, щоб повертати його безпосередньо. (Надав Юрій Селіванов у bpo-32662.)

- `Struct.format` тепер є екземпляром `str` замість екземпляра `bytes`. (Надав Віктор Стіннер у bpo-21071.)

- Підрозбірники `argparse` тепер можна зробити обов’язковими, передавши `required=True` у `ArgumentParser.add_subparsers()`. (Надав Ентоні Соттіле в bpo-26510.)

- `ast.literal_eval()` is now stricter. Addition and subtraction of arbitrary numbers are no longer allowed. (Contributed by Serhiy Storchaka in bpo-31778.)

- `Calendar.itermonthdates` тепер постійно створюватиме виняток, якщо дата виходить за межі діапазону `0001-01-01` до `9999-12-31`. Для підтримки програм, які не можуть допускати такі винятки, можна використовувати нові `Calendar.itermonthdays3` і `Calendar.itermonthdays4`. Нові методи повертають кортежі та не обмежені діапазоном, який підтримує `datetime.date`. (Надав Олександр Бєлопольський у bpo-28292.)

- `collections.ChainMap` тепер зберігає порядок базових відображень. (Надав Реймонд Геттінгер у bpo-32792.)

- Метод `submit()` `concurrent.futures.ThreadPoolExecutor` і `concurrent.futures.ProcessPoolExecutor` тепер викликає `RuntimeError`, якщо викликається під час завершення роботи інтерпретатора. (Надав Марк Немек у bpo-33097.)

- Конструктор `configparser.ConfigParser` тепер використовує `read_dict()` для обробки значень за замовчуванням, роблячи його поведінку узгодженою з рештою синтаксичного аналізатора. Нерядкові ключі та значення в словнику за замовчуванням тепер неявно перетворюються на рядки. (Надав Джеймс Токнелл у bpo-23835.)

- Кілька незадокументованих внутрішніх імпортів було вилучено. Одним із прикладів є те, що `os.errno` більше не доступний; натомість використовуйте `import errno` безпосередньо. Зауважте, що такий незадокументований внутрішній імпорт може бути видалено будь-коли без попередження, навіть у випусках мікроверсій.

### Зміни в C API

Функція `PySlice_GetIndicesEx()` вважається небезпечною для послідовностей змінного розміру. Якщо індекси фрагментів не є екземплярами `int`, а об’єктами, які реалізують метод `__index__()`, розмір послідовності можна змінити після передачі її довжини `PySlice_GetIndicesEx()`. Це може призвести до повернення індексів поза довжиною послідовності. Щоб уникнути можливих проблем, використовуйте нові функції `PySlice_Unpack()` і `PySlice_AdjustIndices()`. (Надав Сергій Сторчака в bpo-27867.)

### Зміни байт-коду CPython

There are two new opcodes: `LOAD_METHOD` and `CALL_METHOD`. (Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)

The `STORE_ANNOTATION` opcode has been removed. (Contributed by Mark Shannon in bpo-32550.)

### Зміни лише для Windows

The file used to override `sys.path` is now called `<python-executable>._pth` instead of `'sys.path'`. See Пошук модулів for more information. (Contributed by Steve Dower in bpo-28137.)

### Інші зміни реалізації CPython

Готуючись до потенційних майбутніх змін у загальнодоступному API ініціалізації середовища виконання CPython (перегляньте PEP 432 для початкового, але дещо застарілого чернетки), внутрішню логіку запуску та керування конфігурацією CPython було значно перероблено. Хоча ці оновлення мають бути повністю прозорими як для програм для вбудовування, так і для користувачів звичайного CLI CPython, вони згадуються тут, оскільки рефакторинг змінює внутрішній порядок різних операцій під час запуску інтерпретатора, і, отже, може виявити раніше приховані дефекти, або у програмах для вбудовування або в самому CPython. (Спочатку створено Ніком Когланом і Еріком Сноу як частину bpo-22257, а потім оновлено Ніком, Еріком і Віктором Стіннером у ряді інших випусків). Впливають деякі відомі деталі:

- `PySys_AddWarnOptionUnicode()` is not currently usable by embedding applications due to the requirement to create a Unicode object prior to calling `Py_Initialize`. Use `PySys_AddWarnOption()` instead.

- warnings filters added by an embedding application with `PySys_AddWarnOption()` should now more consistently take precedence over the default filters set by the interpreter

Через зміни в способі налаштування фільтрів попереджень за замовчуванням встановлення `Py_BytesWarningFlag` значення, більшого за одиницю, більше не є достатнім для видачі повідомлень `BytesWarning` і їх перетворення на винятки. Натомість потрібно встановити прапорець (щоб спершу видавати попередження) і додати явний фільтр попереджень `error::BytesWarning`, щоб перетворити їх на винятки.

У зв’язку зі зміною способу обробки рядків документації компілятором неявне «повернення None» у тілі функції, що складається виключно з рядка документації, тепер позначається як таке, що міститься в тому самому рядку, що й рядок документації, а не в рядку заголовка функції. .

Поточний винятковий стан було переміщено з об’єкта кадру до спільної процедури. Це спростило інтерпретатор і виправило кілька незрозумілих помилок, спричинених зміною виняткового стану під час входу або виходу з генератора. (Надав Марк Шеннон у bpo-25612.)

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

Починаючи з версії 3.7.1, `Py_Initialize()` тепер узгоджено читає та поважає всі ті самі параметри середовища, що й `Py_Main()` (у попередніх версіях Python він поважав неправильно визначену підмножину цього середовища змінні, тоді як у Python 3.7.0 він не читав жодної з них через bpo-34247). Якщо така поведінка є небажаною, встановіть `Py_IgnoreEnvironmentFlag` на 1 перед викликом `Py_Initialize()`.

У версії 3.7.1 C API для змінних контексту було оновлено для використання покажчиків `PyObject`. Дивіться також bpo-34762.

У версії 3.7.1 модуль `tokenize` тепер неявно видає маркер `NEWLINE`, коли надходить із введенням, яке не має кінцевого нового рядка. Ця поведінка тепер відповідає внутрішнім функціям C tokenizer. (Надав Аммар Аскар у bpo-33899.)

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

У версії 3.7.2 `venv` у Windows більше не копіює оригінальні двійкові файли, а замість них створює сценарії перенаправлення під назвами `python.exe` і `pythonw.exe`. Це вирішує давню проблему, коли всі віртуальні середовища потрібно було оновлювати або створювати заново з кожним оновленням Python. Однак зауважте, що для отримання нових сценаріїв цей випуск все одно потребуватиме відтворення віртуальних середовищ.

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

Через серйозні проблеми безпеки параметр reuse_address `asyncio.loop.create_datagram_endpoint()` більше не підтримується. Це через поведінку опції сокета `SO_REUSEADDR` в UDP. Для отримання додаткової інформації див. документацію для `loop.create_datagram_endpoint()`. (Надано Кайлом Стенлі, Антуаном Пітру та Юрієм Селівановим у bpo-37228.)

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

Earlier Python versions allowed using both `;` and `&` as query parameter separators in `urllib.parse.parse_qs()` and `urllib.parse.parse_qsl()`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with `&` as the default. This change also affects `cgi.parse()` and `cgi.parse_multipart()` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

## Notable changes in Python 3.7.11

A security fix alters the `ftplib.FTP` behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a `trust_server_pasv_ipv4_address` attribute on your FTP instance to `True`. (See gh-87451)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser `urllib.parse()` preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See gh-88048)

## Notable security feature in 3.7.14

Converting between `int` and `str` in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a `ValueError` if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE-2020-10735. This limit can be configured or disabled by environment variable, command line flag, or `sys` APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.