# Що нового в Python 3.9

редактор:

  Łukasz Langa

This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.

Дивись також

PEP 596 - Графік випуску Python 3.9

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

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

- PEP 584, оператори об’єднання додано до `dict`;

- PEP 585, генерики підказок типів у стандартних колекціях;

- PEP 614, послаблені граматичні обмеження для декораторів.

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

- PEP 616, рядкові методи для видалення префіксів і суфіксів.

Нові можливості стандартної бібліотеки:

- PEP 593, гнучка функція та анотації змінних;

- `os.pidfd_open()` додано, що дозволяє керувати процесом без гонок і сигналів.

Покращення перекладача:

- PEP 573, швидкий доступ до стану модуля з методів типів розширення C;

- PEP 617, CPython тепер використовує новий аналізатор на основі PEG;

- ряд вбудованих компонентів Python (діапазон, кортеж, набір, заморожений набір, список, dict) тепер пришвидшено за допомогою PEP 590 vectorcall;

- збір сміття не блокується на відроджених об’єктах;

- a number of Python modules (`_abc`, `audioop`, `_bz2`, `_codecs`, `_contextvars`, `_crypt`, `_functools`, `_json`, `_locale`, `math`, `operator`, `resource`, `time`, `_weakref`) now use multiphase initialization as defined by PEP 489;

- a number of standard library modules (`audioop`, `ast`, `grp`, `_hashlib`, `pwd`, `_posixsubprocess`, `random`, `select`, `struct`, `termios`, `zlib`) are now using the stable ABI defined by PEP 384.

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

- PEP 615, база даних часових поясів IANA тепер присутня в стандартній бібліотеці в модулі `zoneinfo`;

- реалізація топологічного сортування графа тепер доступна в новому модулі `graphlib`.

Зміни в процесі випуску:

- PEP 602, CPython використовує щорічний цикл випуску.

## Вам слід перевірити DeprecationWarning у вашому коді

Коли Python 2.7 ще підтримувався, багато функціональних можливостей Python 3 було збережено для зворотної сумісності з Python 2.7. З припиненням підтримки Python 2 ці рівні зворотної сумісності були видалені або будуть видалені незабаром. Більшість із них видавали попередження `DeprecationWarning` протягом кількох років. Наприклад, використання `collections.Mapping` замість `collections.abc.Mapping` видає `DeprecationWarning`, починаючи з Python 3.3, випущеного в 2012 році.

Перевірте свою програму за допомогою параметра командного рядка `-W` `default`, щоб побачити `DeprecationWarning` і `PendingDeprecationWarning`, або навіть за допомогою `-W` `error` розглядати їх як помилки. Фільтр попереджень можна використовувати для ігнорування попереджень від стороннього коду.

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

Псевдоніми Abstract Base Classes в модулі `collections`, як-от псевдонім `collections.Mapping` для `collections.abc.Mapping`, зберігаються для останнього випуску для повернення сумісність. Їх буде видалено з Python 3.10.

Загалом, спробуйте запустити свої тести в режимі Python Development Mode, який допоможе підготувати ваш код до сумісності з наступною версією Python.

Примітка: у цій версії Python також було видалено низку існуючих застарілих програм. Зверніться до розділу Видалено.

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

### Оператори злиття та оновлення словника

До вбудованого класу `dict` додано оператори Merge (`|`) і Update (`|=`). Вони доповнюють існуючі методи об’єднання словників `dict.update` і `{**d1, **d2}`.

Приклад:

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}
    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

Дивіться PEP 584 для повного опису. (Надав Брандт Бухер у bpo-36144.)

### Нові рядкові методи для видалення префіксів і суфіксів

Додано `str.removeprefix(prefix)` і `str.removesuffix(suffix)`, щоб легко видалити непотрібний префікс або суфікс із рядка. Також додано відповідні методи `bytes`, `bytearray` і `collections.UserString`. Дивіться PEP 616 для повного опису. (Надав Денніс Суїні в bpo-39939.)

### Універсальні підказки типів у стандартних колекціях

В анотаціях типів тепер можна використовувати вбудовані типи колекцій, такі як `list` і `dict`, як загальні типи замість імпорту відповідних типів, написаних великими літерами (наприклад, `List` або `Dict`) із `введення`. Деякі інші типи стандартної бібліотеки також тепер є загальними, наприклад `queue.Queue`.

приклад:

    def greet_all(names: list[str]) -> None:
        for name in names:
            print("Hello", name)

Дивіться PEP 585 для більш детальної інформації. (Надано Гвідо ван Россумом, Ітаном Смітом і Батуханом Ташкаєю в bpo-39481.)

### Новий парсер

Python 3.9 використовує новий аналізатор на основі PEG замість LL(1). Продуктивність нового синтаксичного аналізатора приблизно порівнянна з продуктивністю старого парсера, але формалізм PEG є більш гнучким, ніж LL(1), коли справа доходить до розробки нових функцій мови. Ми почнемо використовувати цю гнучкість у Python 3.10 і пізніших версіях.

Модуль `ast` використовує новий аналізатор і створює той самий AST, що й старий аналізатор.

In Python 3.10, the old parser will be deleted and so will all functionality that depends on it (primarily the `parser` module, which has long been deprecated). In Python 3.9 only, you can switch back to the LL(1) parser using a command line switch (`-X oldparser`) or an environment variable (`PYTHONOLDPARSER=1`).

Дивіться PEP 617 для більш детальної інформації. (Надано Гвідо ван Россумом, Пабло Галіндо та Лісандросом Ніколау в bpo-40334.)

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

- `__import__()` тепер викликає `ImportError` замість `ValueError`, який раніше траплявся, коли відносний імпорт проходив поза пакетом верхнього рівня. (Надав Нгалім Сірегар у bpo-37444.)

- Тепер Python отримує абсолютний шлях до імені файлу сценарію, указаного в командному рядку (наприклад: `python3 script.py`): атрибут `__file__` модуля `__main__` став абсолютним шляхом, а не ніж відносний шлях. Тепер ці шляхи залишаються дійсними після того, як поточний каталог змінено `os.chdir()`. Як побічний ефект, у цьому випадку трасування також відображає абсолютний шлях для фреймів модуля `__main__`. (Надав Віктор Стіннер у bpo-20443.)

- У режимі Python Development Mode і в debug build, аргументи encoding і errors тепер перевіряються на наявність операцій кодування та декодування рядків. Приклади: `open()`, `str.encode()` і `bytes.decode()`.

  За замовчуванням для найкращої продуктивності аргумент errors перевіряється лише при першій помилці кодування/декодування, а аргумент encoding іноді ігнорується для порожніх рядків. (Надав Віктор Стіннер у bpo-37388.)

- `"".replace("", s, n)` тепер повертає `s` замість порожнього рядка для всіх ненульових `n`. Тепер це сумісно з `"".replace("", s)`. Існують подібні зміни для об’єктів `bytes` і `bytearray`. (Надав Сергій Сторчака в bpo-28029.)

- Будь-який дійсний вираз тепер можна використовувати як decorator. Раніше граматика була набагато жорсткішою. Подробиці див. PEP 614. (Надав Брандт Бухер у bpo-39702.)

