Що нового в 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.)

Додано asyncio.PidfdChildWatcher, реалізацію дочірнього спостерігача для Linux, яка опитує дескриптори файлів процесу. (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 F_OFD_GETLK, F_OFD_SETLK and 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

Додано pathlib.Path.readlink(), який діє подібно до os.readlink(). (Надав Гіртс Фолкманіс у 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

Рядок документації тепер відображається не лише для класу, функції, методу тощо, але й для будь-якого об’єкта, який має власний атрибут __doc__. (Надав Сергій Сторчака в bpo-40257.)

випадковий

Додано новий метод random.Random.randbytes: генерувати випадкові байти. (Надав Віктор Стіннер у 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.)

  • Оптимізовано difference_update() для випадку, коли інший набір набагато більший за базовий набір. (Запропоновано Євгеном Капуном із кодом, наданим Мікеле Орру в 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 predicable 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.)

  • Модуль lib2to3 тепер видає PendingDeprecationWarning. Python 3.9 перейшов на синтаксичний аналізатор PEG (див. PEP 617), а Python 3.10 може включати новий синтаксис мови, який не аналізується парсером LL(1) lib2to3. Модуль lib2to3 може бути видалено зі стандартної бібліотеки в майбутній версії Python. Розгляньте сторонні альтернативи, такі як LibCST або parso. (Надано Карлом Майєром у 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() псевдонім aifc.open(), sunau.openfp() псевдонім sunau.open() та wave.openfp() Псевдонім wave.open() було видалено. Вони застаріли з Python 3.7. (Надав Віктор Стіннер у 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(foo_struct *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

  • Код операції LOAD_ASSERTION_ERROR додано для обробки оператора assert. Раніше оператор assert не працював належним чином, якщо виняток AssertionError затінявся. (Надав Закері Шпітц у 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

Попередні версії Python дозволяли використовувати як ;, так і & як роздільники параметрів запиту в urllib.parse.parse_qs() і urllib.parse.parse_qsl(). З міркувань безпеки та для відповідності новим рекомендаціям W3C це було змінено, щоб дозволити лише один роздільний ключ із & за замовчуванням. Ця зміна також впливає на cgi.parse() і cgi.parse_multipart(), оскільки вони використовують уражені функції внутрішньо. Щоб дізнатися більше, перегляньте відповідну документацію. (Надано Адамом Ґолдшмідтом, Сентилом Кумараном і Кеном Джином у 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.)