Що нового в Python 3.9

Реліз

3.9.21

Дата

грудня 09, 2024

редактор

Łukasz Langa

This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5th, 2020.

Щоб отримати повну інформацію, перегляньте журнал змін.

Дивись також

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;

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

  • декілька модулів Python (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) тепер використовує багатофазову ініціалізацію, як визначено PEP 489;

  • кілька стандартних бібліотечних модулів (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) тепер використовують стабільний ABI, визначений 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, що й старий аналізатор.

У Python 3.10 старий синтаксичний аналізатор буде видалено, а також усі функціональні можливості, які від нього залежать (передусім модуль parser, який уже давно застарів). Лише в Python 3.9 ви можете повернутися до синтаксичного аналізатора LL(1) за допомогою параметра командного рядка (-X oldparser) або змінної середовища (PYTHONOLDPARSER=1).

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

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

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

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

  • In the Python Development Mode and in debug build, the encoding and errors arguments are now checked for string encoding and decoding operations. Examples: open(), str.encode() and 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

Як резервне джерело даних для платформ, які не постачають базу даних IANA, модуль tzdata було випущено як пакет першої сторони, який поширюється через PyPI та підтримується основною командою CPython.

Дивись також

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 тепер викликає TyperError під час виклику несумісних методів із сокетом ssl.SSLSocket. (Надав Ідо Майкл у 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.)

дата, час

isocalendar() методів datetime.date і isocalendar() datetime.datetime тепер повертає namedtuple() замість tuple. (Надав Dong-hee Na у bpo-24416.)

distutils

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

fcntl

Додано константи F_OFD_GETLK, F_OFD_SETLK і F_OFD_SETLKW. (Надав Dong-hee Na у bpo-38602.)

ftplib