- Покращена довідка для модуля `typing`. Рядки документів тепер відображаються для всіх спеціальних форм і спеціальних загальних псевдонімів (наприклад, `Union` і `List`). Використання `help()` із загальним псевдонімом, таким як `List[int]`, покаже довідку для відповідного конкретного типу (`list` у цьому випадку). (Надав Сергій Сторчака в bpo-40257.)

- Паралельний запуск `aclose()` / `asend()` / `athrow()` тепер заборонено, а `ag_running` тепер відображає фактичний статус роботи асинхронний генератор. (Надав Юрій Селіванов у bpo-30773.)

- Неочікувані помилки під час виклику методу `__iter__` більше не маскуються `TypeError` в операторі `in` і функціях `contains()`, `indexOf()` і `countOf()` модуля `operator`. (Надав Сергій Сторчака в bpo-40824.)

- Лямбда-вирази без круглих дужок більше не можуть бути частиною виразу в реченні `if` у виразах розуміння та генераторі. Дивіться bpo-41848 і bpo-43755 для отримання додаткової інформації.

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

### зонаінфо

Модуль `zoneinfo` забезпечує підтримку бази даних часових поясів IANA до стандартної бібліотеки. Він додає `zoneinfo.ZoneInfo`, конкретну реалізацію `datetime.tzinfo`, яка підтримується даними про часовий пояс системи.

Приклад:

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta

    >>> # Daylight saving time
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00
    >>> dt.tzname()
    'PDT'

    >>> # Standard time
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00
    >>> print(dt.tzname())
    PST

As a fall-back source of data for platforms that don’t ship the IANA database, the tzdata module was released as a first-party package – distributed via PyPI and maintained by the CPython core team.

Дивись також

PEP 615 – Підтримка бази даних часових поясів IANA в стандартній бібліотеці

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

### graphlib

Було додано новий модуль `graphlib`, який містить клас `graphlib.TopologicalSorter`, який пропонує функції для виконання топологічного сортування графів. (Надано Пабло Галіндо, Тімом Пітерсом і Ларрі Гастінгсом у bpo-17005.)

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

### аст

Додано опцію indent до `dump()`, яка дозволяє створювати багаторядковий вивід із відступом. (Надав Сергій Сторчака в bpo-37995.)

Додано `ast.unparse()` як функцію в модулі `ast`, яку можна використовувати для розбору об’єкта `ast.AST` і створення рядка з кодом, який створить еквівалентний `ast.AST` об’єкт під час аналізу. (Надано Пабло Галіндо та Батуханом Таською в bpo-38870.)

До вузлів AST додано рядки документів, які містять підпис ASDL, використаний для створення цього вузла. (Надано Batuhan Taskaya в bpo-39638.)

### asyncio

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

Додано новий coroutine `shutdown_default_executor()`, який планує завершення роботи для виконавця за замовчуванням, який очікує завершення закриття `ThreadPoolExecutor`. Крім того, `asyncio.run()` було оновлено, щоб використовувати нову coroutine. (Надав Кайл Стенлі в bpo-34037.)

Added `asyncio.PidfdChildWatcher`, a Linux-specific child watcher implementation that polls process file descriptors. (bpo-38692)

Додано нову coroutine `asyncio.to_thread()`. Він в основному використовується для запуску функцій, пов’язаних із введенням-виведенням, в окремому потоці, щоб уникнути блокування циклу подій, і, по суті, працює як високорівнева версія `run_in_executor()`, яка може безпосередньо приймати ключові аргументи. (Надано Кайлом Стенлі та Юрієм Селівановим у bpo-32309.)

Під час скасування завдання через тайм-аут `asyncio.wait_for()` тепер чекатиме до завершення скасування також у випадку, коли timeout <= 0, як це відбувається з позитивними тайм-аутами. (Надав Елвіс Пранскявічус у bpo-32751.)

`asyncio` now raises `TypeError` when calling incompatible methods with an `ssl.SSLSocket` socket. (Contributed by Ido Michael in bpo-37404.)

### compileall

Додано нову можливість використовувати жорсткі посилання для дубльованих файлів `.pyc`: параметр hardlink_dupes і параметр командного рядка –hardlink-dupes. (Надав Lumír „Frenzy“ Balhar у bpo-40495.)

Додано нові параметри для маніпулювання шляхом у кінцевих файлах `.pyc`: параметри stripdir, prependdir, limit_sl_dest і параметри командного рядка -s, -p, -e. Додана можливість багаторазово вказувати опцію для рівня оптимізації. (Надав Lumír „Frenzy“ Balhar у bpo-38112.)

### concurrent.futures

Додано новий параметр cancel_futures до `concurrent.futures.Executor.shutdown()`, який скасовує всі незавершені ф’ючерси, які ще не почали виконуватися, замість того, щоб чекати їх завершення перед вимкненням виконавця. (Надав Кайл Стенлі в bpo-39349.)

Видалено потоки демона з `ThreadPoolExecutor` і `ProcessPoolExecutor`. Це покращує сумісність із субінтерпретаторами та передбачуваність процесів їх завершення. (Надав Кайл Стенлі в bpo-39812.)

Воркери в `ProcessPoolExecutor` тепер створюються на вимогу, лише коли немає доступних неактивних робочих елементів для повторного використання. Це оптимізує накладні витрати на запуск і зменшує кількість втраченого процесорного часу для простою працівників. (Надав Кайл Стенлі в bpo-39207.)

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

Додано функції `curses.get_escdelay()`, `curses.set_escdelay()`, `curses.get_tabsize()` і `curses.set_tabsize()`. (Надав Ентоні Соттіле в bpo-38312.)

### дата, час

The `isocalendar()` of `datetime.date` and `isocalendar()` of `datetime.datetime` methods now returns a `namedtuple()` instead of a `tuple`. (Contributed by Donghee Na in bpo-24416.)

### distutils

Команда upload тепер створює хеш-дайджести SHA2-256 і Blake2b-256. Він пропускає MD5 на платформах, які блокують дайджест MD5. (Надав Крістіан Хеймс у bpo-40698.)

### fcntl

Added constants `fcntl.F_OFD_GETLK`, `fcntl.F_OFD_SETLK` and `fcntl.F_OFD_SETLKW`. (Contributed by Donghee Na in bpo-38602.)

### ftplib

`FTP` and `FTP_TLS` now raise a `ValueError` if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

### gc

Коли збирач сміття створює колекцію, у якій деякі об’єкти відроджуються (вони доступні поза ізольованими циклами після виконання фіналізаторів), не блокуйте колекцію всіх об’єктів, які все ще недоступні. (Надано Пабло Галіндо та Тімом Пітерсом у bpo-38379.)

Додано нову функцію `gc.is_finalized()`, щоб перевірити, чи завершив об’єкт збирач сміття. (Надав Пабло Галіндо в bpo-39322.)

### хешліб

Модуль `hashlib` тепер може використовувати хеші SHA3 і SHAKE XOF з OpenSSL, якщо вони доступні. (Надав Крістіан Хеймс у bpo-37630.)

