Що нового в Python 3.9¶
- Реліз
3.9.20
- Дата
вересня 08, 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()
andbytes.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 intolong
. (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
структури CPyConfig
видалено. Їм потрібна була спеціальна збірка 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 customtp_traverse
function, ensure that all customtp_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 thatPy_TYPE(self)
is visited only once. Note that only heap types are expected to visit the type intp_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()
стають звичайними «непрозорими» функціями для приховування деталей реалізації.
Додано функцію
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
)
Вилучено хук
_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.
Літерал
тепер усуває дублікати параметрів.Порівняння рівності між об’єктами
Literal
тепер не залежить від порядку.Літеральні
порівняння тепер поважають типи. Наприклад,Literal[0] == Literal[False]
, попередньо оцінене якTrue
. Тепер цеFalse
. Для підтримки цієї зміни внутрішній кеш типів тепер підтримує розрізняючі типи.Об’єкти
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
, andshutil.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 aDeprecationWarning
. 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
andis_private
behavior inIPv4Address
,IPv6Address
,IPv4Network
andIPv6Network
.
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, setverify_generated_headers
. (Contributed by Bas Bloemsaat and Petr Viktorin in gh-121650.)email.utils.getaddresses()
andemail.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: usestrict=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.)