FTP і FTP_TLS тепер викликають ValueError, якщо час очікування для їх конструктора дорівнює нулю, щоб запобігти створенню неблокуючого сокета. (Надав Dong-hee Na у 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 103 EARLY_HINTS, 418 IM_A_TEAPOT і 425 TOO_EARLY додаються до http.HTTPStatus. (Надано Dong-hee Na у bpo-39509 та Росс Роудс у 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 і IMAP4_SSL тепер мають додатковий параметр timeout для своїх конструкторів. Крім того, завдяки цій зміні метод open() тепер має додатковий параметр timeout. До цієї зміни було застосовано перевизначені методи IMAP4_SSL і IMAP4_stream. (Надав Dong-hee Na у bpo-38615.)

imaplib.IMAP4.unselect() додано. imaplib.IMAP4.unselect() звільняє ресурси сервера, пов’язані з вибраною поштовою скринькою, і повертає сервер до автентифікованого стану. Ця команда виконує ті самі дії, що й imaplib.IMAP4.close(), за винятком того, що повідомлення не видаляються назавжди з поточної вибраної поштової скриньки. (Надав Dong-hee Na у 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 і NNTP_SSL тепер викликають ValueError, якщо заданий тайм-аут для їхнього конструктора дорівнює нулю, щоб запобігти створенню неблокуючого сокета. (Надав Dong-hee Na у bpo-39259.)

ос

Додано CLD_KILLED і CLD_STOPPED для si_code. (Надав Dong-hee Na у bpo-38493.)

Розкрито специфічні для Linux os.pidfd_open() (bpo-38692) і os.P_PIDFD (bpo-38713) для керування процесами за допомогою дескрипторів файлів.

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

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

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

As of 3.9.20, os.mkdir() and os.makedirs() on Windows now support passing a mode value of 0o700 to apply access control to the new directory. This implicitly affects tempfile.mkdtemp() and is a mitigation for CVE-2024-4030. Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486.)

pathlib

Додано pathlib.Path.readlink(), який діє подібно до os.readlink(). (Надав Гіртс Фолкманіс у bpo-30618)

pdb

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

попліб

POP3 і POP3_SSL тепер викликають ValueError, якщо час очікування для їх конструктора дорівнює нулю, щоб запобігти створенню неблокуючого сокета. (Надав Dong-hee Na у 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 і SMTP_SSL тепер викликають ValueError, якщо заданий тайм-аут для їхнього конструктора дорівнює нулю, щоб запобігти створенню неблокуючого сокета. (Надав Dong-hee Na у bpo-39259.)

LMTP конструктор тепер має додатковий параметр timeout. (Надав Dong-hee Na у bpo-39329.)

гніздо

Модуль socket тепер експортує константу CAN_RAW_JOIN_FILTERS у Linux 4.1 і новіших версіях. (Надано Стефаном Татшнером і Закері Шпітцом у bpo-25780.)

Модуль сокета тепер підтримує протокол CAN_J1939 на платформах, які його підтримують. (Надав Карл Дінг у 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 ms. (Contributed by Batuhan Taskaya in bpo-40192)

система

Додано новий атрибут sys.platlibdir: ім’я каталогу бібліотеки для певної платформи. Використовується для побудови шляху стандартної бібліотеки та шляхів встановлених модулів розширення. На більшості платформ він дорівнює "lib". У Fedora та SuSE він дорівнює "lib64" на 64-розрядних платформах. (Надано Яном Матєйком, Матєєм Чеплем, Харалампосом Стратакісом і Віктором Стіннером у bpo-1294959.)

Раніше sys.stderr був блочно буферизований, коли не був інтерактивним. Тепер stderr за замовчуванням завжди буферизується рядком. (Надав Jendrik Seipp у bpo-13601.)

tempfile

As of 3.9.20 on Windows, the default mode 0o700 used by tempfile.mkdtemp() now limits access to the new directory due to changes to os.mkdir(). This is a mitigation for CVE-2024-4030. (Contributed by Steve Dower in gh-118486.)

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

  • Низка вбудованих модулів Python (range, tuple, set, frozenset, list, dict) тепер прискорюється за допомогою протоколу vectorcall PEP 590. (Надано Dong-hee Na, Mark Shannon, Jeroen Demeyer та Petr Viktorin у bpo-37207.)

  • Оптимізовано difference_update() для випадку, коли інший набір набагато більший за базовий набір. (Запропоновано Євгеном Капуном із кодом, наданим Мікеле Орру в bpo-8425.)

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

  • floor division операції float тепер має кращу продуктивність. Також оновлено повідомлення ZeroDivisionError для цієї операції. (Надав Dong-hee Na у 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

Ці результати були згенеровані зі сценарію тестування доступу до змінних за адресою: Tools/scripts/var_access_benchmark.py. Еталонний сценарій відображає таймінги в наносекундах. Контрольні показники вимірювалися на процесорі Intel® Core™ i7-4960HQ під керуванням 64-розрядних збірок macOS, доступних на python.org.

Застаріле

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

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

  • Модулі parser і symbol застаріли та будуть видалені в майбутніх версіях Python. Для більшості випадків використання користувачі можуть використовувати етап генерації та компіляції абстрактного синтаксичного дерева (AST) за допомогою модуля ast.

  • Функції Public C API PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags() і PyNode_Compile() застаріли та будуть видалені разом у Python 3.10 зі старим парсером.

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

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

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

  • Застарів метод split() _tkinter.TkappType на користь методу splitlist(), який має більш узгоджену та передбачувану поведінку. (Надав Сергій Сторчака в bpo-38371.)

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

  • Стандарти binhex4 і hexbin4 тепер застаріли. Модуль binhex і такі функції binascii тепер застаріли:

    (Надав Віктор Стіннер у 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.)

  • Функції PyEval_InitThreads() і PyEval_ThreadsInitialized() тепер застаріли та будуть видалені в Python 3.11. Виклик PyEval_InitThreads() тепер нічого не робить. GIL ініціалізується Py_Initialize() починаючи з Python 3.7. (Надав Віктор Стіннер у bpo-39877.)

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

  • smtpd.MailmanProxy() тепер не підтримується, оскільки його не можна використовувати без зовнішнього модуля, mailman. (Надав Семюель Колвін у 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)

Видалено

  • Помилкову версію в unittest.mock.__version__ було видалено.

  • nntplib.NNTP: методи xpath() і xgtitle() видалено. Ці методи застаріли з Python 3.3. Як правило, ці розширення не підтримуються або не ввімкнені адміністраторами NNTP-сервера. Для xgtitle() використовуйте замість цього nntplib.NNTP.descriptions() або nntplib.NNTP.description(). (Надав Dong-hee Na у 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.)

  • Метод isAlive() threading.Thread видалено. Він був застарілим, починаючи з Python 3.8. Замість цього використовуйте is_alive(). (Надав Dong-hee Na у 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.)

  • Функцію sys.getcounts(), параметр командного рядка -X showalloccount і поле show_alloc_count структури C PyConfig видалено. Їм потрібна була спеціальна збірка Python із визначенням макросу COUNT_ALLOCS. (Надав Віктор Стіннер у bpo-39489.)

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

  • Метод symtable.SymbolTable.has_exec() видалено. Він застарів з 2006 року, і повертає лише False під час виклику. (Надано Batuhan Taskaya в bpo-40208)

  • asyncio.Task.current_task() і asyncio.Task.all_task() було видалено. Вони застаріли з Python 3.7, і замість них можна використовувати asyncio.current_task() і asyncio.all_tasks(). (Надав Ремі Лапейр у 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__ встановлено значення "".

  • Метод select.epoll.unregister() більше не ігнорує помилку EBADF. (Надав Віктор Стіннер у 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') тепер використовує wchar_t як тип C замість Py_UNICODE. Ця зміна не впливає на його поведінку, оскільки Py_UNICODE є псевдонімом wchar_t, починаючи з Python 3.3. (Надано Інадою Наокі в bpo-34538.)

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

  • Обробка ділення PurePath тепер повертає NotImplemented замість того, щоб викликати TypeError, коли передається щось інше, ніж примірник str або PurePath. Це дозволяє створювати сумісні класи, які не успадковують ці типи. (Надав Роджер Аюді в 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

  • Instances of heap-allocated types (such as those created with PyType_FromSpec() and similar APIs) hold a reference to their type object since Python 3.8. As indicated in the «Changes in the C API» of Python 3.8, for the vast majority of cases, there should be no side effect but for types that have a custom tp_traverse function, ensure that all custom tp_traverse functions of heap-allocated types visit the object’s type.

    приклад:

    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
    }
    

    If your traverse function delegates to tp_traverse of its base class (or another type), ensure that Py_TYPE(self) is visited only once. Note that only heap types are expected to visit the type in tp_traverse.

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

    base->tp_traverse(self, visit, arg)
    

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

    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 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.)

Зміни збірки

  • До сценарію configure додано опцію --with-platlibdir: ім’я каталогу бібліотеки для певної платформи, що зберігається в новому атрибуті sys.platlibdir. Дивіться атрибут sys.platlibdir для отримання додаткової інформації. (Надано Яном Матєйком, Матєєм Чеплем, Харалампосом Стратакісом і Віктором Стіннером у bpo-1294959.)

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

  • На платформах, відмінних від Windows, для створення Python тепер потрібні функції setenv() і unsetenv(). (Надав Віктор Стіннер у 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: Додано PyType_FromModuleAndSpec() для асоціації модуля з класом; PyType_GetModule() і PyType_GetModuleState() для отримання модуля та його стану; і PyCMethod і METH_METHOD, щоб дозволити методу отримати доступ до класу, у якому його було визначено. (Надано Марселем Плхом і Петром Вікторіним у 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.)

  • Додано функцію PyModule_AddType(), щоб допомогти додати тип до модуля. (Надав Dong-hee Na у bpo-40024.)

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

  • Додано _PyObject_FunctionStr(), щоб отримати зручне рядкове представлення об’єкта, подібного до функції. (Патч від Jeroen Demeyer у 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.)

  • Структура PyGC_Head тепер непрозора. Він визначений лише у внутрішньому API C (pycore_gc.h). (Надав Віктор Стіннер у bpo-40241.)

  • Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicode і PyUnicode_AsUnicodeAndSize() позначені як застарілі в C. Вони були застарілими PEP 393, починаючи з Python 3.3. (Надано Інадою Наокі в bpo-36346.)

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

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

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

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

    • Макрос PyObject_NEW() стає псевдонімом макросу PyObject_New(), а макрос PyObject_NEW_VAR() стає псевдонімом макросу PyObject_NewVar() . Вони більше не мають прямого доступу до члена PyTypeObject.tp_basicsize.

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

    • Макрос 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 bpo-43285)

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 bpo-43882)

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

Notable changes in 3.9.20

IP-адреса

  • Fixed is_global and is_private behavior in IPv4Address, IPv6Address, IPv4Network and IPv6Network.

email

  • Headers with embedded newlines are now quoted on output.

    The generator will now refuse to serialize (write) headers that are improperly folded or delimited, such that they would be parsed as multiple headers or joined with adjacent data. If you need to turn this safety feature off, set verify_generated_headers. (Contributed by Bas Bloemsaat and Petr Viktorin in gh-121650.)

  • email.utils.getaddresses() and email.utils.parseaddr() now return ('', '') 2-tuples in more situations where invalid email addresses are encountered, instead of potentially inaccurate values. An optional strict parameter was added to these two functions: use strict=False to get the old behavior, accepting malformed inputs. getattr(email.utils, 'supports_strict_parsing', False) can be used to check if the strict paramater is available. (Contributed by Thomas Dwyer and Victor Stinner for gh-102988 to improve the CVE-2023-27043 fix.)