Вбудовані хеш-модулі тепер можна вимкнути за допомогою `./configure --without-builtin-hashlib-hashes` або вибірково ввімкнути за допомогою, наприклад, `./configure --with-builtin-hashlib-hashes=sha3,blake2`, щоб примусово використовувати реалізацію на основі OpenSSL. (Надав Крістіан Хеймс у bpo-40479)

### http

HTTP status codes `103 EARLY_HINTS`, `418 IM_A_TEAPOT` and `425 TOO_EARLY` are added to `http.HTTPStatus`. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)

### IDLE і idlelib

Додана опція для вимкнення блимання курсору. (Надав Закері Шпітц у bpo-4603.)

Клавіша Escape тепер закриває вікна завершення IDLE. (Надав Джонні Наджера в bpo-38944.)

Додано ключові слова до списку завершення імен модуля. (Надано Террі Дж. Ріді в bpo-37765.)

Нове у випусках обслуговування 3.9

Зробити IDLE викликом `sys.excepthook()` (якщо запускається без „-n“). Хуки користувача раніше ігнорувалися. (Надав Кен Хілтон у bpo-43008.)

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

Перевпорядкування діалогового вікна налаштувань. Розділіть вкладку Загальні на вкладки Windows і Shell/Ed. Перемістіть джерела довідки, які розширюють меню «Довідка», на вкладку «Розширення». Звільніть місце для нових параметрів і скоротіть діалогове вікно. Останнє робить діалог краще адаптованим до маленьких екранів. (Надано Террі Джаном Ріді в bpo-40468.) Перемістіть налаштування відступу з вкладки «Шрифт» на нову вкладку Windows. (Надано Марком Розманом і Террі Джен Ріді в bpo-33962.)

Apply syntax highlighting to `.pyi` files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)

### імапліб

`IMAP4` and `IMAP4_SSL` now have an optional timeout parameter for their constructors. Also, the `open()` method now has an optional timeout parameter with this change. The overridden methods of `IMAP4_SSL` and `IMAP4_stream` were applied to this change. (Contributed by Donghee Na in bpo-38615.)

`imaplib.IMAP4.unselect()` is added. `imaplib.IMAP4.unselect()` frees server’s resources associated with the selected mailbox and returns the server to the authenticated state. This command performs the same actions as `imaplib.IMAP4.close()`, except that no messages are permanently removed from the currently selected mailbox. (Contributed by Donghee Na in bpo-40375.)

### importlib

Щоб покращити узгодженість із операторами імпорту, `importlib.util.resolve_name()` тепер викликає `ImportError` замість `ValueError` для недійсних відносних спроб імпорту. (Надав Нгалім Сірегар у bpo-37444.)

Завантажувачі імпорту, які публікують незмінні об’єкти модулів, тепер можуть публікувати незмінні пакети на додаток до окремих модулів. (Надав Діно Віланд у bpo-39336.)

Додано функцію `importlib.resources.files()` із підтримкою підкаталогів у даних пакетів, що відповідає бекпорту в `importlib_resources` версії 1.5. (Надав Джейсон Р. Кумбс у bpo-39791.)

Оновлено `importlib.metadata` з `importlib_metadata` версії 1.6.1.

### оглядати

`inspect.BoundArguments.arguments` змінено з `OrderedDict` на звичайний dict. (Надано Інадою Наокі в bpo-36350 і bpo-39775.)

### IP-адреса

`ipaddress` тепер підтримує IPv6 Scoped Addresses (адреса IPv6 із суфіксом `% <scope_id>`).

Адреси IPv6 із областю дії можна проаналізувати за допомогою `ipaddress.IPv6Address`. Якщо присутній, ідентифікатор зони дії доступний через атрибут `scope_id`. (Надав Олександр Павлюк у bpo-34788.)

Починаючи з Python 3.9.5, модуль `ipaddress` більше не приймає жодних початкових нулів у рядках адрес IPv4. (Надав Крістіан Хеймс у bpo-36384).

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

Розширено функцію `math.gcd()` для обробки кількох аргументів. Раніше він підтримував лише два аргументи. (Надав Сергій Сторчака в bpo-39648.)

Додано `math.lcm()`: повертає найменше спільне кратне вказаних аргументів. (Надано Марком Дікінсоном, Анантакрішнаном і Сергієм Сторчакою в bpo-39479 і bpo-39648.)

Додано `math.nextafter()`: повертає наступне значення з плаваючою комою після x до y. (Надав Віктор Стіннер у bpo-39288.)

Додано `math.ulp()`: повертає значення молодшого біта числа з плаваючою точкою. (Надав Віктор Стіннер у bpo-39310.)

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

Клас `multiprocessing.SimpleQueue` має новий метод `close()` для явного закриття черги. (Надав Віктор Стіннер у bpo-30966.)

### nntplib

`NNTP` and `NNTP_SSL` now raise a `ValueError` if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

### ос

Added `CLD_KILLED` and `CLD_STOPPED` for `si_code`. (Contributed by Donghee Na in bpo-38493.)

Exposed the Linux-specific `os.pidfd_open()` (bpo-38692) and `os.P_PIDFD` (bpo-38713) for process management with file descriptors.

Функція `os.unsetenv()` тепер також доступна в Windows. (Надав Віктор Стіннер у bpo-39413.)

Функції `os.putenv()` і `os.unsetenv()` тепер завжди доступні. (Надав Віктор Стіннер у bpo-39395.)

Додано функцію `os.waitstatus_to_exitcode()`: перетворює стан очікування на код виходу. (Надав Віктор Стіннер у bpo-40094.)

### pathlib

Added `pathlib.Path.readlink()` which acts similarly to `os.readlink()`. (Contributed by Girts Folkmanis in bpo-30618)

### pdb

У Windows тепер `Pdb` підтримує `~/.pdbrc`. (Надано Тімом Хоппером і Деном Лідралом-Портером у bpo-20523.)

### попліб

`POP3` and `POP3_SSL` now raise a `ValueError` if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

### pprint

`pprint` тепер може красиво друкувати `types.SimpleNamespace`. (Надав Карл Бордум Хансен у bpo-37376.)

### pydoc

The documentation string is now shown not only for class, function, method etc, but for any object that has its own `__doc__` attribute. (Contributed by Serhiy Storchaka in bpo-40257.)

### випадковий

Added a new `random.Random.randbytes()` method: generate random bytes. (Contributed by Victor Stinner in bpo-40286.)

### сигнал

Розкритий специфічний для Linux `signal.pidfd_send_signal()` для надсилання сигналів до процесу за допомогою файлового дескриптора замість pid. (bpo-38712)

### smtplib

`SMTP` and `SMTP_SSL` now raise a `ValueError` if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

`LMTP` constructor now has an optional timeout parameter. (Contributed by Donghee Na in bpo-39329.)

### гніздо

The `socket` module now exports the `CAN_RAW_JOIN_FILTERS` constant on Linux 4.1 and greater. (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)

The socket module now supports the `CAN_J1939` protocol on platforms that support it. (Contributed by Karl Ding in bpo-40291.)

