Що нового в Python 3.9¶
- редактор:
Łukasz Langa
This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.
Дивись також
PEP 596 - Графік випуску Python 3.9
Підсумок – основні моменти випуску¶
Нові функції синтаксису:
PEP 584, оператори об’єднання додано до
dict
;PEP 585, генерики підказок типів у стандартних колекціях;
PEP 614, послаблені граматичні обмеження для декораторів.
Нові вбудовані функції:
PEP 616, рядкові методи для видалення префіксів і суфіксів.
Нові можливості стандартної бібліотеки:
PEP 593, гнучка функція та анотації змінних;
os.pidfd_open()
додано, що дозволяє керувати процесом без гонок і сигналів.
Покращення перекладача:
PEP 573, швидкий доступ до стану модуля з методів типів розширення C;
PEP 617, CPython тепер використовує новий аналізатор на основі PEG;
ряд вбудованих компонентів Python (діапазон, кортеж, набір, заморожений набір, список, dict) тепер пришвидшено за допомогою PEP 590 vectorcall;
збір сміття не блокується на відроджених об’єктах;
a number of Python modules (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) now use multiphase initialization as defined by PEP 489;a number of standard library modules (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) are now using the stable ABI defined by PEP 384.
Нові бібліотечні модулі:
PEP 615, база даних часових поясів IANA тепер присутня в стандартній бібліотеці в модулі
zoneinfo
;реалізація топологічного сортування графа тепер доступна в новому модулі
graphlib
.
Зміни в процесі випуску:
PEP 602, CPython використовує щорічний цикл випуску.
Вам слід перевірити DeprecationWarning у вашому коді¶
Коли Python 2.7 ще підтримувався, багато функціональних можливостей Python 3 було збережено для зворотної сумісності з Python 2.7. З припиненням підтримки Python 2 ці рівні зворотної сумісності були видалені або будуть видалені незабаром. Більшість із них видавали попередження DeprecationWarning
протягом кількох років. Наприклад, використання collections.Mapping
замість collections.abc.Mapping
видає DeprecationWarning
, починаючи з Python 3.3, випущеного в 2012 році.
Перевірте свою програму за допомогою параметра командного рядка -W
default
, щоб побачити DeprecationWarning
і PendingDeprecationWarning
, або навіть за допомогою -W
error
розглядати їх як помилки. Фільтр попереджень можна використовувати для ігнорування попереджень від стороннього коду.
Python 3.9 є останньою версією, яка забезпечує рівні зворотної сумісності Python 2, щоб дати більше часу супроводжувачам проектів Python для організації видалення підтримки Python 2 і додавання підтримки для Python 3.9.
Псевдоніми Abstract Base Classes в модулі collections
, як-от псевдонім collections.Mapping
для collections.abc.Mapping
, зберігаються для останнього випуску для повернення сумісність. Їх буде видалено з Python 3.10.
Загалом, спробуйте запустити свої тести в режимі Python Development Mode, який допоможе підготувати ваш код до сумісності з наступною версією Python.
Примітка: у цій версії Python також було видалено низку існуючих застарілих програм. Зверніться до розділу Видалено.
Нові можливості¶
Оператори злиття та оновлення словника¶
До вбудованого класу dict
додано оператори Merge (|
) і Update (|=
). Вони доповнюють існуючі методи об’єднання словників dict.update
і {**d1, **d2}
.
Приклад:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Дивіться PEP 584 для повного опису. (Надав Брандт Бухер у bpo-36144.)
Нові рядкові методи для видалення префіксів і суфіксів¶
Додано str.removeprefix(prefix)
і str.removesuffix(suffix)
, щоб легко видалити непотрібний префікс або суфікс із рядка. Також додано відповідні методи bytes
, bytearray
і collections.UserString
. Дивіться PEP 616 для повного опису. (Надав Денніс Суїні в bpo-39939.)
Універсальні підказки типів у стандартних колекціях¶
В анотаціях типів тепер можна використовувати вбудовані типи колекцій, такі як list
і dict
, як загальні типи замість імпорту відповідних типів, написаних великими літерами (наприклад, List
або Dict
) із введення
. Деякі інші типи стандартної бібліотеки також тепер є загальними, наприклад queue.Queue
.
приклад:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
Дивіться PEP 585 для більш детальної інформації. (Надано Гвідо ван Россумом, Ітаном Смітом і Батуханом Ташкаєю в bpo-39481.)
Новий парсер¶
Python 3.9 використовує новий аналізатор на основі PEG замість LL(1). Продуктивність нового синтаксичного аналізатора приблизно порівнянна з продуктивністю старого парсера, але формалізм PEG є більш гнучким, ніж LL(1), коли справа доходить до розробки нових функцій мови. Ми почнемо використовувати цю гнучкість у Python 3.10 і пізніших версіях.
Модуль ast
використовує новий аналізатор і створює той самий AST, що й старий аналізатор.
In Python 3.10, the old parser will be deleted and so will all
functionality that depends on it (primarily the parser
module,
which has long been deprecated). In Python 3.9 only, you can switch
back to the LL(1) parser using a command line switch (-X
oldparser
) or an environment variable (PYTHONOLDPARSER=1
).
Дивіться PEP 617 для більш детальної інформації. (Надано Гвідо ван Россумом, Пабло Галіндо та Лісандросом Ніколау в bpo-40334.)
Інші зміни мови¶
__import__()
тепер викликаєImportError
замістьValueError
, який раніше траплявся, коли відносний імпорт проходив поза пакетом верхнього рівня. (Надав Нгалім Сірегар у bpo-37444.)Тепер Python отримує абсолютний шлях до імені файлу сценарію, указаного в командному рядку (наприклад:
python3 script.py
): атрибут__file__
модуля__main__
став абсолютним шляхом, а не ніж відносний шлях. Тепер ці шляхи залишаються дійсними після того, як поточний каталог зміненоos.chdir()
. Як побічний ефект, у цьому випадку трасування також відображає абсолютний шлях для фреймів модуля__main__
. (Надав Віктор Стіннер у bpo-20443.)У режимі Python Development Mode і в debug build, аргументи encoding і errors тепер перевіряються на наявність операцій кодування та декодування рядків. Приклади:
open()
,str.encode()
іbytes.decode()
.За замовчуванням для найкращої продуктивності аргумент errors перевіряється лише при першій помилці кодування/декодування, а аргумент encoding іноді ігнорується для порожніх рядків. (Надав Віктор Стіннер у bpo-37388.)
"".replace("", s, n)
тепер повертаєs
замість порожнього рядка для всіх ненульовихn
. Тепер це сумісно з"".replace("", s)
. Існують подібні зміни для об’єктівbytes
іbytearray
. (Надав Сергій Сторчака в bpo-28029.)Будь-який дійсний вираз тепер можна використовувати як decorator. Раніше граматика була набагато жорсткішою. Подробиці див. PEP 614. (Надав Брандт Бухер у bpo-39702.)
Покращена довідка для модуля
typing
. Рядки документів тепер відображаються для всіх спеціальних форм і спеціальних загальних псевдонімів (наприклад,Union
іList
). Використанняhelp()
із загальним псевдонімом, таким якList[int]
, покаже довідку для відповідного конкретного типу (list
у цьому випадку). (Надав Сергій Сторчака в bpo-40257.)Паралельний запуск
aclose()
/asend()
/athrow()
тепер заборонено, аag_running
тепер відображає фактичний статус роботи асинхронний генератор. (Надав Юрій Селіванов у bpo-30773.)Неочікувані помилки під час виклику методу
__iter__
більше не маскуютьсяTypeError
в операторіin
і функціяхcontains()
,indexOf()
іcountOf()
модуляoperator
. (Надав Сергій Сторчака в bpo-40824.)Лямбда-вирази без круглих дужок більше не можуть бути частиною виразу в реченні
if
у виразах розуміння та генераторі. Дивіться bpo-41848 і bpo-43755 для отримання додаткової інформації.
Нові модулі¶
зонаінфо¶
Модуль zoneinfo
забезпечує підтримку бази даних часових поясів IANA до стандартної бібліотеки. Він додає zoneinfo.ZoneInfo
, конкретну реалізацію datetime.tzinfo
, яка підтримується даними про часовий пояс системи.
Приклад:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
As a fall-back source of data for platforms that don’t ship the IANA database, the tzdata module was released as a first-party package – distributed via PyPI and maintained by the CPython core team.
Дивись також
- PEP 615 – Підтримка бази даних часових поясів IANA в стандартній бібліотеці
PEP написаний і реалізований Полом Ганссле
graphlib¶
Було додано новий модуль graphlib
, який містить клас graphlib.TopologicalSorter
, який пропонує функції для виконання топологічного сортування графів. (Надано Пабло Галіндо, Тімом Пітерсом і Ларрі Гастінгсом у bpo-17005.)
Покращені модулі¶
аст¶
Додано опцію indent до dump()
, яка дозволяє створювати багаторядковий вивід із відступом. (Надав Сергій Сторчака в bpo-37995.)
Додано ast.unparse()
як функцію в модулі ast
, яку можна використовувати для розбору об’єкта ast.AST
і створення рядка з кодом, який створить еквівалентний ast.AST
об’єкт під час аналізу. (Надано Пабло Галіндо та Батуханом Таською в bpo-38870.)
До вузлів AST додано рядки документів, які містять підпис ASDL, використаний для створення цього вузла. (Надано Batuhan Taskaya в bpo-39638.)
asyncio¶
Через серйозні проблеми безпеки параметр reuse_address asyncio.loop.create_datagram_endpoint()
більше не підтримується. Це через поведінку опції сокета SO_REUSEADDR
в UDP. Для отримання додаткової інформації див. документацію для loop.create_datagram_endpoint()
. (Надано Кайлом Стенлі, Антуаном Пітру та Юрієм Селівановим у bpo-37228.)
Додано новий coroutine shutdown_default_executor()
, який планує завершення роботи для виконавця за замовчуванням, який очікує завершення закриття ThreadPoolExecutor
. Крім того, asyncio.run()
було оновлено, щоб використовувати нову coroutine. (Надав Кайл Стенлі в bpo-34037.)
Додано asyncio.PidfdChildWatcher
, реалізацію дочірнього спостерігача для Linux, яка опитує дескриптори файлів процесу. (bpo-38692)
Додано нову coroutine asyncio.to_thread()
. Він в основному використовується для запуску функцій, пов’язаних із введенням-виведенням, в окремому потоці, щоб уникнути блокування циклу подій, і, по суті, працює як високорівнева версія run_in_executor()
, яка може безпосередньо приймати ключові аргументи. (Надано Кайлом Стенлі та Юрієм Селівановим у bpo-32309.)
Під час скасування завдання через тайм-аут asyncio.wait_for()
тепер чекатиме до завершення скасування також у випадку, коли timeout <= 0, як це відбувається з позитивними тайм-аутами. (Надав Елвіс Пранскявічус у bpo-32751.)
asyncio
now raises TypeError
when calling incompatible
methods with an ssl.SSLSocket
socket.
(Contributed by Ido Michael in bpo-37404.)
compileall¶
Додано нову можливість використовувати жорсткі посилання для дубльованих файлів .pyc
: параметр hardlink_dupes і параметр командного рядка –hardlink-dupes. (Надав Lumír „Frenzy“ Balhar у bpo-40495.)
Додано нові параметри для маніпулювання шляхом у кінцевих файлах .pyc
: параметри stripdir, prependdir, limit_sl_dest і параметри командного рядка -s, -p, -e. Додана можливість багаторазово вказувати опцію для рівня оптимізації. (Надав Lumír „Frenzy“ Balhar у bpo-38112.)
concurrent.futures¶
Додано новий параметр cancel_futures до concurrent.futures.Executor.shutdown()
, який скасовує всі незавершені ф’ючерси, які ще не почали виконуватися, замість того, щоб чекати їх завершення перед вимкненням виконавця. (Надав Кайл Стенлі в bpo-39349.)
Видалено потоки демона з ThreadPoolExecutor
і ProcessPoolExecutor
. Це покращує сумісність із субінтерпретаторами та передбачуваність процесів їх завершення. (Надав Кайл Стенлі в bpo-39812.)
Воркери в ProcessPoolExecutor
тепер створюються на вимогу, лише коли немає доступних неактивних робочих елементів для повторного використання. Це оптимізує накладні витрати на запуск і зменшує кількість втраченого процесорного часу для простою працівників. (Надав Кайл Стенлі в bpo-39207.)
прокльони¶
Додано функції curses.get_escdelay()
, curses.set_escdelay()
, curses.get_tabsize()
і curses.set_tabsize()
. (Надав Ентоні Соттіле в bpo-38312.)
дата, час¶
The isocalendar()
of datetime.date
and isocalendar()
of datetime.datetime
methods now returns a namedtuple()
instead of a tuple
.
(Contributed by Donghee Na in bpo-24416.)
distutils¶
Команда upload тепер створює хеш-дайджести SHA2-256 і Blake2b-256. Він пропускає MD5 на платформах, які блокують дайджест MD5. (Надав Крістіан Хеймс у bpo-40698.)
fcntl¶
Added constants F_OFD_GETLK
, F_OFD_SETLK
and F_OFD_SETLKW
.
(Contributed by Donghee Na in bpo-38602.)
ftplib¶
FTP
and FTP_TLS
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
gc¶
Коли збирач сміття створює колекцію, у якій деякі об’єкти відроджуються (вони доступні поза ізольованими циклами після виконання фіналізаторів), не блокуйте колекцію всіх об’єктів, які все ще недоступні. (Надано Пабло Галіндо та Тімом Пітерсом у bpo-38379.)
Додано нову функцію gc.is_finalized()
, щоб перевірити, чи завершив об’єкт збирач сміття. (Надав Пабло Галіндо в bpo-39322.)
хешліб¶
Модуль hashlib
тепер може використовувати хеші SHA3 і SHAKE XOF з OpenSSL, якщо вони доступні. (Надав Крістіан Хеймс у bpo-37630.)
Вбудовані хеш-модулі тепер можна вимкнути за допомогою ./configure --without-builtin-hashlib-hashes
або вибірково ввімкнути за допомогою, наприклад, ./configure --with-builtin-hashlib-hashes=sha3,blake2
, щоб примусово використовувати реалізацію на основі OpenSSL. (Надав Крістіан Хеймс у bpo-40479)
http¶
HTTP status codes 103 EARLY_HINTS
, 418 IM_A_TEAPOT
and 425 TOO_EARLY
are added to
http.HTTPStatus
. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)
IDLE і idlelib¶
Додана опція для вимкнення блимання курсору. (Надав Закері Шпітц у bpo-4603.)
Клавіша Escape тепер закриває вікна завершення IDLE. (Надав Джонні Наджера в bpo-38944.)
Додано ключові слова до списку завершення імен модуля. (Надано Террі Дж. Ріді в bpo-37765.)
Нове у випусках обслуговування 3.9
Зробити IDLE викликом sys.excepthook()
(якщо запускається без „-n“). Хуки користувача раніше ігнорувалися. (Надав Кен Хілтон у bpo-43008.)
Зазначені вище зміни було перенесено до випусків обслуговування 3.8.
Перевпорядкування діалогового вікна налаштувань. Розділіть вкладку Загальні на вкладки Windows і Shell/Ed. Перемістіть джерела довідки, які розширюють меню «Довідка», на вкладку «Розширення». Звільніть місце для нових параметрів і скоротіть діалогове вікно. Останнє робить діалог краще адаптованим до маленьких екранів. (Надано Террі Джаном Ріді в bpo-40468.) Перемістіть налаштування відступу з вкладки «Шрифт» на нову вкладку Windows. (Надано Марком Розманом і Террі Джен Ріді в bpo-33962.)
Apply syntax highlighting to .pyi
files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447.)
імапліб¶
IMAP4
and IMAP4_SSL
now have
an optional timeout parameter for their constructors.
Also, the open()
method now has an optional timeout parameter
with this change. The overridden methods of IMAP4_SSL
and
IMAP4_stream
were applied to this change.
(Contributed by Donghee Na in bpo-38615.)
imaplib.IMAP4.unselect()
is added.
imaplib.IMAP4.unselect()
frees server’s resources associated with the
selected mailbox and returns the server to the authenticated
state. This command performs the same actions as imaplib.IMAP4.close()
, except
that no messages are permanently removed from the currently
selected mailbox. (Contributed by Donghee Na in bpo-40375.)
importlib¶
Щоб покращити узгодженість із операторами імпорту, importlib.util.resolve_name()
тепер викликає ImportError
замість ValueError
для недійсних відносних спроб імпорту. (Надав Нгалім Сірегар у bpo-37444.)
Завантажувачі імпорту, які публікують незмінні об’єкти модулів, тепер можуть публікувати незмінні пакети на додаток до окремих модулів. (Надав Діно Віланд у bpo-39336.)
Додано функцію importlib.resources.files()
із підтримкою підкаталогів у даних пакетів, що відповідає бекпорту в importlib_resources
версії 1.5. (Надав Джейсон Р. Кумбс у bpo-39791.)
Оновлено importlib.metadata
з importlib_metadata
версії 1.6.1.
оглядати¶
inspect.BoundArguments.arguments
змінено з OrderedDict
на звичайний dict. (Надано Інадою Наокі в bpo-36350 і bpo-39775.)
IP-адреса¶
ipaddress
тепер підтримує IPv6 Scoped Addresses (адреса IPv6 із суфіксом % <scope_id>
).
Адреси IPv6 із областю дії можна проаналізувати за допомогою ipaddress.IPv6Address
. Якщо присутній, ідентифікатор зони дії доступний через атрибут scope_id
. (Надав Олександр Павлюк у bpo-34788.)
Починаючи з Python 3.9.5, модуль ipaddress
більше не приймає жодних початкових нулів у рядках адрес IPv4. (Надав Крістіан Хеймс у bpo-36384).
математика¶
Розширено функцію math.gcd()
для обробки кількох аргументів. Раніше він підтримував лише два аргументи. (Надав Сергій Сторчака в bpo-39648.)
Додано math.lcm()
: повертає найменше спільне кратне вказаних аргументів. (Надано Марком Дікінсоном, Анантакрішнаном і Сергієм Сторчакою в bpo-39479 і bpo-39648.)
Додано math.nextafter()
: повертає наступне значення з плаваючою комою після x до y. (Надав Віктор Стіннер у bpo-39288.)
Додано math.ulp()
: повертає значення молодшого біта числа з плаваючою точкою. (Надав Віктор Стіннер у bpo-39310.)
багатопроцесорність¶
Клас multiprocessing.SimpleQueue
має новий метод close()
для явного закриття черги. (Надав Віктор Стіннер у bpo-30966.)
nntplib¶
NNTP
and NNTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
ос¶
Added CLD_KILLED
and CLD_STOPPED
for si_code
.
(Contributed by Donghee Na in bpo-38493.)
Exposed the Linux-specific os.pidfd_open()
(bpo-38692) and
os.P_PIDFD
(bpo-38713) for process management with file
descriptors.
Функція os.unsetenv()
тепер також доступна в Windows. (Надав Віктор Стіннер у bpo-39413.)
Функції os.putenv()
і os.unsetenv()
тепер завжди доступні. (Надав Віктор Стіннер у bpo-39395.)
Додано функцію os.waitstatus_to_exitcode()
: перетворює стан очікування на код виходу. (Надав Віктор Стіннер у bpo-40094.)
pathlib¶
Added pathlib.Path.readlink()
which acts similarly to
os.readlink()
.
(Contributed by Girts Folkmanis in bpo-30618)
pdb¶
У Windows тепер Pdb
підтримує ~/.pdbrc
. (Надано Тімом Хоппером і Деном Лідралом-Портером у bpo-20523.)
попліб¶
POP3
and POP3_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
pprint¶
pprint
тепер може красиво друкувати types.SimpleNamespace
. (Надав Карл Бордум Хансен у bpo-37376.)
pydoc¶
The documentation string is now shown not only for class, function,
method etc, but for any object that has its own __doc__
attribute.
(Contributed by Serhiy Storchaka in bpo-40257.)
випадковий¶
Додано новий метод random.Random.randbytes
: генерувати випадкові байти. (Надав Віктор Стіннер у bpo-40286.)
сигнал¶
Розкритий специфічний для Linux signal.pidfd_send_signal()
для надсилання сигналів до процесу за допомогою файлового дескриптора замість pid. (bpo-38712)
smtplib¶
SMTP
and SMTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
LMTP
constructor now has an optional timeout parameter.
(Contributed by Donghee Na in bpo-39329.)
гніздо¶
The socket
module now exports the CAN_RAW_JOIN_FILTERS
constant on Linux 4.1 and greater.
(Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)
The socket module now supports the CAN_J1939
protocol on
platforms that support it. (Contributed by Karl Ding in bpo-40291.)
Модуль сокета тепер має функції socket.send_fds()
і socket.recv_fds()
. (Надано Joannah Nanjekye, Shinya Okano та Victor Stinner у bpo-28724.)
час¶
On AIX, thread_time()
is now implemented with thread_cputime()
which has nanosecond resolution, rather than
clock_gettime(CLOCK_THREAD_CPUTIME_ID)
which has a resolution of 10 milliseconds.
(Contributed by Batuhan Taskaya in bpo-40192)
система¶
Added a new sys.platlibdir
attribute: name of the platform-specific
library directory. It is used to build the path of standard library and the
paths of installed extension modules. It is equal to "lib"
on most
platforms. On Fedora and SuSE, it is equal to "lib64"
on 64-bit platforms.
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)
Previously, sys.stderr
was block-buffered when non-interactive. Now
stderr
defaults to always being line-buffered.
(Contributed by Jendrik Seipp in bpo-13601.)
tracemalloc¶
Додано tracemalloc.reset_peak()
для встановлення максимального розміру відстежуваних блоків пам’яті на поточний розмір, щоб виміряти пік певних фрагментів коду. (Надав Хуон Вілсон у bpo-40630.)
введення тексту¶
PEP 593 представив тип typing.Annotated
, щоб прикрасити існуючі типи контекстно-залежними метаданими та новий параметр include_extras
для typing.get_type_hints()
для доступу до метаданих під час виконання. (Надано Тіллем Варокво та Костянтином Кашиним.)
unicodedata¶
Базу даних Unicode оновлено до версії 13.0.0. (bpo-39926).
venv¶
Усі сценарії активації, надані venv
, тепер узгоджено вказують налаштування підказок, завжди використовуючи значення, визначене __VENV_PROMPT__
. Раніше деякі сценарії беззастережно використовували __VENV_PROMPT__
, інші, лише якщо його було встановлено (що було випадком за замовчуванням), а один замість цього використовував __VENV_NAME__
. (Надано Бреттом Кенноном у bpo-37663.)
xml¶
Пробіли в атрибутах тепер зберігаються під час серіалізації xml.etree.ElementTree
у файл XML. EOLN більше не нормалізуються до «n». Це результат обговорення того, як інтерпретувати розділ 2.11 специфікації XML. (Надано Mefistotelis у bpo-39011.)
Оптимізації¶
Оптимізовано ідіому для призначення тимчасової змінної в розумінні. Тепер
для y в [expr]
в розуміннях так само швидко, як просте присвоєнняy = expr
. Наприклад:суми = [s для s у [0] для x у даних для s у [s + x]]
На відміну від оператора
:=
, ця ідіома не пропускає змінну до зовнішньої області.(Надав Сергій Сторчака в bpo-32856.)
Оптимізована обробка сигналів у багатопоточних програмах. Якщо потік, відмінний від основного, отримує сигнал, цикл оцінки байт-коду більше не переривається при кожній інструкції байт-коду, щоб перевірити наявність незавершених сигналів, які не можуть бути оброблені. Тільки основний потік головного інтерпретатора може обробляти сигнали.
Раніше цикл оцінки байт-коду переривався на кожній інструкції, доки основний потік не обробить сигнали. (Надав Віктор Стіннер у bpo-40010.)
Оптимізовано модуль
subprocess
у FreeBSD за допомогоюclosefrom()
. (Надано Едом Масте, Конрадом Майєром, Кайлом Евансом, Кубілаєм Коцаком і Віктором Стіннером у bpo-38061.)PyLong_FromDouble()
is now up to 1.87x faster for values that fit into long. (Contributed by Sergey Fedoseev in bpo-37986.)A number of Python builtins (
range
,tuple
,set
,frozenset
,list
,dict
) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)Оптимізовано
difference_update()
для випадку, коли інший набір набагато більший за базовий набір. (Запропоновано Євгеном Капуном із кодом, наданим Мікеле Орру в bpo-8425.)Розподіл малих об’єктів Python (
obmalloc.c
) тепер дозволяє (не більше) одній порожній арені залишатися доступною для негайного повторного використання без повернення її в ОС. Це запобігає трішу в простих циклах, де арена може бути створена та знищена заново на кожній ітерації. (Надав Тім Пітерс у bpo-37257.)floor division of float operation now has a better performance. Also the message of
ZeroDivisionError
for this operation is updated. (Contributed by Donghee Na in bpo-39434.)Декодування коротких рядків ASCII за допомогою кодеків UTF-8 і ascii тепер приблизно на 15% швидше. (Надано Інадою Наокі в bpo-37348.)
Ось підсумок покращень продуктивності від Python 3.4 до Python 3.9:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
These results were generated from the variable access benchmark script at:
Tools/scripts/var_access_benchmark.py
. The benchmark script displays timings
in nanoseconds. The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor
running the macOS 64-bit builds found at
python.org.
Застаріле¶
Команда distutils
bdist_msi
тепер застаріла, замість неї використовуйтеbdist_wheel
(пакети колеса). (Надав Хуго ван Кеменаде в bpo-39586.)Наразі
math.factorial()
приймає екземпляриfloat
із невід’ємними цілими значеннями (наприклад,5.0
). Він викликає помилкуValueError
для нецілісних і від’ємних чисел з плаваючою точкою. Зараз це застаріле. У майбутніх версіях Python він викличеTypeError
для всіх плаваючих значень. (Надав Сергій Сторчака в bpo-37315.)The
parser
andsymbol
modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using theast
module.The Public C API functions
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
andPyNode_Compile()
are deprecated and will be removed in Python 3.10 together with the old parser.Використання
NotImplemented
у логічному контексті застаріло, оскільки це майже виключно результат неправильних реалізацій багатого компаратора. У майбутній версії Python це буде зроблено якTypeError
. (Надав Джош Розенберг у bpo-35712.)Модуль
random
наразі приймає будь-який хешований тип як можливе початкове значення. На жаль, деякі з цих типів не гарантовано матимуть детерміноване хеш-значення. Після Python 3.9 модуль обмежуватиме початкові значення доNone
,int
,float
,str
,bytes
іbytearray
.Відкриття файлу
GzipFile
для запису без вказівки аргументу mode застаріло. У наступних версіях Python він завжди буде відкритий для читання за умовчанням. Укажіть аргумент mode, щоб відкрити його для запису та вимкнення попередження. (Надав Сергій Сторчака в bpo-28286.)Deprecated the
split()
method of_tkinter.TkappType
in favour of thesplitlist()
method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)Явне передавання об’єктів співпрограми до
asyncio.wait()
застаріло та буде видалено у версії 3.11. (Надано Юрієм Селівановим і Кайлом Стенлі в bpo-34790.)binhex4 and hexbin4 standards are now deprecated. The
binhex
module and the followingbinascii
functions are now deprecated:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Надав Віктор Стіннер у bpo-39353.)
ast
класиslice
,Index
іExtSlice
вважаються застарілими та будуть видалені в майбутніх версіях Python. Самезначення
слід використовувати замістьІндекс(значення)
.Tuple(slices, Load())
слід використовувати замістьExtSlice(slices)
. (Надав Сергій Сторчака в bpo-34822.)ast
класиSuite
,Param
,AugLoad
іAugStore
вважаються застарілими та будуть видалені в майбутніх версіях Python. Вони не були згенеровані парсером і не прийняті генератором коду в Python 3. (Надано Batuhan Taskaya в bpo-39639 і bpo-39969 та Сергій Сторчака в bpo-39988.)The
PyEval_InitThreads()
andPyEval_ThreadsInitialized()
functions are now deprecated and will be removed in Python 3.11. CallingPyEval_InitThreads()
now does nothing. The GIL is initialized byPy_Initialize()
since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)Передача
None
як першого аргументу функціїshlex.split()
застаріла. (Надав Закері Шпітц у bpo-33262.)smtpd.MailmanProxy()
is now deprecated as it is unusable without an external module,mailman
. (Contributed by Samuel Colvin in bpo-35800.)Модуль
lib2to3
тепер видаєPendingDeprecationWarning
. Python 3.9 перейшов на синтаксичний аналізатор PEG (див. PEP 617), а Python 3.10 може включати новий синтаксис мови, який не аналізується парсером LL(1) lib2to3. Модульlib2to3
може бути видалено зі стандартної бібліотеки в майбутній версії Python. Розгляньте сторонні альтернативи, такі як LibCST або parso. (Надано Карлом Майєром у bpo-40360.)Параметр random
random.shuffle()
застарів. (Надав Реймонд Геттінгер у bpo-40465)
Видалено¶
The erroneous version at
unittest.mock.__version__
has been removed.nntplib.NNTP
:xpath()
andxgtitle()
methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. Forxgtitle()
, please usenntplib.NNTP.descriptions()
ornntplib.NNTP.description()
instead. (Contributed by Donghee Na in bpo-39366.)array.array
: методиtostring()
таfromstring()
видалено. Це були псевдоніми дляtobytes()
іfrombytes()
, застарілих з Python 3.2. (Надав Віктор Стіннер у bpo-38916.)Недокументовану функцію
sys.callstats()
було видалено. Починаючи з Python 3.7, він був застарілим і завжди повертавNone
. Для цього потрібен був спеціальний параметр збіркиCALL_PROFILE
, який уже було видалено в Python 3.7. (Надав Віктор Стіннер у bpo-37414.)Функції
sys.getcheckinterval()
іsys.setcheckinterval()
були видалені. Вони застаріли з Python 3.2. Замість цього використовуйтеsys.getswitchinterval()
іsys.setswitchinterval()
. (Надав Віктор Стіннер у bpo-37392.)Функцію C
PyImport_Cleanup()
видалено. Це було задокументовано як: «Очистити таблицю модулів. Тільки для внутрішнього використання». (Надав Віктор Стіннер у bpo-36710.)Модулі
_dummy_thread
іdummy_threading
видалено. Ці модулі застаріли з Python 3.7, який потребує підтримки потоків. (Надав Віктор Стіннер у bpo-37312.)aifc.openfp()
alias toaifc.open()
,sunau.openfp()
alias tosunau.open()
, andwave.openfp()
alias towave.open()
have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)The
isAlive()
method ofthreading.Thread
has been removed. It was deprecated since Python 3.8. Useis_alive()
instead. (Contributed by Donghee Na in bpo-37804.)Методи
getchildren()
іgetiterator()
класівElementTree
іElement
в МодульElementTree
видалено. Вони були застарілі в Python 3.2. Використовуйтеiter(x)
абоlist(x)
замістьx.getchildren()
таx.iter()
абоlist(x.iter())
замістьx.getiterator()
. (Надав Сергій Сторчака в bpo-36543.)Старий API
plistlib
було видалено, він застарів з Python 3.4. Використовуйте функціїload()
,loads()
,dump()
іdumps()
. Крім того, було видалено параметр use_builtin_types, замість нього завжди використовуються стандартні об’єктиbytes
. (Надав Джон Янзен у bpo-36409.)Функцію C
PyGen_NeedsFinalizing
видалено. Він не був задокументований, протестований або використаний будь-де в CPython після впровадження PEP 442. Патч від Joannah Nanjekye. (Надано Joannah Nanjekye в bpo-15088)base64.encodestring()
іbase64.decodestring()
, псевдоніми, які застаріли з Python 3.1, були видалені: замість них використовуйтеbase64.encodebytes()
іbase64.decodebytes()
. (Надав Віктор Стіннер у bpo-39351.)Функцію
fractions.gcd()
видалено, вона застаріла з Python 3.5 (bpo-22486): замість неї використовуйтеmath.gcd()
. (Надав Віктор Стіннер у bpo-39350.)Параметр buffering
bz2.BZ2File
було видалено. Починаючи з Python 3.0, він ігнорувався, і його використання видавалоDeprecationWarning
. Передайте відкритий файловий об’єкт, щоб контролювати, як відкривається файл. (Надав Віктор Стіннер у bpo-39357.)Параметр encoding
json.loads()
видалено. Починаючи з Python 3.1, він був застарілим і ігнорувався; його використання видавалоDeprecationWarning
, починаючи з Python 3.8. (Надано Інадою Наокі в bpo-39377)Оператори
with (чекати asyncio.lock):
іwith (вихід від asyncio.lock):
більше не підтримуються, використовуйте замість нихasync with lock
. Те саме правильно дляasyncio.Condition
іasyncio.Semaphore
. (Надав Ендрю Свєтлов у bpo-34793.)The
sys.getcounts()
function, the-X showalloccount
command line option and theshow_alloc_count
field of the C structurePyConfig
have been removed. They required a special Python build by definingCOUNT_ALLOCS
macro. (Contributed by Victor Stinner in bpo-39489.)Атрибут
_field_types
класуtyping.NamedTuple
було видалено. Він був застарілим, починаючи з Python 3.8. Натомість використовуйте атрибут__annotations__
. (Надав Сергій Сторчака в bpo-40182.)The
symtable.SymbolTable.has_exec()
method has been removed. It was deprecated since 2006, and only returningFalse
when it’s called. (Contributed by Batuhan Taskaya in bpo-40208)The
asyncio.Task.current_task()
andasyncio.Task.all_tasks()
have been removed. They were deprecated since Python 3.7 and you can useasyncio.current_task()
andasyncio.all_tasks()
instead. (Contributed by Rémi Lapeyre in bpo-40967)Метод
unescape()
у класіhtml.parser.HTMLParser
було видалено (він був застарілим з Python 3.4).html.unescape()
слід використовувати для перетворення посилань на символи у відповідні символи Unicode.
Перенесення на Python 3.9¶
У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.
Зміни в API Python¶
__import__()
іimportlib.util.resolve_name()
тепер викликаютьImportError
там, де раніше викликалиValueError
. Викликачі, які перехоплюють певний тип винятку та підтримують як Python 3.9, так і попередні версії, повинні будуть перехопити обидва за допомогоюexcept (ImportError, ValueError):
.Скрипти активації
venv
більше не виключають особливий випадок, коли для__VENV_PROMPT__
встановлено значення""
.The
select.epoll.unregister()
method no longer ignores theEBADF
error. (Contributed by Victor Stinner in bpo-39239.)Параметр compresslevel
bz2.BZ2File
став лише ключовим словом, оскільки параметр buffering було видалено. (Надав Віктор Стіннер у bpo-39357.)Спрощений AST для підписки. Прості індекси будуть представлені їх значеннями, розширені зрізи будуть представлені як кортежі.
Index(value)
поверне самеvalue
,ExtSlice(slices)
повернеTuple(slices, Load())
. (Надав Сергій Сторчака в bpo-34822.)Модуль
importlib
тепер ігнорує змінну середовищаPYTHONCASEOK
, коли використовуються параметри командного рядка-E
або-I
.Параметр encoding додано до класів
ftplib.FTP
іftplib.FTP_TLS
як параметр лише для ключового слова, а стандартне кодування змінено з Latin-1 на UTF-8 на слідувати RFC 2640.asyncio.loop.shutdown_default_executor()
додано доAbstractEventLoop
, тобто альтернативні цикли подій, які успадковуються від нього, повинні мати цей метод. (Надав Кайл Стенлі в bpo-34037.)Постійні значення майбутніх прапорів у модулі
__future__
оновлюються, щоб запобігти зіткненню з прапорами компілятора. РанішеPyCF_ALLOW_TOP_LEVEL_AWAIT
конфліктував зCO_FUTURE_DIVISION
. (Надав Batuhan Taskaya в bpo-39562)array('u')
now useswchar_t
as C type instead ofPy_UNICODE
. This change doesn’t affect to its behavior becausePy_UNICODE
is alias ofwchar_t
since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)logging.getLogger()
API тепер повертає кореневий реєстратор, коли йому передається ім’я'root'
, тоді як раніше він повертав некореневий реєстратор під назвою'root'
. Це може вплинути на випадки, коли код користувача явно бажає мати некореневий реєстратор під назвою'root'
або створює екземпляр реєстратора за допомогоюlogging.getLogger(__name__)
в якомусь модулі верхнього рівня під назвою'root. py''
. (Надав Віней Саджип у bpo-37742.)Division handling of
PurePath
now returnsNotImplemented
instead of raising aTypeError
when passed something other than an instance ofstr
orPurePath
. This allows creating compatible classes that don’t inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).Починаючи з Python 3.9.5, модуль
ipaddress
більше не приймає жодних початкових нулів у рядках адрес IPv4. Початкові нулі є неоднозначними та інтерпретуються деякими бібліотеками як вісімкове позначення. Наприклад, застаріла функціяsocket.inet_aton()
розглядає початкові нулі як вісімкове позначення. glibc реалізація сучасногоinet_pton()
не приймає жодних початкових нулів. (Надав Крістіан Хеймс у bpo-36384).codecs.lookup()
тепер нормалізує назву кодування так само, якencodings.normalize_encoding()
, за винятком того, щоcodecs.lookup()
також перетворює назву на нижній регістр. Наприклад, назву кодування"latex+latin1"
тепер нормалізовано до"latex_latin1"
. (Надав Джордон Сю в bpo-37751.)
Зміни в C API¶
Екземпляри виділених у купі типів (наприклад, створених за допомогою
PyType_FromSpec()
та подібних API) містять посилання на свій об’єкт типу, починаючи з Python 3.8. Як зазначено в розділі «Зміни в API C» Python 3.8, у переважній більшості випадків побічних ефектів не повинно бути, але для типів, які мають спеціальну функціюtp_traverse
, переконайтеся, що усі призначені для користувача функціїtp_traverse
типів, виділених у купі, відвідують тип об’єкта.приклад:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
Якщо ваша функція переходу делегує
tp_traverse
свого базового класу (або іншого типу), переконайтеся, щоPy_TYPE(self)
відвідується лише один раз. Зауважте, що очікується, що лише тип купи відвідає тип уtp_traverse
.Наприклад, якщо ваша функція
tp_traverse
містить:base->tp_traverse(self, visit, arg)
потім додайте:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
(Див. bpo-35810 і bpo-40217 для отримання додаткової інформації.)
Функції
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
іPyEval_CallObjectWithKeywords
застаріли. Замість цього використовуйтеPyObject_Call()
та його варіанти. (Детальніше див. у bpo-29548.)
Зміни байт-коду CPython¶
Код операції
LOAD_ASSERTION_ERROR
додано для обробки оператораassert
. Раніше оператор assert не працював належним чином, якщо винятокAssertionError
затінявся. (Надав Закері Шпітц у bpo-34880.)Код операції
COMPARE_OP
було розділено на чотири окремі інструкції:COMPARE_OP
для насичених порівняньIS_OP
для тестів «є» і «не є».CONTAINS_OP
для тестів «in» і «not in».JUMP_IF_NOT_EXC_MATCH
для перевірки винятків у операторах „try-except“.
(Надав Марк Шеннон у bpo-39156.)
Зміни збірки¶
Added
--with-platlibdir
option to theconfigure
script: name of the platform-specific library directory, stored in the newsys.platlibdir
attribute. Seesys.platlibdir
attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)Спеціальний макрос збірки
COUNT_ALLOCS
видалено. (Надав Віктор Стіннер у bpo-39489.)On non-Windows platforms, the
setenv()
andunsetenv()
functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)На платформах, відмінних від Windows, створення інсталяторів
bdist_wininst
тепер офіційно не підтримується. (Додаткову інформацію див. bpo-10945.)When building Python on macOS from source,
_tkinter
now links with non-system Tcl and Tk frameworks if they are installed in/Library/Frameworks
, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using--enable-universalsdk
or-isysroot
, only the SDK itself is searched. The default behavior can still be overridden with--with-tcltk-includes
and--with-tcltk-libs
. (Contributed by Ned Deily in bpo-34956.)Тепер Python можна створити для Windows 10 ARM64. (Надав Стів Дауер у bpo-33125.)
Деякі окремі тести тепер пропускаються, коли використовується
--pgo
. Тести, про які йдеться, значно збільшили час виконання завдання PGO і, ймовірно, не допомогли покращити оптимізацію остаточного виконуваного файлу. Це прискорює завдання приблизно в 15 разів. Запуск повного набору модульних тестів повільний. Ця зміна може призвести до дещо менш оптимізованої збірки, оскільки буде виконано не так багато гілок коду. Якщо ви бажаєте почекати на набагато повільнішу збірку, стару поведінку можна відновити за допомогою./configure [..] PROFILE_TASK="-m test --pgo-extended"
. Ми не гарантуємо, який набір завдань PGO забезпечує швидшу збірку. Небайдужі користувачі повинні запускати власні релевантні тести, оскільки результати можуть залежати від середовища, робочого навантаження та ланцюга інструментів компілятора. (Додаткову інформацію див. у bpo-36044 і bpo-37707.)
Зміни C API¶
Нові можливості¶
PEP 573: Added
PyType_FromModuleAndSpec()
to associate a module with a class;PyType_GetModule()
andPyType_GetModuleState()
to retrieve the module and its state; andPyCMethod
andMETH_METHOD
to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)Додано функцію
PyFrame_GetCode()
: отримати код кадру. Додано функціюPyFrame_GetBack()
: отримати кадр наступного зовнішнього кадру. (Надав Віктор Стіннер у bpo-40421.)Додано
PyFrame_GetLineNumber()
до обмеженого C API. (Надав Віктор Стіннер у bpo-40421.)Додано функції
PyThreadState_GetInterpreter()
іPyInterpreterState_Get()
для отримання інтерпретатора. Додано функціюPyThreadState_GetFrame()
для отримання поточного кадру стану потоку Python. Додано функціюPyThreadState_GetID()
: отримати унікальний ідентифікатор стану потоку Python. (Надав Віктор Стіннер у bpo-39947.)Додано нову загальнодоступну функцію
PyObject_CallNoArgs()
до C API, яка викликає об’єкт Python без аргументів. Це найефективніший спосіб викликати викликаний об’єкт Python без аргументів. (Надав Віктор Стіннер у bpo-37194.)Зміни в обмеженому API C (якщо визначено макрос
Py_LIMITED_API
):Надайте
Py_EnterRecursiveCall()
іPy_LeaveRecursiveCall()
як звичайні функції для обмеженого API. Раніше вони були визначені як макроси, але ці макроси не компілювалися з обмеженим C API, який не може отримати доступ до поляPyThreadState.recursion_depth
(структура непрозора в обмеженому C API).PyObject_INIT()
іPyObject_INIT_VAR()
стають звичайними «непрозорими» функціями для приховування деталей реалізації.
The
PyModule_AddType()
function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)До загальнодоступного API додано функції
PyObject_GC_IsTracked()
іPyObject_GC_IsFinalized()
, щоб дозволити запитувати, чи об’єкти Python зараз відстежуються чи вони вже завершені збирачем сміття відповідно. (Надав Пабло Галіндо Сальгадо в bpo-40241.)Added
_PyObject_FunctionStr()
to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)Додано
PyObject_CallOneArg()
для виклику об’єкта з одним позиційним аргументом (Патч від Jeroen Demeyer у bpo-37483.)
Перенесення на Python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) тепер вимагає нового обов’язкового параметра tstate (PyThreadState*
). (Надав Віктор Стіннер у bpo-38500.)Модулі розширення:
m_traverse
,m_clear
іm_free
функціїPyModuleDef
відсутні більше викликається, якщо стан модуля було запитано, але ще не виділено. Це відбувається одразу після створення модуля та перед його виконанням (функціяPy_mod_exec
). Точніше, ці функції не викликаються, якщоm_size
більше 0 і стан модуля (як повертаєтьсяPyModule_GetState()
) єNULL
.Модулі розширення без стану модуля (
m_size <= 0
) не впливають.Якщо
Py_AddPendingCall()
викликається в субінтерпретаторі, функція тепер запланована для виклику з субінтерпретатора, а не з основного інтерпретатора. Кожен субінтерпретатор тепер має власний список запланованих викликів. (Надав Віктор Стіннер у bpo-39984.)Реєстр Windows більше не використовується для ініціалізації
sys.path
, коли використовується параметр-E
(якщоPyConfig.use_environment
має значення0
). Це важливо під час вбудовування Python у Windows. (Надав Закері Шпітц у bpo-8901.)Глобальна змінна
PyStructSequence_UnnamedField
тепер є константою та посилається на постійний рядок. (Надав Сергій Сторчака в bpo-38650.)The
PyGC_Head
structure is now opaque. It is only defined in the internal C API (pycore_gc.h
). (Contributed by Victor Stinner in bpo-40241.)The
Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
, andPyUnicode_AsUnicodeAndSize()
are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)Функцію
Py_FatalError()
замінено на макрос, який автоматично записує назву поточної функції, якщо не визначено макросPy_LIMITED_API
. (Надав Віктор Стіннер у bpo-39882.)Протокол vectorcall тепер вимагає, щоб абонент передавав лише рядки як імена ключових слів. (Додаткову інформацію див. bpo-37540.)
Деталі реалізації ряду макросів і функцій тепер приховано:
PyObject_IS_GC()
макрос перетворено на функцію.The
PyObject_NEW()
macro becomes an alias to thePyObject_New
macro, and thePyObject_NEW_VAR()
macro becomes an alias to thePyObject_NewVar
macro. They no longer access directly thePyTypeObject.tp_basicsize
member.PyObject_GET_WEAKREFS_LISTPTR()
macro was converted to a function: the macro accessed directly thePyTypeObject.tp_weaklistoffset
member.Макрос
PyObject_CheckBuffer()
було перетворено на функцію: макрос мав прямий доступ до елементаPyTypeObject.tp_as_buffer
.PyIndex_Check()
тепер завжди оголошується як непрозора функція, щоб приховати деталі реалізації: видалено макросPyIndex_Check()
. Макрос звертався безпосередньо до членаPyTypeObject.tp_as_number
.
(Додаткову інформацію див. bpo-40170.)
Видалено¶
Макроси
PyFPE_START_PROTECT()
іPyFPE_END_PROTECT()
макросиpyfpe.h
виключено з обмеженого C API. (Надав Віктор Стіннер у bpo-38835.)Слот
tp_print
PyTypeObject видалено. Він використовувався для друку об’єктів у файли в Python 2.7 і раніше. Починаючи з Python 3.0, він ігнорувався та не використовувався. (Надано Jeroen Demeyer у bpo-36974.)Зміни в обмеженому API C (якщо визначено макрос
Py_LIMITED_API
):Виключено такі функції з обмеженого C API:
PyThreadState_DeleteCurrent()
(Надано Joannah Nanjekye в bpo-37878.)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
Механізм кошика, який ніколи не працював в обмеженому C API.
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
Перенесено такі функції та визначення до внутрішнього C API:
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(специфічний для збіркиPy_TRACE_REFS
)
Вилучено хук
_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 gh-87451)
Notable changes in Python 3.9.5¶
urllib.parse¶
The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline \n
, \r
and tab \t
characters are stripped from the
URL by the parser in urllib.parse
preventing such attacks. The removal
characters are controlled by a new module level variable
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (See gh-88048)
Notable security feature in 3.9.14¶
Converting between int
and str
in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a ValueError
if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for CVE 2020-10735.
This limit can be configured or disabled by environment variable, command
line flag, or sys
APIs. See the integer string conversion
length limitation documentation. The default limit
is 4300 digits in string form.
Notable changes in 3.9.17¶
tarfile¶
The extraction methods in
tarfile
, 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.)