Модуль сокета тепер має функції `socket.send_fds()` і `socket.recv_fds()`. (Надано Joannah Nanjekye, Shinya Okano та Victor Stinner у bpo-28724.)

### час

On AIX, `thread_time()` is now implemented with `thread_cputime()` which has nanosecond resolution, rather than `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` which has a resolution of 10 milliseconds. (Contributed by Batuhan Taskaya in bpo-40192)

### система

Added a new `sys.platlibdir` attribute: name of the platform-specific library directory. It is used to build the path of standard library and the paths of installed extension modules. It is equal to `"lib"` on most platforms. On Fedora and SuSE, it is equal to `"lib64"` on 64-bit platforms. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

Previously, `sys.stderr` was block-buffered when non-interactive. Now `stderr` defaults to always being line-buffered. (Contributed by Jendrik Seipp in bpo-13601.)

### tracemalloc

Додано `tracemalloc.reset_peak()` для встановлення максимального розміру відстежуваних блоків пам’яті на поточний розмір, щоб виміряти пік певних фрагментів коду. (Надав Хуон Вілсон у bpo-40630.)

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

PEP 593 представив тип `typing.Annotated`, щоб прикрасити існуючі типи контекстно-залежними метаданими та новий параметр `include_extras` для `typing.get_type_hints()` для доступу до метаданих під час виконання. (Надано Тіллем Варокво та Костянтином Кашиним.)

### unicodedata

Базу даних Unicode оновлено до версії 13.0.0. (bpo-39926).

### venv

Усі сценарії активації, надані `venv`, тепер узгоджено вказують налаштування підказок, завжди використовуючи значення, визначене `__VENV_PROMPT__`. Раніше деякі сценарії беззастережно використовували `__VENV_PROMPT__`, інші, лише якщо його було встановлено (що було випадком за замовчуванням), а один замість цього використовував `__VENV_NAME__`. (Надано Бреттом Кенноном у bpo-37663.)

### xml

Пробіли в атрибутах тепер зберігаються під час серіалізації `xml.etree.ElementTree` у файл XML. EOLN більше не нормалізуються до «n». Це результат обговорення того, як інтерпретувати розділ 2.11 специфікації XML. (Надано Mefistotelis у bpo-39011.)

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

- Оптимізовано ідіому для призначення тимчасової змінної в розумінні. Тепер `для y в [expr]` в розуміннях так само швидко, як просте присвоєння `y = expr`. Наприклад:

  > суми = [s для s у [0] для x у даних для s у [s + x]]

  На відміну від оператора `:=`, ця ідіома не пропускає змінну до зовнішньої області.

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

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

  Раніше цикл оцінки байт-коду переривався на кожній інструкції, доки основний потік не обробить сигнали. (Надав Віктор Стіннер у bpo-40010.)

- Оптимізовано модуль `subprocess` у FreeBSD за допомогою `closefrom()`. (Надано Едом Масте, Конрадом Майєром, Кайлом Евансом, Кубілаєм Коцаком і Віктором Стіннером у bpo-38061.)

- `PyLong_FromDouble()` is now up to 1.87x faster for values that fit into long. (Contributed by Sergey Fedoseev in bpo-37986.)

- A number of Python builtins (`range`, `tuple`, `set`, `frozenset`, `list`, `dict`) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)

- Optimized `set.difference_update()` for the case when the other set is much larger than the base set. (Suggested by Evgeny Kapun with code contributed by Michele Orrù in bpo-8425.)

- Розподіл малих об’єктів Python (`obmalloc.c`) тепер дозволяє (не більше) одній порожній арені залишатися доступною для негайного повторного використання без повернення її в ОС. Це запобігає трішу в простих циклах, де арена може бути створена та знищена заново на кожній ітерації. (Надав Тім Пітерс у bpo-37257.)

- floor division of float operation now has a better performance. Also the message of `ZeroDivisionError` for this operation is updated. (Contributed by Donghee Na in bpo-39434.)

- Декодування коротких рядків ASCII за допомогою кодеків UTF-8 і ascii тепер приблизно на 15% швидше. (Надано Інадою Наокі в bpo-37348.)

Ось підсумок покращень продуктивності від Python 3.4 до Python 3.9:

    Python version                       3.4     3.5     3.6     3.7     3.8    3.9
    --------------                       ---     ---     ---     ---     ---    ---

    Variable and attribute read access:
        read_local                       7.1     7.1     5.4     5.1     3.9    3.9
        read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
        read_global                     15.5    19.0    14.3    13.6     7.6    7.8
        read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
        read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
        read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
        read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
        read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
        read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
        read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

    Variable and attribute write access:
        write_local                      8.7     9.3     5.5     5.3     4.3    4.3
        write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
        write_global                    19.7    21.2    18.0    18.0    15.8   16.7
        write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
        write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
        write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

    Data structure read access:
        read_list                       24.2    24.5    20.8    20.8    19.0   19.5
        read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
        read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
        read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

    Data structure write access:
        write_list                      27.1    28.5    22.5    21.6    20.0   20.0
        write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
        write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
        write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

    Stack (or queue) operations:
        list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
        deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
        deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

    Timing loop:
        loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

These results were generated from the variable access benchmark script at: `Tools/scripts/var_access_benchmark.py`. The benchmark script displays timings in nanoseconds. The benchmarks were measured on an Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found at python.org.

## Застаріле

- Команда distutils `bdist_msi` тепер застаріла, замість неї використовуйте `bdist_wheel` (пакети колеса). (Надав Хуго ван Кеменаде в bpo-39586.)

- Наразі `math.factorial()` приймає екземпляри `float` із невід’ємними цілими значеннями (наприклад, `5.0`). Він викликає помилку `ValueError` для нецілісних і від’ємних чисел з плаваючою точкою. Зараз це застаріле. У майбутніх версіях Python він викличе `TypeError` для всіх плаваючих значень. (Надав Сергій Сторчака в bpo-37315.)

- The `parser` and `symbol` modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the `ast` module.

- The Public C API functions `PyParser_SimpleParseStringFlags()`, `PyParser_SimpleParseStringFlagsFilename()`, `PyParser_SimpleParseFileFlags()` and `PyNode_Compile()` are deprecated and will be removed in Python 3.10 together with the old parser.

- Використання `NotImplemented` у логічному контексті застаріло, оскільки це майже виключно результат неправильних реалізацій багатого компаратора. У майбутній версії Python це буде зроблено як `TypeError`. (Надав Джош Розенберг у bpo-35712.)

- Модуль `random` наразі приймає будь-який хешований тип як можливе початкове значення. На жаль, деякі з цих типів не гарантовано матимуть детерміноване хеш-значення. Після Python 3.9 модуль обмежуватиме початкові значення до `None`, `int`, `float`, `str`, `bytes` і `bytearray`.

- Відкриття файлу `GzipFile` для запису без вказівки аргументу mode застаріло. У наступних версіях Python він завжди буде відкритий для читання за умовчанням. Укажіть аргумент mode, щоб відкрити його для запису та вимкнення попередження. (Надав Сергій Сторчака в bpo-28286.)

- Deprecated the `split()` method of `_tkinter.TkappType` in favour of the `splitlist()` method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)

- Явне передавання об’єктів співпрограми до `asyncio.wait()` застаріло та буде видалено у версії 3.11. (Надано Юрієм Селівановим і Кайлом Стенлі в bpo-34790.)

- binhex4 and hexbin4 standards are now deprecated. The `binhex` module and the following `binascii` functions are now deprecated:

  - `b2a_hqx()`, `a2b_hqx()`

  - `rlecode_hqx()`, `rledecode_hqx()`

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

- `ast` класи `slice`, `Index` і `ExtSlice` вважаються застарілими та будуть видалені в майбутніх версіях Python. Саме `значення` слід використовувати замість `Індекс(значення)`. `Tuple(slices, Load())` слід використовувати замість `ExtSlice(slices)`. (Надав Сергій Сторчака в bpo-34822.)

- `ast` класи `Suite`, `Param`, `AugLoad` і `AugStore` вважаються застарілими та будуть видалені в майбутніх версіях Python. Вони не були згенеровані парсером і не прийняті генератором коду в Python 3. (Надано Batuhan Taskaya в bpo-39639 і bpo-39969 та Сергій Сторчака в bpo-39988.)

- The `PyEval_InitThreads()` and `PyEval_ThreadsInitialized()` functions are now deprecated and will be removed in Python 3.11. Calling `PyEval_InitThreads()` now does nothing. The GIL is initialized by `Py_Initialize()` since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)

- Передача `None` як першого аргументу функції `shlex.split()` застаріла. (Надав Закері Шпітц у bpo-33262.)

- `smtpd.MailmanProxy()` is now deprecated as it is unusable without an external module, `mailman`. (Contributed by Samuel Colvin in bpo-35800.)

- The `lib2to3` module now emits a `PendingDeprecationWarning`. Python 3.9 switched to a PEG parser (see PEP 617), and Python 3.10 may include new language syntax that is not parsable by lib2to3’s LL(1) parser. The `lib2to3` module may be removed from the standard library in a future Python version. Consider third-party alternatives such as LibCST or parso. (Contributed by Carl Meyer in bpo-40360.)

- Параметр random `random.shuffle()` застарів. (Надав Реймонд Геттінгер у bpo-40465)

## Видалено

- The erroneous version at `unittest.mock.__version__` has been removed.

- `nntplib.NNTP`: `xpath()` and `xgtitle()` methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. For `xgtitle()`, please use `nntplib.NNTP.descriptions()` or `nntplib.NNTP.description()` instead. (Contributed by Donghee Na in bpo-39366.)

- `array.array`: методи `tostring()` та `fromstring()` видалено. Це були псевдоніми для `tobytes()` і `frombytes()`, застарілих з Python 3.2. (Надав Віктор Стіннер у bpo-38916.)

- Недокументовану функцію `sys.callstats()` було видалено. Починаючи з Python 3.7, він був застарілим і завжди повертав `None`. Для цього потрібен був спеціальний параметр збірки `CALL_PROFILE`, який уже було видалено в Python 3.7. (Надав Віктор Стіннер у bpo-37414.)

- Функції `sys.getcheckinterval()` і `sys.setcheckinterval()` були видалені. Вони застаріли з Python 3.2. Замість цього використовуйте `sys.getswitchinterval()` і `sys.setswitchinterval()`. (Надав Віктор Стіннер у bpo-37392.)

- Функцію C `PyImport_Cleanup()` видалено. Це було задокументовано як: «Очистити таблицю модулів. Тільки для внутрішнього використання». (Надав Віктор Стіннер у bpo-36710.)

- Модулі `_dummy_thread` і `dummy_threading` видалено. Ці модулі застаріли з Python 3.7, який потребує підтримки потоків. (Надав Віктор Стіннер у bpo-37312.)

- `aifc.openfp()` alias to `aifc.open()`, `sunau.openfp()` alias to `sunau.open()`, and `wave.openfp()` alias to `wave.open()` have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)

- The `isAlive()` method of `threading.Thread` has been removed. It was deprecated since Python 3.8. Use `is_alive()` instead. (Contributed by Donghee Na in bpo-37804.)

- Методи `getchildren()` і `getiterator()` класів `ElementTree` і `Element` в Модуль `ElementTree` видалено. Вони були застарілі в Python 3.2. Використовуйте `iter(x)` або `list(x)` замість `x.getchildren()` та `x.iter()` або `list(x.iter())` замість `x.getiterator()`. (Надав Сергій Сторчака в bpo-36543.)

- Старий API `plistlib` було видалено, він застарів з Python 3.4. Використовуйте функції `load()`, `loads()`, `dump()` і `dumps()`. Крім того, було видалено параметр use_builtin_types, замість нього завжди використовуються стандартні об’єкти `bytes`. (Надав Джон Янзен у bpo-36409.)

- Функцію C `PyGen_NeedsFinalizing` видалено. Він не був задокументований, протестований або використаний будь-де в CPython після впровадження PEP 442. Патч від Joannah Nanjekye. (Надано Joannah Nanjekye в bpo-15088)

- `base64.encodestring()` і `base64.decodestring()`, псевдоніми, які застаріли з Python 3.1, були видалені: замість них використовуйте `base64.encodebytes()` і `base64.decodebytes()`. (Надав Віктор Стіннер у bpo-39351.)

- Функцію `fractions.gcd()` видалено, вона застаріла з Python 3.5 (bpo-22486): замість неї використовуйте `math.gcd()`. (Надав Віктор Стіннер у bpo-39350.)

- Параметр buffering `bz2.BZ2File` було видалено. Починаючи з Python 3.0, він ігнорувався, і його використання видавало `DeprecationWarning`. Передайте відкритий файловий об’єкт, щоб контролювати, як відкривається файл. (Надав Віктор Стіннер у bpo-39357.)

- Параметр encoding `json.loads()` видалено. Починаючи з Python 3.1, він був застарілим і ігнорувався; його використання видавало `DeprecationWarning`, починаючи з Python 3.8. (Надано Інадою Наокі в bpo-39377)

- Оператори `with (чекати asyncio.lock):` і `with (вихід від asyncio.lock):` більше не підтримуються, використовуйте замість них `async with lock`. Те саме правильно для `asyncio.Condition` і `asyncio.Semaphore`. (Надав Ендрю Свєтлов у bpo-34793.)

- The `sys.getcounts()` function, the `-X showalloccount` command line option and the `show_alloc_count` field of the C structure `PyConfig` have been removed. They required a special Python build by defining `COUNT_ALLOCS` macro. (Contributed by Victor Stinner in bpo-39489.)

- Атрибут `_field_types` класу `typing.NamedTuple` було видалено. Він був застарілим, починаючи з Python 3.8. Натомість використовуйте атрибут `__annotations__`. (Надав Сергій Сторчака в bpo-40182.)

- The `symtable.SymbolTable.has_exec()` method has been removed. It was deprecated since 2006, and only returning `False` when it’s called. (Contributed by Batuhan Taskaya in bpo-40208)

- The `asyncio.Task.current_task()` and `asyncio.Task.all_tasks()` have been removed. They were deprecated since Python 3.7 and you can use `asyncio.current_task()` and `asyncio.all_tasks()` instead. (Contributed by Rémi Lapeyre in bpo-40967)

- Метод `unescape()` у класі `html.parser.HTMLParser` було видалено (він був застарілим з Python 3.4). `html.unescape()` слід використовувати для перетворення посилань на символи у відповідні символи Unicode.

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

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

### Зміни в API Python

- `__import__()` і `importlib.util.resolve_name()` тепер викликають `ImportError` там, де раніше викликали `ValueError`. Викликачі, які перехоплюють певний тип винятку та підтримують як Python 3.9, так і попередні версії, повинні будуть перехопити обидва за допомогою `except (ImportError, ValueError):`.

- Скрипти активації `venv` більше не виключають особливий випадок, коли для `__VENV_PROMPT__` встановлено значення `""`.

- The `select.epoll.unregister()` method no longer ignores the `EBADF` error. (Contributed by Victor Stinner in bpo-39239.)

- Параметр compresslevel `bz2.BZ2File` став лише ключовим словом, оскільки параметр buffering було видалено. (Надав Віктор Стіннер у bpo-39357.)

- Спрощений AST для підписки. Прості індекси будуть представлені їх значеннями, розширені зрізи будуть представлені як кортежі. `Index(value)` поверне саме `value`, `ExtSlice(slices)` поверне `Tuple(slices, Load())`. (Надав Сергій Сторчака в bpo-34822.)

- Модуль `importlib` тепер ігнорує змінну середовища `PYTHONCASEOK`, коли використовуються параметри командного рядка `-E` або `-I`.

- Параметр encoding додано до класів `ftplib.FTP` і `ftplib.FTP_TLS` як параметр лише для ключового слова, а стандартне кодування змінено з Latin-1 на UTF-8 на слідувати RFC 2640.

- `asyncio.loop.shutdown_default_executor()` додано до `AbstractEventLoop`, тобто альтернативні цикли подій, які успадковуються від нього, повинні мати цей метод. (Надав Кайл Стенлі в bpo-34037.)

- Постійні значення майбутніх прапорів у модулі `__future__` оновлюються, щоб запобігти зіткненню з прапорами компілятора. Раніше `PyCF_ALLOW_TOP_LEVEL_AWAIT` конфліктував з `CO_FUTURE_DIVISION`. (Надав Batuhan Taskaya в bpo-39562)

- `array('u')` now uses `wchar_t` as C type instead of `Py_UNICODE`. This change doesn’t affect to its behavior because `Py_UNICODE` is alias of `wchar_t` since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)

- `logging.getLogger()` API тепер повертає кореневий реєстратор, коли йому передається ім’я `'root'`, тоді як раніше він повертав некореневий реєстратор під назвою `'root'`. Це може вплинути на випадки, коли код користувача явно бажає мати некореневий реєстратор під назвою `'root'` або створює екземпляр реєстратора за допомогою `logging.getLogger(__name__)` в якомусь модулі верхнього рівня під назвою `'root. py''`. (Надав Віней Саджип у bpo-37742.)

- Division handling of `PurePath` now returns `NotImplemented` instead of raising a `TypeError` when passed something other than an instance of `str` or `PurePath`. This allows creating compatible classes that don’t inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).

- Починаючи з Python 3.9.5, модуль `ipaddress` більше не приймає жодних початкових нулів у рядках адрес IPv4. Початкові нулі є неоднозначними та інтерпретуються деякими бібліотеками як вісімкове позначення. Наприклад, застаріла функція `socket.inet_aton()` розглядає початкові нулі як вісімкове позначення. glibc реалізація сучасного `inet_pton()` не приймає жодних початкових нулів. (Надав Крістіан Хеймс у bpo-36384).

- `codecs.lookup()` тепер нормалізує назву кодування так само, як `encodings.normalize_encoding()`, за винятком того, що `codecs.lookup()` також перетворює назву на нижній регістр. Наприклад, назву кодування `"latex+latin1"` тепер нормалізовано до `"latex_latin1"`. (Надав Джордон Сю в bpo-37751.)

### Зміни в C API

- Екземпляри виділених у купі типів (наприклад, створених за допомогою `PyType_FromSpec()` та подібних API) містять посилання на свій об’єкт типу, починаючи з Python 3.8. Як зазначено в розділі «Зміни в API C» Python 3.8, у переважній більшості випадків побічних ефектів не повинно бути, але для типів, які мають спеціальну функцію `tp_traverse`, переконайтеся, що усі призначені для користувача функції `tp_traverse` типів, виділених у купі, відвідують тип об’єкта.

  > приклад:

  >     int
  >     foo_traverse(PyObject *self, visitproc visit, void *arg)
  >     {
  >     // Rest of the traverse function
  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (Python issue 35810 and 40217)
  >         Py_VISIT(Py_TYPE(self));
  >     #endif
  >     }

  Якщо ваша функція переходу делегує `tp_traverse` свого базового класу (або іншого типу), переконайтеся, що `Py_TYPE(self)` відвідується лише один раз. Зауважте, що очікується, що лише тип купи відвідає тип у `tp_traverse`.

  > Наприклад, якщо ваша функція `tp_traverse` містить:

  >     base->tp_traverse(self, visit, arg)

  > потім додайте:

  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
  >         if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
  >             // a heap type's tp_traverse already visited Py_TYPE(self)
  >         } else {
  >             Py_VISIT(Py_TYPE(self));
  >         }
  >     #else

  (Див. bpo-35810 і bpo-40217 для отримання додаткової інформації.)

- Функції `PyEval_CallObject`, `PyEval_CallFunction`, `PyEval_CallMethod` і `PyEval_CallObjectWithKeywords` застаріли. Замість цього використовуйте `PyObject_Call()` та його варіанти. (Детальніше див. у bpo-29548.)

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

- The `LOAD_ASSERTION_ERROR` opcode was added for handling the `assert` statement. Previously, the assert statement would not work correctly if the `AssertionError` exception was being shadowed. (Contributed by Zackery Spytz in bpo-34880.)

- Код операції `COMPARE_OP` було розділено на чотири окремі інструкції:

  - `COMPARE_OP` для насичених порівнянь

  - `IS_OP` для тестів «є» і «не є».

  - `CONTAINS_OP` для тестів «in» і «not in».

  - `JUMP_IF_NOT_EXC_MATCH` для перевірки винятків у операторах „try-except“.

  (Надав Марк Шеннон у bpo-39156.)

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

- Added `--with-platlibdir` option to the `configure` script: name of the platform-specific library directory, stored in the new `sys.platlibdir` attribute. See `sys.platlibdir` attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

- Спеціальний макрос збірки `COUNT_ALLOCS` видалено. (Надав Віктор Стіннер у bpo-39489.)

- On non-Windows platforms, the `setenv()` and `unsetenv()` functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)

- На платформах, відмінних від Windows, створення інсталяторів `bdist_wininst` тепер офіційно не підтримується. (Додаткову інформацію див. bpo-10945.)

- When building Python on macOS from source, `_tkinter` now links with non-system Tcl and Tk frameworks if they are installed in `/Library/Frameworks`, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using `--enable-universalsdk` or `-isysroot`, only the SDK itself is searched. The default behavior can still be overridden with `--with-tcltk-includes` and `--with-tcltk-libs`. (Contributed by Ned Deily in bpo-34956.)

- Тепер Python можна створити для Windows 10 ARM64. (Надав Стів Дауер у bpo-33125.)

- Деякі окремі тести тепер пропускаються, коли використовується `--pgo`. Тести, про які йдеться, значно збільшили час виконання завдання PGO і, ймовірно, не допомогли покращити оптимізацію остаточного виконуваного файлу. Це прискорює завдання приблизно в 15 разів. Запуск повного набору модульних тестів повільний. Ця зміна може призвести до дещо менш оптимізованої збірки, оскільки буде виконано не так багато гілок коду. Якщо ви бажаєте почекати на набагато повільнішу збірку, стару поведінку можна відновити за допомогою `./configure [..] PROFILE_TASK="-m test --pgo-extended"`. Ми не гарантуємо, який набір завдань PGO забезпечує швидшу збірку. Небайдужі користувачі повинні запускати власні релевантні тести, оскільки результати можуть залежати від середовища, робочого навантаження та ланцюга інструментів компілятора. (Додаткову інформацію див. у bpo-36044 і bpo-37707.)

## Зміни C API

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

- PEP 573: Added `PyType_FromModuleAndSpec()` to associate a module with a class; `PyType_GetModule()` and `PyType_GetModuleState()` to retrieve the module and its state; and `PyCMethod` and `METH_METHOD` to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)

- Додано функцію `PyFrame_GetCode()`: отримати код кадру. Додано функцію `PyFrame_GetBack()`: отримати кадр наступного зовнішнього кадру. (Надав Віктор Стіннер у bpo-40421.)

- Додано `PyFrame_GetLineNumber()` до обмеженого C API. (Надав Віктор Стіннер у bpo-40421.)

- Додано функції `PyThreadState_GetInterpreter()` і `PyInterpreterState_Get()` для отримання інтерпретатора. Додано функцію `PyThreadState_GetFrame()` для отримання поточного кадру стану потоку Python. Додано функцію `PyThreadState_GetID()`: отримати унікальний ідентифікатор стану потоку Python. (Надав Віктор Стіннер у bpo-39947.)

- Додано нову загальнодоступну функцію `PyObject_CallNoArgs()` до C API, яка викликає об’єкт Python без аргументів. Це найефективніший спосіб викликати викликаний об’єкт Python без аргументів. (Надав Віктор Стіннер у bpo-37194.)

- Зміни в обмеженому API C (якщо визначено макрос `Py_LIMITED_API`):

  - Надайте `Py_EnterRecursiveCall()` і `Py_LeaveRecursiveCall()` як звичайні функції для обмеженого API. Раніше вони були визначені як макроси, але ці макроси не компілювалися з обмеженим C API, який не може отримати доступ до поля `PyThreadState.recursion_depth` (структура непрозора в обмеженому C API).

  - `PyObject_INIT()` і `PyObject_INIT_VAR()` стають звичайними «непрозорими» функціями для приховування деталей реалізації.

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

- The `PyModule_AddType()` function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)

- До загальнодоступного API додано функції `PyObject_GC_IsTracked()` і `PyObject_GC_IsFinalized()`, щоб дозволити запитувати, чи об’єкти Python зараз відстежуються чи вони вже завершені збирачем сміття відповідно. (Надав Пабло Галіндо Сальгадо в bpo-40241.)

- Added `_PyObject_FunctionStr()` to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)

- Додано `PyObject_CallOneArg()` для виклику об’єкта з одним позиційним аргументом (Патч від Jeroen Demeyer у bpo-37483.)

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

- `PyInterpreterState.eval_frame` ( PEP 523) тепер вимагає нового обов’язкового параметра tstate (`PyThreadState*`). (Надав Віктор Стіннер у bpo-38500.)

- Модулі розширення: `m_traverse`, `m_clear` і `m_free` функції `PyModuleDef` відсутні більше викликається, якщо стан модуля було запитано, але ще не виділено. Це відбувається одразу після створення модуля та перед його виконанням (функція `Py_mod_exec`). Точніше, ці функції не викликаються, якщо `m_size` більше 0 і стан модуля (як повертається `PyModule_GetState()`) є `NULL`.

  Модулі розширення без стану модуля (`m_size <= 0`) не впливають.

- Якщо `Py_AddPendingCall()` викликається в субінтерпретаторі, функція тепер запланована для виклику з субінтерпретатора, а не з основного інтерпретатора. Кожен субінтерпретатор тепер має власний список запланованих викликів. (Надав Віктор Стіннер у bpo-39984.)

- Реєстр Windows більше не використовується для ініціалізації `sys.path`, коли використовується параметр `-E` (якщо `PyConfig.use_environment` має значення `0`). Це важливо під час вбудовування Python у Windows. (Надав Закері Шпітц у bpo-8901.)

- Глобальна змінна `PyStructSequence_UnnamedField` тепер є константою та посилається на постійний рядок. (Надав Сергій Сторчака в bpo-38650.)

- The `PyGC_Head` structure is now opaque. It is only defined in the internal C API (`pycore_gc.h`). (Contributed by Victor Stinner in bpo-40241.)

- The `Py_UNICODE_COPY`, `Py_UNICODE_FILL`, `PyUnicode_WSTR_LENGTH`, `PyUnicode_FromUnicode()`, `PyUnicode_AsUnicode()`, `_PyUnicode_AsUnicode`, and `PyUnicode_AsUnicodeAndSize()` are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)

- Функцію `Py_FatalError()` замінено на макрос, який автоматично записує назву поточної функції, якщо не визначено макрос `Py_LIMITED_API`. (Надав Віктор Стіннер у bpo-39882.)

- Протокол vectorcall тепер вимагає, щоб абонент передавав лише рядки як імена ключових слів. (Додаткову інформацію див. bpo-37540.)

- Деталі реалізації ряду макросів і функцій тепер приховано:

  - `PyObject_IS_GC()` макрос перетворено на функцію.

  - The `PyObject_NEW()` macro becomes an alias to the `PyObject_New` macro, and the `PyObject_NEW_VAR()` macro becomes an alias to the `PyObject_NewVar` macro. They no longer access directly the `PyTypeObject.tp_basicsize` member.

  - `PyObject_GET_WEAKREFS_LISTPTR()` macro was converted to a function: the macro accessed directly the `PyTypeObject.tp_weaklistoffset` member.

  - Макрос `PyObject_CheckBuffer()` було перетворено на функцію: макрос мав прямий доступ до елемента `PyTypeObject.tp_as_buffer`.

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

  (Додаткову інформацію див. bpo-40170.)

### Видалено

- Макроси `PyFPE_START_PROTECT()` і `PyFPE_END_PROTECT()` макроси `pyfpe.h` виключено з обмеженого C API. (Надав Віктор Стіннер у bpo-38835.)

- Слот `tp_print` PyTypeObject видалено. Він використовувався для друку об’єктів у файли в Python 2.7 і раніше. Починаючи з Python 3.0, він ігнорувався та не використовувався. (Надано Jeroen Demeyer у bpo-36974.)

- Зміни в обмеженому API C (якщо визначено макрос `Py_LIMITED_API`):

  - Виключено такі функції з обмеженого C API:

    - `PyThreadState_DeleteCurrent()` (Надано Joannah Nanjekye в bpo-37878.)

    - `_Py_CheckRecursionLimit`

    - `_Py_NewReference()`

    - `_Py_ForgetReference()`

    - `_PyTraceMalloc_NewReference()`

    - `_Py_GetRefTotal()`

    - Механізм кошика, який ніколи не працював в обмеженому C API.

    - `PyTrash_UNWIND_LEVEL`

    - `Py_TRASHCAN_BEGIN_CONDITION`

    - `Py_TRASHCAN_BEGIN`

    - `Py_TRASHCAN_END`

    - `Py_TRASHCAN_SAFE_BEGIN`

    - `Py_TRASHCAN_SAFE_END`

  - Перенесено такі функції та визначення до внутрішнього C API:

    - `_PyDebug_PrintTotalRefs()`

    - `_Py_PrintReferences()`

    - `_Py_PrintReferenceAddresses()`

    - `_Py_tracemalloc_config`

    - `_Py_AddToAllObjects()` (специфічний для збірки `Py_TRACE_REFS`)

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

- Вилучено хук `_PyRuntime.getframe` і видалено макрос `_PyThreadState_GetFrame`, який був псевдонімом `_PyRuntime.getframe`. Їх відкривав лише внутрішній C API. Видалено також тип `PyThreadFrameGetter`. (Надав Віктор Стіннер у bpo-39946.)

- Видалено наступні функції з C API. Викличте `PyGC_Collect()` явно, щоб очистити всі вільні списки. (Надано Інадою Наокі та Віктором Стіннером у bpo-37340, bpo-38896 та bpo-40428.)

  - `PyAsyncGen_ClearFreeLists()`

  - `PyContext_ClearFreeList()`

  - `PyDict_ClearFreeList()`

  - `PyFloat_ClearFreeList()`

  - `PyFrame_ClearFreeList()`

  - `PyList_ClearFreeList()`

  - `PyMethod_ClearFreeList()` і `PyCFunction_ClearFreeList()`: вільні списки зв’язаних об’єктів методу видалено.

  - `PySet_ClearFreeList()`: у Python 3.4 видалено список вільних.

  - `PyTuple_ClearFreeList()`

  - `PyUnicode_ClearFreeList()`: у Python 3.3 видалено список вільних кодів Unicode.

- Вилучено функцію `_PyUnicode_ClearStaticStrings()`. (Надав Віктор Стіннер у bpo-39465.)

- Видалено `Py_UNICODE_MATCH`. Він був застарілим PEP 393 і зламався з Python 3.3. Замість цього можна використовувати функцію `PyUnicode_Tailmatch()`. (Надано Інадою Наокі в bpo-36346.)

- Очищені файли заголовків визначених інтерфейсів, але без реалізації. The public API symbols being removed are: `_PyBytes_InsertThousandsGroupingLocale`, `_PyBytes_InsertThousandsGrouping`, `_Py_InitializeFromArgs`, `_Py_InitializeFromWideArgs`, `_PyFloat_Repr`, `_PyFloat_Digits`, `_PyFloat_DigitsInit`, `PyFrame_ExtendStack`, `_PyAIterWrapper_Type`, `PyNullImporter_Type`, `PyCmpWrapper_Type`, `PySortWrapper_Type`, `PyNoArgsFunction`. (Надав Пабло Галіндо Сальгадо в bpo-39372.)

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

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

Поведінку `typing.Literal` було змінено, щоб вона відповідала PEP 586 і відповідала поведінці засобів перевірки статичних типів, указаних у PEP.

1. `Літерал` тепер усуває дублікати параметрів.

2. Порівняння рівності між об’єктами `Literal` тепер не залежить від порядку.

3. `Літеральні` порівняння тепер поважають типи. Наприклад, `Literal[0] == Literal[False]`, попередньо оцінене як `True`. Тепер це `False`. Для підтримки цієї зміни внутрішній кеш типів тепер підтримує розрізняючі типи.

4. Об’єкти `Literal` тепер створюватимуть виняток `TypeError` під час порівняння рівності, якщо будь-який з їхніх параметрів не hashable. Зверніть увагу, що оголошення `Literal` зі змінними параметрами не викличе помилку:

       >>> from typing import Literal
       >>> Literal[{0}]
       >>> Literal[{0}] == Literal[{False}]
       Traceback (most recent call last):
         File "<stdin>", line 1, in <module>
       TypeError: unhashable type: 'set'

(Надав Юрій Карабас у bpo-42345.)

### Підтримка macOS 11.0 (Big Sur) і Apple Silicon Mac

Починаючи з версії 3.9.1, Python тепер повністю підтримує збірку та роботу на macOS 11.0 (Big Sur) і на Apple Silicon Mac (на основі архітектури `ARM64`). Новий універсальний варіант збірки, `universal2`, тепер доступний для підтримки як `ARM64`, так і `Intel 64` в одному наборі виконуваних файлів. Двійкові файли тепер також можна створювати на поточних версіях macOS для розгортання в ряді старіших версій macOS (перевірено до 10.9), при цьому деякі новіші функції та параметри ОС стають умовно доступними на основі версії операційної системи, яка використовується під час виконання («слабкі зв’язки» ).

(Надано Рональдом Усореном і Лоуренсом Д’Анною в bpo-41100.)

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

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

`collections.abc.Callable` generic тепер зводить параметри типу, подібно до того, що зараз робить `typing.Callable`. Це означає, що `collections.abc.Callable[[int, str], str]` матиме `__args__` `(int, str, str)`; раніше це було `([int, str], str)`. Щоб дозволити цю зміну, `types.GenericAlias` тепер можна створювати підкласи, і підклас повертатиметься під час підписки типу `collections.abc.Callable`. Код, який отримує доступ до аргументів через `typing.get_args()` або `__args__`, повинен враховувати цю зміну. `DeprecationWarning` може видаватись для недійсних форм параметризації `collections.abc.Callable`, які могли пройти мовчки в Python 3.9.1. Це `DeprecationWarning` стане `TypeError` у Python 3.10. (Надав Кен Джин у bpo-42195.)

### urllib.parse

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.9.3

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)

## Notable changes in Python 3.9.5

### urllib.parse

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 in `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.9.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.

## Notable changes in 3.9.17

### tarfile

- The extraction methods in `tarfile`, and `shutil.unpack_archive()`, have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show a `DeprecationWarning`. In Python 3.14, the default will switch to `'data'`. (Contributed by Petr Viktorin in PEP 706.)