Що нового в Python 3.7¶
- редактор:
Elvis Pranskevichus <elvis@magic.io>
У цій статті пояснюється нові функції в Python 3.7 порівняно з 3.6. Python 3.7 було випущено 27 червня 2018 року. Щоб отримати повну інформацію, перегляньте журнал змін.
Підсумок – Основні моменти випуску¶
Нові функції синтаксису:
PEP 563, відкладена оцінка анотацій типу.
Зворотно несумісні зміни синтаксису:
Нові бібліотечні модулі:
Нові вбудовані функції:
PEP 553, нова функція
breakpoint()
.
Покращення моделі даних Python:
PEP 562, налаштування доступу до атрибутів модуля.
PEP 560, основна підтримка модуля введення тексту та загальних типів.
природа збереження порядку вставки dict об’єктів була оголошена (has been declared) офіційною частиною специфікації мови Python.
Значні вдосконалення стандартної бібліотеки:
Модуль
asyncio
отримав нові функції, значні зручність використання та покращення продуктивності.Модуль
time
отримав підтримку функцій з наносекундною роздільною здатністю.
Покращення реалізації CPython:
Уникнення використання ASCII як стандартного кодування тексту:
PEP 552, детермінований .pycs
PEP 565, покращено обробку
DeprecationWarning
Покращення C API:
PEP 539, новий C API для потокового локального зберігання
Покращення документації:
PEP 545, переклади документації Python
Нові переклади документації: Японський, Французький, Корейський.
Цей випуск містить помітні покращення продуктивності в багатьох сферах. Розділ Оптимізації містить їх детальний перелік.
Перелік змін, які можуть вплинути на сумісність із попередніми випусками Python, див. у розділі Перенесення на Python 3.7.
Нові можливості¶
PEP 563: Відкладена оцінка анотацій¶
Поява підказок типу в Python виявила дві кричущі проблеми зручності використання функціональних можливостей анотацій, доданих у PEP 3107 і вдосконалених у PEP 526:
анотації могли використовувати лише імена, які вже були доступні в поточному діапазоні, іншими словами, вони не підтримували жодних прямих посилань; і
анотування вихідного коду мало негативний вплив на час запуску програм Python.
Обидві ці проблеми вирішуються шляхом відкладення оцінки анотацій. Замість компіляції коду, який виконує вирази в анотаціях під час їх визначення, компілятор зберігає анотацію у формі рядка, еквівалентну AST відповідного виразу. За потреби анотації можна розв’язати під час виконання за допомогою typing.get_type_hints()
. У звичайному випадку, коли це не потрібно, анотації дешевше зберігати (оскільки короткі рядки інтернуються інтерпретатором) і пришвидшують час запуску.
З точки зору зручності використання анотації тепер підтримують прямі посилання, що робить наступний синтаксис дійсним:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Оскільки ця зміна порушує сумісність, нову поведінку потрібно ввімкнути на основі кожного модуля в Python 3.7 за допомогою __future__
import:
from __future__ import annotations
Він стане типовим у Python 3.10.
Дивись також
- PEP 563 – Відкладена оцінка анотацій
PEP написав і реалізував Лукаш Ланга.
PEP 538: Застаріле C Локальний примус¶
Постійним завданням у серії Python 3 було визначення розумної стратегії за замовчуванням для обробки припущення про кодування тексту «7-bit ASCII», яке зараз передбачається використанням стандартної локалі C або POSIX на платформах, відмінних від Windows.
PEP 538 оновлює інтерфейс командного рядка інтерпретатора за замовчуванням для автоматичного приведення цієї локалі до доступної локалі на основі UTF-8, як описано в документації нової змінної середовища PYTHONCOERCECLOCALE
. Автоматичне встановлення LC_CTYPE
таким чином означає, що як основний інтерпретатор, так і розширення C з урахуванням локалі (такі як readline
) передбачатимуть використання UTF-8 як стандартне кодування тексту, а не ASCII.
Визначення підтримки платформи в PEP 11 також було оновлено, щоб обмежити підтримку обробки повного тексту належним чином налаштованими локалями, що не базуються на ASCII.
У рамках цієї зміни типовим обробником помилок для stdin
і stdout
тепер є surrogateescape
(а не strict
) під час використання будь-якого з визначені цільові локалі примусу (наразі C.UTF-8
, C.utf8
і UTF-8
). Обробником помилок за замовчуванням для stderr
залишається backslashreplace
, незалежно від локалі.
За замовчуванням примусове налаштування локалі мовчить, але для допомоги в налагодженні потенційно пов’язаних з локалізацією проблем інтеграції можна запитати явні попередження (видані безпосередньо на stderr
), встановивши PYTHONCOERCECLOCALE=warn
. Цей параметр також призведе до того, що середовище виконання Python видасть попередження, якщо застаріла локаль C залишається активною під час ініціалізації основного інтерпретатора.
У той час як примусове налаштування локалі PEP 538 має перевагу, оскільки також впливає на модулі розширення (такі як GNU readline
), а також на дочірні процеси (включно з тими, які запускають програми, відмінні від Python, і старіші версії Python), недоліком цього є те, що в запущеній системі потрібна відповідна цільова локаль. Для кращої обробки випадків, коли немає відповідної цільової локалі (як це відбувається, наприклад, у RHEL/CentOS 7), Python 3.7 також реалізує PEP 540: примусовий режим виконання UTF-8.
Дивись також
- PEP 538 – Приведення застарілої локалі C до локалі на основі UTF-8
PEP написав і реалізував Нік Коглан.
PEP 540: примусовий режим виконання UTF-8¶
Новий параметр командного рядка -X
utf8
і змінну середовища PYTHONUTF8
можна використовувати для ввімкнення режиму Python UTF-8.
У режимі UTF-8 CPython ігнорує налаштування мови та використовує кодування UTF-8 за замовчуванням. Обробники помилок для потоків sys.stdin
і sys.stdout
мають значення surrogateescape
.
Примусовий режим UTF-8 можна використовувати для зміни поведінки обробки тексту у вбудованому інтерпретаторі Python без зміни налаштувань мови програми для вбудовування.
Хоча режим UTF-8 PEP 540 має перевагу в тому, що працює незалежно від того, які локалі доступні у запущеній системі, він має недолік — не впливає на модулі розширення (такі як GNU readline
). , дочірні процеси, які запускають програми, відмінні від Python, і дочірні процеси, які запускають старіші версії Python. Щоб зменшити ризик пошкодження текстових даних під час обміну даними з такими компонентами, Python 3.7 також реалізує PEP 540: примусовий режим виконання UTF-8).
Режим UTF-8 увімкнуто за замовчуванням, якщо локаль C
або POSIX
, а функція примусового налаштування локалі PEP 538 не може змінити його на альтернативу на основі UTF-8 (чи це помилка спричинена встановленням PYTHONCOERCECLOCALE=0
, LC_ALL
або відсутністю відповідної цільової локалі).
Дивись також
- PEP 540 – Додати новий режим UTF-8
PEP написав і реалізував Віктор Стіннер
PEP 553: вбудована breakpoint()
¶
Python 3.7 містить нову вбудовану функцію breakpoint()
як простий і послідовний спосіб входу в налагоджувач Python.
Вбудований breakpoint()
викликає sys.breakpointhook()
. За замовчуванням останній імпортує pdb
, а потім викликає pdb.set_trace()
, але шляхом прив’язки sys.breakpointhook()
до функції за вашим вибором, breakpoint()
може ввести будь-який налагоджувач. Крім того, змінну середовища PYTHONBREAKPOINT
можна встановити як виклик вашого вибраного налагоджувача. Встановіть PYTHONBREAKPOINT=0
, щоб повністю вимкнути вбудовану breakpoint()
.
Дивись також
- PEP 553 – Вбудована точка зупину()
PEP написаний і реалізований Баррі Варшавою
PEP 539: новий C API для потокового локального зберігання¶
While Python provides a C API for thread-local storage support; the existing Thread Local Storage (TLS) API has used int to represent TLS keys across all platforms. This has not generally been a problem for officially support platforms, but that is neither POSIX-compliant, nor portable in any practical sense.
PEP 539 changes this by providing a new Thread Specific Storage (TSS)
API to CPython which supersedes use of the
existing TLS API within the CPython interpreter, while deprecating the existing
API. The TSS API uses a new type Py_tss_t
instead of int
to represent TSS keys–an opaque type the definition of which may depend on
the underlying TLS implementation. Therefore, this will allow to build CPython
on platforms where the native TLS key is defined in a way that cannot be safely
cast to int.
Note that on platforms where the native TLS key is defined in a way that cannot be safely cast to int, all functions of the existing TLS API will be no-op and immediately return failure. This indicates clearly that the old API is not supported on platforms where it cannot be used reliably, and that no effort will be made to add such support.
Дивись також
- PEP 539 – Новий C-API для локального зберігання потоків у CPython
PEP, автор Ерік М. Брей; виконання Масаюкі Ямамото.
PEP 562: Налаштування доступу до атрибутів модуля¶
Python 3.7 дозволяє визначати __getattr__()
для модулів і викликає його щоразу, коли атрибут модуля іншим чином не знайдено. Тепер також дозволено визначення __dir__()
для модулів.
Типовим прикладом того, де це може бути корисним, є припинення використання атрибутів модуля та відкладене завантаження.
Дивись також
- PEP 562 – Модуль
__getattr__
і__dir__
PEP написав і реалізував Іван Левківський
PEP 564: Нові функції часу з наносекундною роздільною здатністю¶
Роздільна здатність годинників у сучасних системах може перевищувати обмежену точність числа з плаваючою комою, що повертається функцією time.time()
та її варіантами. Щоб уникнути втрати точності, PEP 564 додає шість нових «наносекундних» варіантів існуючих функцій таймера до модуля time
:
Нові функції повертають кількість наносекунд як ціле число.
Measurements
show that on Linux and Windows the resolution of time.time_ns()
is
approximately 3 times better than that of time.time()
.
Дивись також
- PEP 564 – Додайте нові функції часу з роздільною здатністю наносекунд
PEP написав і реалізував Віктор Стіннер
PEP 565: Показати DeprecationWarning у __main__
¶
Стандартну обробку DeprecationWarning
було змінено таким чином, що ці попередження знову відображаються за замовчуванням, але лише тоді, коли код, який їх ініціює, виконується безпосередньо в модулі __main__
. Як наслідок, розробники однофайлових сценаріїв і ті, хто використовує Python в інтерактивному режимі, повинні знову почати бачити попередження про застаріння для API, які вони використовують, але попередження про застаріння, викликані імпортованими програмними, бібліотечними та фреймворковими модулями, будуть і надалі приховані за замовчуванням.
У результаті цієї зміни стандартна бібліотека тепер дозволяє розробникам вибирати між трьома різними способами попередження про застарілу дію:
FutureWarning
: завжди відображається за умовчанням, рекомендовано для попереджень, призначених для перегляду кінцевими користувачами програми (наприклад, для застарілих налаштувань конфігурації програми).DeprecationWarning
: відображається за замовчуванням лише в__main__
і під час виконання тестів, рекомендовано для попереджень, призначених для перегляду іншими розробниками Python, коли оновлення версії може призвести до зміни поведінки або помилки.PendingDeprecationWarning
: відображається за замовчуванням лише під час виконання тестів, призначених для випадків, коли майбутнє оновлення версії змінить категорію попередження наDeprecationWarning
абоFutureWarning
.
Раніше і DeprecationWarning
, і PendingDeprecationWarning
були видимі лише під час виконання тестів, що означало, що розробники, які переважно пишуть однофайлові сценарії або використовують Python в інтерактивному режимі, можуть бути здивовані несправними змінами в API, які вони використовували.
Дивись також
- PEP 565 – Показати DeprecationWarning у
__main__
PEP написав і реалізував Нік Коглан
PEP 560: Основна підтримка модуля введення
і загальних типів¶
Спочатку PEP 484 було розроблено таким чином, щоб не вносити жодних змін до основного інтерпретатора CPython. Тепер підказки щодо типів і модуль typing
широко використовуються спільнотою, тому це обмеження знято. PEP представляє два спеціальні методи __class_getitem__()
і __mro_entries__
, ці методи тепер використовуються більшістю класів і спеціальних конструкцій у typing
. В результаті швидкість різних операцій з типами зросла до 7 разів, загальні типи можна використовувати без конфліктів метакласів, а також виправлено кілька давніх помилок в модулі typing
.
Дивись також
- PEP 560 – Основна підтримка модуля введення тексту та загальних типів
PEP написав і реалізував Іван Левківський
PEP 552: Файли .pyc на основі хешу¶
Python традиційно перевіряє актуальність файлів кешу байт-кодів (тобто файлів .pyc
), порівнюючи метадані джерела (мітку часу та розмір останньої зміни) із метаданими джерела, збереженими в заголовку файлу кешу, коли він був створений. Хоча цей метод визнання недійсним ефективний, він має свої недоліки. Якщо мітки часу файлової системи занадто грубі, Python може пропустити вихідні оновлення, що призведе до плутанини користувачів. Крім того, наявність мітки часу у файлі кешу є проблематичною для відтворюваності збірки і систем збірки на основі вмісту.
PEP 552 розширює формат pyc, дозволяючи використовувати хеш вихідного файлу для визнання недійсним замість мітки часу джерела. Такі файли .pyc
називаються «на основі хешу». За замовчуванням Python усе ще використовує недійсність на основі мітки часу та не створює файли .pyc
на основі хешу під час виконання. Файли .pyc
на основі хешу можуть бути згенеровані за допомогою py_compile
або compileall
.
Файли .pyc
на основі хешу бувають двох варіантів: позначені та не позначені. Python перевіряє перевірені хеш-файли .pyc
на відповідність вихідним файлам під час виконання, але не робить цього для неперевірених хеш-файлів pycs. Файли .pyc
на основі неперевірених хешів є корисною оптимізацією продуктивності для середовищ, де зовнішня по відношенню до Python система (наприклад, система збірки) відповідає за підтримку файлів .pyc
в актуальному стані.
Перегляньте Анулювання кешованого байт-коду для отримання додаткової інформації.
Дивись також
- PEP 552 – Детерміновані зображення
PEP написав і реалізував Бенджамін Петерсон
PEP 545: Переклади документації Python¶
PEP 545 описує процес створення та підтримки перекладів документації Python.
Додано три нові переклади:
Японська: https://docs.python.org/ja/
Французька: https://docs.python.org/fr/
Корейська: https://docs.python.org/ko/
Дивись також
- PEP 545 – Переклади документації Python
PEP написаний і реалізований Жульєном Палардом, Інадою Наокі та Віктором Стіннером.
Режим розробки Python (-X dev)¶
Новий параметр командного рядка -X
dev
або нову змінну середовища PYTHONDEVMODE
можна використовувати, щоб увімкнути Режим розробки Python. У режимі розробки Python виконує додаткові перевірки під час виконання, які занадто дорогі, щоб їх можна було ввімкнути за замовчуванням. Дивіться документацію Python Development Mode для повного опису.
Інші зміни мови¶
Вираз
await
і розуміння, що містять пунктasync for
, були незаконними у виразах у форматованих рядкових літералах через проблему з реалізацією. У Python 3.7 це обмеження було знято.Функції тепер можна передати більше 255 аргументів, а функція тепер може мати більше 255 параметрів. (Надав Сергій Сторчака в bpo-12844 і bpo-18896.)
bytes.fromhex()
іbytearray.fromhex()
тепер ігнорують усі пробіли ASCII, а не лише пробіли. (Надав Роберт Сяо в bpo-28927.)str
,bytes
іbytearray
отримали підтримку нового методуisascii()
, який можна використовувати для перевірки того, чи рядок або байти містять лише символи ASCII. (Надано INADA Naoki в bpo-32677.)ImportError
тепер відображає назву модуля та шлях до модуля__file__
, колиfrom ... import ...
не вдається. (Надав Матіас Бюссонньє в bpo-29546.)Тепер підтримується циклічний імпорт, що включає абсолютний імпорт із прив’язкою підмодуля до імені. (Надав Сергій Сторчака в bpo-30024.)
object.__format__(x, '')
тепер еквівалентнийstr(x)
, а неformat(str(self), '')
. (Надав Сергій Сторчака в bpo-28974.)In order to better support dynamic creation of stack traces,
types.TracebackType
can now be instantiated from Python code, and thetb_next
attribute on tracebacks is now writable. (Contributed by Nathaniel J. Smith in bpo-30579.)Якщо використовується перемикач
-m
,sys.path[0]
тепер швидко розгортається до повного початкового шляху каталогу, а не залишається порожнім каталогом (що дозволяє імпортувати з поточного робочий каталог під час імпорту) (Надано Ніком Когланом у bpo-33053.)Новий параметр
-X
importtime
або змінну середовищаPYTHONPROFILEIMPORTTIME
можна використовувати для відображення часу імпорту кожного модуля. (Надано Інадою Наокі в bpo-31415.)
Нові модулі¶
контекстні змінні¶
Новий модуль contextvars
і набір нових API C запроваджують підтримку контекстних змінних. Змінні контексту концептуально подібні до локальних змінних потоку. На відміну від TLS, контекстні змінні правильно підтримують асинхронний код.
Модулі asyncio
і decimal
оновлено для використання та підтримки контекстних змінних із коробки. Зокрема, активний десятковий контекст тепер зберігається в контекстній змінній, що дозволяє десятковим операціям працювати з правильним контекстом в асинхронному коді.
Дивись також
- PEP 567 – Контекстні змінні
PEP написав і реалізував Юрій Селіванов
класи даних¶
Новий декоратор dataclass()
забезпечує спосіб оголошення класів даних. Клас даних описує свої атрибути за допомогою анотацій змінних класу. Його конструктор та інші чарівні методи, такі як __repr__()
, __eq__()
і __hash__()
генеруються автоматично.
Приклад:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
Дивись також
- PEP 557 – Класи даних
PEP написаний і реалізований Еріком В. Смітом
importlib.resources¶
Новий модуль importlib.resources
надає кілька нових API і один новий ABC для доступу, відкриття та читання ресурсів у пакунках. Ресурси приблизно схожі на файли всередині пакетів, але вони не обов’язково повинні бути фактичними файлами у фізичній файловій системі. Завантажувачі модулів можуть надати функцію get_resource_reader()
, яка повертає екземпляр importlib.abc.ResourceReader
для підтримки цього нового API. Це підтримують як вбудовані завантажувачі шляхів файлів, так і завантажувачі zip-файлів.
Надано Баррі Варшау та Бреттом Кенноном у bpo-32248.
Дивись також
importlib_resources – a PyPI backport for earlier Python versions.
Покращені модулі¶
argparse¶
Новий метод ArgumentParser.parse_intermixed_args()
дозволяє змішувати параметри та позиційні аргументи. (Надано paul.j3 у bpo-14191.)
asyncio¶
Модуль asyncio
отримав багато нових функцій, зручність використання та покращення продуктивності. Помітні зміни включають:
Нову функцію provisional
asyncio.run()
можна використовувати для запуску співпрограми з синхронного коду шляхом автоматичного створення та знищення циклу подій. (Надав Юрій Селіванов у bpo-32314.)asyncio отримав підтримку для
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
, andFuture.add_done_callback()
має новий необов’язковий параметр context.Tasks
тепер автоматично відстежують свій контекст. Дивіться PEP 567 для більш детальної інформації. (Надав Юрій Селіванов у bpo-32436.)Нову функцію
asyncio.create_task()
додано як ярлик доasyncio.get_event_loop().create_task()
. (Надав Ендрю Свєтлов у bpo-32311.)Новий метод
loop.start_tls()
можна використовувати для оновлення наявного підключення до TLS. (Надав Юрій Селіванов у bpo-23749.)Новий метод
loop.sock_recv_into()
дозволяє зчитувати дані з сокета безпосередньо в наданий буфер, що дозволяє зменшити кількість копій даних. (Надав Антуан Пітру в bpo-31819.)Нова функція
asyncio.current_task()
повертає поточний екземплярTask
, а нова функціяasyncio.all_tasks()
повертає набір усіх існуючих екземплярівTask
у заданому циклі. МетодиTask.current_task()
іTask.all_tasks()
застаріли. (Надав Ендрю Свєтлов у bpo-32250.)Новий тимчасовий клас
BufferedProtocol
дозволяє реалізувати потокові протоколи з ручним керуванням буфером отримання. (Надав Юрій Селіванов у bpo-32251.)Нова функція
asyncio.get_running_loop()
повертає поточний запущений цикл і викликаєRuntimeError
, якщо жоден цикл не запущено. Це відрізняється відasyncio.get_event_loop()
, який створить новий цикл подій, якщо жодна з них не запущена. (Надав Юрій Селіванов у bpo-32269.)Новий метод співпрограми
StreamWriter.wait_closed()
дозволяє чекати, доки закриється записувач потоку. Новий методStreamWriter.is_closing()
можна використовувати, щоб визначити, чи закривається записувач. (Надав Ендрю Свєтлов у bpo-32391.)Новий метод
loop.sock_sendfile()
дозволяє надсилати файли за допомогоюos.sendfile
, коли це можливо. (Надав Ендрю Свєтлов у bpo-32410.)Нові методи
Future.get_loop()
іTask.get_loop()
повертають екземпляр циклу, у якому було створено завдання або майбутнє.Server.get_loop()
дозволяє робити те саме для об’єктівasyncio.Server
. (Надав Юрій Селіванов у bpo-32415 та Шрінівас Редді Татіпарті у bpo-32418.)Тепер можна контролювати, як екземпляри
asyncio.Server
починають обслуговувати. Раніше сервер починав обслуговувати одразу після створення. Новий аргумент ключового слова start_serving дляloop.create_server()
іloop.create_unix_server()
, а такожServer.start_serving()
, іServer.serve_forever()
можна використовувати, щоб роз’єднати інстанціювання сервера та обслуговування. Новий методServer.is_serving()
повертаєTrue
, якщо сервер обслуговує.Server
об’єкти тепер є асинхронними контекстними менеджерами:srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(Надав Юрій Селіванов у bpo-32662.)
Об’єкти зворотного виклику, повернуті
loop.call_later()
, отримали новий методwhen()
, який повертає абсолютну позначку часу зворотного виклику за розкладом. (Надав Ендрю Свєтлов у bpo-32741.)Метод
loop.create_datagram_endpoint()
отримав підтримку сокетів Unix. (Надав Квентін Даванс у bpo-31245.)Функції
asyncio.open_connection()
,asyncio.start_server()
,loop.create_connection()
,loop.create_server()
,loop. create_accepted_socket()
методи та їхні відповідні варіанти сокетів UNIX тепер приймають аргумент ключового слова ssl_handshake_timeout. (Надав Ніл Аспінолл у bpo-29970.)Новий метод
Handle.cancelled()
повертаєTrue
, якщо зворотний виклик було скасовано. (Надав Марат Шарафутдінов у bpo-31943.)Джерело asyncio було перетворено на використання синтаксису
async
/await
. (Надав Ендрю Свєтлов у bpo-32193.)Новий метод
ReadTransport.is_reading()
можна використовувати для визначення стану читання транспорту. Крім того, викликиReadTransport.resume_reading()
іReadTransport.pause_reading()
тепер ідемпотентні. (Надав Юрій Селіванов у bpo-32356.)Методи циклу, які приймають шляхи до сокетів, тепер підтримують передачу path-подібних об’єктів. (Надав Юрій Селіванов у bpo-32066.)
У
asyncio
TCP-сокети в Linux тепер створюються з прапорцемTCP_NODELAY
, установленим за замовчуванням. (Надано Юрієм Селівановим і Віктором Стіннером у bpo-27456.)Винятки, що виникають у скасованих завданнях, більше не реєструються. (Надав Юрій Селіванов у bpo-30508.)
Нові класи
WindowsSelectorEventLoopPolicy
іWindowsProactorEventLoopPolicy
. (Надав Юрій Селіванов у bpo-33792.)
Кілька asyncio
API були застарілими.
binascii¶
Функція b2a_uu()
тепер приймає додатковий аргумент ключового слова backtick. Коли це істина, нулі представлені '`'
замість пробілів. (Надав Xiang Zhang у bpo-30103.)
календар¶
Клас HTMLCalendar
має нові атрибути класу, які спрощують налаштування класів CSS у створеному HTML-календарі. (Надав Оз Тірам у bpo-30095.)
колекції¶
collections.namedtuple()
тепер підтримує значення за замовчуванням. (Надав Реймонд Геттінгер у bpo-32320.)
compileall¶
compileall.compile_dir()
отримав новий параметр invalidation_mode, який можна використовувати для ввімкнення анулювання .pyc на основі хешу. Режим недійсності також можна вказати в командному рядку за допомогою нового аргументу --invalidation-mode
. (Надав Бенджамін Петерсон у bpo-31650.)
concurrent.futures¶
ProcessPoolExecutor
і ThreadPoolExecutor
тепер підтримують нові аргументи конструктора initializer і initargs. (Надав Антуан Пітру в bpo-21423.)
ProcessPoolExecutor
тепер може приймати багатопроцесорний контекст за допомогою нового аргументу mp_context. (Надав Томас Моро в bpo-31540.)
contextlib¶
Новий nullcontext()
є простішим і швидшим безопераційним менеджером контексту, ніж ExitStack
. (Надано Jesse-Bakker у bpo-10049.)
Нові asynccontextmanager()
, AbstractAsyncContextManager
і AsyncExitStack
додано, щоб доповнити їх синхронні аналоги. (Надано Джелле Зійлстра в bpo-29679 і bpo-30241, а також Олександром Мором та Іллею Кулаковим у bpo-29302.)
cProfile¶
Командний рядок cProfile
тепер приймає -m module_name
як альтернативу шляху сценарію. (Надано Sanyam Khurana в bpo-21862.)
склеп¶
Модуль crypt
тепер підтримує метод хешування Blowfish. (Надав Сергій Сторчака в bpo-31664.)
Функція mksalt()
тепер дозволяє вказувати кількість раундів для хешування. (Надав Сергій Сторчака в bpo-31702.)
дата, час¶
Новий метод datetime.fromisoformat()
створює об’єкт datetime
із рядка в одному з форматів, виведених datetime.isoformat()
. (Надав Пол Ганссле в bpo-15873.)
Клас tzinfo
тепер підтримує субхвилинні зсуви. (Надав Олександр Бєлопольський у bpo-5288.)
dbm¶
dbm.dumb
тепер підтримує читання файлів лише для читання та більше не записує файл індексу, якщо він не змінений.
десятковий¶
Модуль decimal
тепер використовує контекстні змінні для зберігання десяткового контексту. (Надав Юрій Селіванов у bpo-32630.)
дис¶
Функція dis()
тепер може розбирати об’єкти вкладеного коду (код розуміння, вирази генератора та вкладені функції, а також код, який використовується для створення вкладених класів). Максимальна глибина рекурсії розбирання контролюється новим параметром depth. (Надав Сергій Сторчака в bpo-11822.)
distutils¶
README.rst
тепер включено до списку стандартних файлів README Distutils і, отже, включено до вихідних дистрибутивів. (Надав Райан Гонзалес у bpo-11913.)
перелік¶
Enum
отримав нову властивість класу _ignore_
, яка дозволяє перераховувати назви властивостей, які не повинні стати членами переліку. (Надав Ітан Фурман у bpo-31801.)
У Python 3.8 спроба перевірити об’єкти, відмінні від Enum, у класах Enum
викличе TypeError
(наприклад, 1 in Color
); аналогічно спроба перевірити об’єкти без прапорців у члені Flag
викличе TypeError
(наприклад, 1 in Perm.RW
); наразі обидві операції замість цього повертають False
і є застарілими. (Надав Ітан Фурман у bpo-33217.)
functools¶
functools.singledispatch()
тепер підтримує реєстрацію реалізацій за допомогою анотацій типів. (Надав Łukasz Langa в bpo-32227.)
gc¶
Нова функція gc.freeze()
дозволяє заморозити всі об’єкти, які відстежує збирач сміття, і виключити їх із майбутніх колекцій. Це можна використовувати перед викликом POSIX fork()
, щоб зробити GC зручним для копіювання під час запису або прискорити збір. Нові функції gc.unfreeze()
скасовують цю операцію. Крім того, gc.get_freeze_count()
можна використовувати для отримання кількості заморожених об’єктів. (Надав Лі Зекун у bpo-31558.)
hmac¶
Модуль hmac
тепер має оптимізовану одноразову функцію digest()
, яка втричі швидша, ніж HMAC()
. (Надав Крістіан Хеймс у bpo-32433.)
http.client¶
HTTPConnection
і HTTPSConnection
тепер підтримують новий аргумент blocksize для покращення пропускної здатності завантаження. (Надав Нір Соффер у bpo-31945.)
http.сервер¶
SimpleHTTPRequestHandler
тепер підтримує заголовок HTTP If-Modified-Since
. Сервер повертає статус відповіді 304, якщо цільовий файл не було змінено після часу, зазначеного в заголовку. (Надано П’єром Квентелем у bpo-29654.)
SimpleHTTPRequestHandler
приймає новий аргумент directory на додаток до нового аргументу командного рядка --directory
. З цим параметром сервер обслуговує вказаний каталог, за замовчуванням він використовує поточний робочий каталог. (Надано Стефаном Віртелем і Жюльєном Палардом у bpo-28707.)
Новий клас ThreadingHTTPServer
використовує потоки для обробки запитів за допомогою ThreadingMixin
. Він використовується, коли http.server
запускається з -m
. (Надав Жюльєн Палард у bpo-31639.)
idlelib і IDLE¶
Кілька виправлень для автозавершення. (Надав Луї Лу в bpo-15786.)
Браузер модулів (у меню «Файл», раніше називався «Браузер класів») тепер відображає вкладені функції та класи на додаток до функцій і класів верхнього рівня. (Надано Гільєрме Поло, Шеріл Сабелла та Террі Ян Ріді в bpo-1612262.)
Діалогове вікно налаштувань (параметри, налаштування IDLE) було частково переписано, щоб покращити зовнішній вигляд і функції. (Надано Шеріл Сабеллою та Террі Джен Ріді в кількох випусках.)
Зразок шрифту тепер містить вибірку нелатинських символів, щоб користувачі могли краще побачити ефект від вибору певного шрифту. (Надав Террі Ян Ріді в bpo-13802.) Зразок можна редагувати, щоб включити інші символи. (Надав Сергій Сторчака в bpo-31860.)
Функції IDLE, раніше реалізовані як розширення, були повторно реалізовані як звичайні функції. Їх налаштування переміщено з вкладки «Розширення» на інші вкладки діалогу. (Надано Чарльзом Волгангером і Террі Джаном Ріді в bpo-27099.)
Опцію контексту коду редактора переглянуто. Box відображає всі контекстні рядки до maxlines. Клацання на рядку контексту переводить редактор до цього рядка. Кольори контексту для спеціальних тем додано на вкладку «Висвітлення» діалогового вікна «Параметри». (Надано Шеріл Сабелла та Террі Ян Ріді в bpo-33642, bpo-33768 та bpo-33679.)
У Windows новий виклик API повідомляє Windows, що tk масштабується для DPI. У Windows 8.1+ або 10 із незмінними властивостями сумісності DPI двійкового коду Python і роздільною здатністю монітора понад 96 DPI текст і лінії мають бути чіткішими. В іншому випадку це не повинно мати ефекту. (Надав Террі Ян Ріді в bpo-33656.)
Нове в 3.7.1:
Виведення в N рядків (50 за замовчуванням) стиснуто до кнопки. N можна змінити в розділі PyShell на сторінці «Загальні» діалогового вікна «Параметри». Менше, але, можливо, дуже довгих рядків можна стиснути, клацнувши правою кнопкою миші на виведенні. Стиснутий вихід можна розгорнути на місці, подвійним клацанням кнопки або в буфер обміну чи окреме вікно, клацнувши кнопку правою кнопкою миші. (Надав Тал Ейнат у bpo-1529353.)
Зазначені вище зміни було перенесено до випусків обслуговування 3.6.
НОВЕ в 3.7.4:
Додайте «Run Customized» до меню «Run», щоб запустити модуль із налаштованими налаштуваннями. Будь-які введені аргументи командного рядка додаються до sys.argv. Вони знову з’являються в полі для наступного налаштованого запуску. Можна також придушити звичайний перезапуск головного модуля Shell. (Надано Шеріл Сабелла, Террі Ян Ріді та іншими в bpo-5680 і bpo-37627.)
Нове в 3.7.5:
Додайте додаткові номери рядків для вікон редактора IDLE. Вікна відкриваються без номерів рядків, якщо не встановлено інше на вкладці «Загальні» діалогового вікна налаштування. Номери рядків для існуючого вікна відображаються та ховаються в меню «Параметри». (Надано Тал Ейнат і Саймадхав Геблікар у bpo-17535.)
importlib¶
importlib.abc.ResourceReader
ABC було представлено для підтримки завантаження ресурсів із пакетів. Дивіться також importlib.resources. (Надано Баррі Варшау, Бреттом Кенноном у bpo-32248.)
importlib.reload()
тепер викликає ModuleNotFoundError
, якщо модуль не має специфікації. (Надав Гарвіт Хатрі в bpo-29851.)
importlib.find_spec()
тепер викликає ModuleNotFoundError
замість AttributeError
, якщо вказаний батьківський модуль не є пакетом (тобто не має атрибута __path__
). (Надав Мілан Оберкірх у bpo-30436.)
Новий importlib.source_hash()
можна використовувати для обчислення хешу переданого джерела. файл .pyc на основі хешу вбудовує значення, яке повертає ця функція.
io¶
Новий метод TextIOWrapper.reconfigure()
можна використовувати для переналаштування текстового потоку з новими налаштуваннями. (Надано Антуаном Пітру в bpo-30526 та INADA Naoki в bpo-15216.)
IP-адреса¶
Нові методи subnet_of()
і supernet_of()
ipaddress.IPv6Network
і ipaddress.IPv4Network
можна використовувати для перевірки обмеження мережі. (Надано Мішелем Альбертом і Шеріл Сабеллою в bpo-20825.)
itertools¶
itertools.islice()
тепер приймає цілочисельні об’єкти
як аргументи запуску, зупинки та фрагмента. (Надав Вілл Робертс у bpo-30537.)
локаль¶
Новий аргумент monetary для locale.format_string()
можна використовувати, щоб перетворення використовувало грошові розділювачі тисяч і рядки групування. (Надано Гарвітом у bpo-10379.)
Функція locale.getpreferredencoding()
тепер завжди повертає 'UTF-8'
на Android або в примусовому режимі UTF-8.
лісозаготівля¶
Тепер екземпляри Logger
можна маринувати. (Надав Віней Саджип у bpo-30520.)
Новий метод StreamHandler.setStream()
можна використовувати для заміни потоку реєстратора після створення обробника. (Надав Віней Саджип у bpo-30522.)
Тепер можна вказати ключові аргументи для конструкторів обробників у конфігурації, переданій у logging.config.fileConfig()
. (Надано Престоном Лендерсом у bpo-31080.)
математика¶
Нова функція math.remainder()
реалізує операцію залишку у стилі IEEE 754. (Надав Марк Дікінсон у bpo-29962.)
міметипи¶
Тип MIME .bmp змінено з 'image/x-ms-bmp
на 'image/bmp'
. (Надано Nitish Chandra в bpo-22589.)
msilib¶
Новий метод Database.Close()
можна використовувати для закриття бази даних MSI. (Надано Berker Peksag у bpo-20486.)
багатопроцесорність¶
Новий метод Process.close()
явно закриває об’єкт процесу та звільняє всі пов’язані з ним ресурси. ValueError
виникає, якщо основний процес все ще виконується. (Надав Антуан Пітру в bpo-30596.)
Новий метод Process.kill()
можна використовувати для завершення процесу за допомогою сигналу SIGKILL
в Unix. (Надав Вітор Перейра в bpo-30794.)
Недемонічні потоки, створені Process
, тепер об’єднуються після виходу з процесу. (Надав Антуан Пітру в bpo-18966.)
ос¶
os.fwalk()
тепер приймає аргумент path як bytes
. (Надав Сергій Сторчака в bpo-28682.)
os.scandir()
отримав підтримку для дескрипторів файлів. (Надав Сергій Сторчака в bpo-25996.)
Нова функція register_at_fork()
дозволяє реєструвати зворотні виклики Python для виконання в розгалуженні процесу. (Надав Антуан Пітру в bpo-16500.)
Додано функції os.preadv()
(поєднує функції os.readv()
і os.pread()
) і os.pwritev()
(поєднує функції os.writev()
і os.pwrite()
). (Надав Пабло Галіндо в bpo-31368.)
The mode argument of os.makedirs()
no longer affects the file
permission bits of newly created intermediate-level directories.
(Contributed by Serhiy Storchaka in bpo-19930.)
os.dup2()
тепер повертає новий дескриптор файлу. Раніше завжди повертався None
. (Надав Бенджамін Петерсон у bpo-32441.)
Структура, яку повертає os.stat()
, тепер містить атрибут st_fstype
у Solaris та його похідних. (Надав Jesús Cea Avión у bpo-32659.)
pathlib¶
Новий метод Path.is_mount()
тепер доступний у системах POSIX і може використовуватися для визначення того, чи є шлях точкою монтування. (Надав Купер Рай Ліз у bpo-30897.)
pdb¶
pdb.set_trace()
тепер приймає необов’язковий аргумент заголовок, що містить лише ключове слово. Якщо вказано, воно друкується на консолі безпосередньо перед початком налагодження. (Надав Баррі Варшау у bpo-31389.)
pdb
командний рядок тепер приймає -m module_name
як альтернативу файлу сценарію. (Надав Маріо Корчеро в bpo-32206.)
py_compile¶
py_compile.compile()
– і за розширенням compileall
– тепер поважає змінну середовища SOURCE_DATE_EPOCH
шляхом безумовного створення файлів .pyc
для перевірки на основі хешу. Це дозволяє гарантувати відтворювані збірки файлів .pyc
, коли вони створюються з бажанням. (Надав Бернхард М. Відеманн у bpo-29708.)
pydoc¶
Сервер pydoc тепер може прив’язуватися до довільного імені хоста, визначеного новим аргументом командного рядка -n
. (Надав Feanil Patel у bpo-31128.)
чергу¶
Новий клас SimpleQueue
є необмеженою чергою FIFO. (Надав Антуан Пітру в bpo-14976.)
повторно¶
Прапори re.ASCII
, re.LOCALE
і re.UNICODE
можна встановити в межах групи. (Надав Сергій Сторчака в bpo-31690.)
re.split()
тепер підтримує розбиття за шаблоном, таким як r'\b'
, '^$'
або (?=-)
, який відповідає порожньому рядку. (Надав Сергій Сторчака в bpo-25054.)
Регулярні вирази, скомпільовані з прапорцем re.LOCALE
, більше не залежать від локалі під час компіляції. Параметри мови застосовуються лише тоді, коли використовується скомпільований регулярний вираз. (Надав Сергій Сторчака в bpo-30215.)
FutureWarning
тепер видається, якщо регулярний вираз містить конструкції набору символів, які зміняться семантично в майбутньому, наприклад вкладені набори та операції з наборами. (Надав Сергій Сторчака в bpo-30349.)
Зкомпільований регулярний вираз і відповідні об’єкти тепер можна копіювати за допомогою copy.copy()
і copy.deepcopy()
. (Надав Сергій Сторчака в bpo-10076.)
сигнал¶
Новий аргумент warn_on_full_buffer для функції signal.set_wakeup_fd()
дає змогу вказати, чи друкує Python попередження на stderr у разі переповнення буфера пробудження. (Надано Натаніелем Дж. Смітом у bpo-30050.)
гніздо¶
Новий метод socket.getblocking()
повертає True
, якщо сокет перебуває в режимі блокування, і False
в іншому випадку. (Надав Юрій Селіванов у bpo-32373.)
Нова функція socket.close()
закриває переданий дескриптор файлу сокета. Цю функцію слід використовувати замість os.close()
для кращої сумісності між платформами. (Надав Крістіан Хеймс у bpo-32454.)
The socket
module now exposes the socket.TCP_CONGESTION
(Linux 2.6.13), socket.TCP_USER_TIMEOUT
(Linux 2.6.37), and
socket.TCP_NOTSENT_LOWAT
(Linux 3.12) constants.
(Contributed by Omar Sandoval in bpo-26273 and
Nathaniel J. Smith in bpo-29728.)
Support for socket.AF_VSOCK
sockets has been added to allow
communication between virtual machines and their hosts.
(Contributed by Cathy Avery in bpo-27584.)
Тепер сокети за замовчуванням автоматично визначають сімейство, тип і протокол із файлового дескриптора. (Надав Крістіан Хеймс у bpo-28134.)
сокетсервер¶
socketserver.ThreadingMixIn.server_close()
тепер чекає, поки завершаться всі потоки, що не є демонами. socketserver.ForkingMixIn.server_close()
тепер очікує, поки завершаться всі дочірні процеси.
Додайте новий атрибут класу socketserver.ForkingMixIn.block_on_close
до класів socketserver.ForkingMixIn
і socketserver.ThreadingMixIn
. Встановіть атрибут класу на False
, щоб отримати поведінку до 3.7.
sqlite3¶
sqlite3.Connection
тепер надає метод backup()
, якщо базова бібліотека SQLite має версію 3.6.11 або новішу. (Надано Леле Гайфакс у bpo-27645.)
Аргумент database sqlite3.connect()
тепер приймає будь-який path-like object, а не просто рядок. (Надав Андерс Лоренцен у bpo-31843.)
ssl¶
Модуль ssl
тепер використовує вбудований API OpenSSL замість match_hostname()
для перевірки імені хоста або IP-адреси. Значення перевіряються під час рукостискання TLS. Будь-яка помилка перевірки сертифіката, включно з помилкою перевірки імені хоста, тепер викликає SSLCertVerificationError
і перериває рукостискання з належним повідомленням сповіщення TLS. Новий виняток містить додаткову інформацію. Перевірку імені хоста можна налаштувати за допомогою SSLContext.hostname_checks_common_name
. (Надав Крістіан Хеймс у bpo-31399.)
Примітка
Покращена перевірка імені хоста вимагає реалізації libssl, сумісної з OpenSSL 1.0.2 або 1.1. Відповідно, OpenSSL 0.9.8 і 1.0.1 більше не підтримуються (див. Видалення підтримки платформи для отримання додаткової інформації). Модуль ssl здебільшого сумісний із LibreSSL 2.7.2 і новішими версіями.
Модуль ssl
більше не надсилає IP-адреси в розширенні SNI TLS. (Надав Крістіан Хеймс у bpo-32185.)
match_hostname()
більше не підтримує часткові символи підстановки, такі як www*.example.org
. (Надано Мандіпом Сінгхом у bpo-23033 та Крістіаном Хеймсом у bpo-31399.)
Вибір набору шифрів за замовчуванням модуля ssl
тепер використовує підхід чорного списку, а не жорстко закодований білий список. Python більше не вмикає повторно шифри, які були заблоковані оновленнями безпеки OpenSSL. Вибір набору шифрів за замовчуванням можна налаштувати під час компіляції. (Надав Крістіан Хеймс у bpo-31429.)
Тепер підтримується перевірка сертифікатів сервера, що містять інтернаціоналізовані доменні імена (IDN). У рамках цієї зміни атрибут SSLSocket.server_hostname
тепер зберігає очікуване ім’я хоста у формі A-мітки ("xn--pythn-mua.org"
), а не U-мітки форма ("pythön.org"
). (Надано Натаніелем Дж. Смітом і Крістіаном Хеймсом у bpo-28414.)
Модуль ssl
має попередню та експериментальну підтримку TLS 1.3 і OpenSSL 1.1.1. На момент випуску Python 3.7.0 OpenSSL 1.1.1 все ще перебуває в стадії розробки, а TLS 1.3 ще не завершено. Рукостискання та протокол TLS 1.3 поводяться дещо інакше, ніж TLS 1.2 і раніші версії, див. TLS 1.3. (Надано Крістіаном Хеймсом у bpo-32947, bpo-20995, bpo-29136, bpo-30622 та bpo-33618)
SSLSocket
і SSLObject
більше не мають відкритого конструктора. Пряме створення екземплярів ніколи не було задокументованою та підтримуваною функцією. Екземпляри мають бути створені за допомогою SSLContext
методів wrap_socket()
і wrap_bio()
. (Надав Крістіан Хеймс у bpo-32951)
API OpenSSL 1.1 для встановлення мінімальної та максимальної версій протоколу TLS доступні як SSLContext.minimum_version
і SSLContext.maximum_version
. Підтримувані протоколи позначаються кількома новими прапорцями, наприклад HAS_TLSv1_1
. (Надав Крістіан Хеймс у bpo-32609.)
Added ssl.SSLContext.post_handshake_auth
to enable and
ssl.SSLSocket.verify_client_post_handshake()
to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in gh-78851.)
рядок¶
string.Template
тепер дозволяє вам окремо змінювати шаблон регулярного виразу для заповнювачів у дужках і без дужок. (Надав Баррі Варшава в bpo-1198569.)
підпроцес¶
The subprocess.run()
function accepts the new capture_output
keyword argument. When true, stdout and stderr will be captured.
This is equivalent to passing subprocess.PIPE
as stdout and
stderr arguments.
(Contributed by Bo Bayles in bpo-32102.)
Функція subprocess.run
і конструктор subprocess.Popen
тепер приймають аргумент ключового слова text як псевдонім universal_newlines. (Надав Ендрю Клегг у bpo-31756.)
У Windows стандартне значення для close_fds було змінено з False
на True
під час переспрямування стандартних дескрипторів. Тепер можна встановити для close_fds значення true під час перенаправлення стандартних дескрипторів. Перегляньте subprocess.Popen
. Це означає, що close_fds тепер має значення True
на всіх підтримуваних платформах. (Надав Сегев Файнер у bpo-19764.)
Модуль підпроцесу тепер більш витончений під час обробки KeyboardInterrupt
під час subprocess.call()
, subprocess.run()
або в контекстному менеджері Popen
. Тепер він деякий час очікує на вихід дочірнього елемента, перш ніж продовжити обробку виняткової ситуації KeyboardInterrupt
. (Надав Грегорі П. Сміт у bpo-25942.)
система¶
Нова функція sys.breakpointhook()
викликається вбудованою breakpoint()
. (Надав Баррі Варшау у bpo-31353.)
На Android новий sys.getandroidapilevel()
повертає версію Android API під час збирання. (Надав Віктор Стіннер у bpo-28740.)
Нова функція sys.get_coroutine_origin_tracking_depth()
повертає поточну глибину відстеження джерела співпрограми, встановлену новим sys.set_coroutine_origin_tracking_depth()
. asyncio
було перетворено на використання цього нового API замість застарілого sys.set_coroutine_wrapper()
. (Надано Натаніелем Дж. Смітом у bpo-32591.)
час¶
PEP 564 додає шість нових функцій із наносекундною роздільною здатністю до модуля time
:
Додано нові ідентифікатори годинника:
time.CLOCK_BOOTTIME
(Linux): Identical totime.CLOCK_MONOTONIC
, except it also includes any time that the system is suspended.time.CLOCK_PROF
(FreeBSD, NetBSD and OpenBSD): High-resolution per-process CPU timer.time.CLOCK_UPTIME
(FreeBSD, OpenBSD): Time whose absolute value is the time the system has been running and not suspended, providing accurate uptime measurement.
Нові функції time.thread_time()
і time.thread_time_ns()
можна використовувати для отримання вимірювань часу процесора для кожного потоку. (Надав Антуан Пітру в bpo-32025.)
Нова функція time.pthread_getcpuclockid()
повертає ідентифікатор годинника ЦП-годинника для конкретного потоку.
tkinter¶
Тепер доступний новий клас tkinter.ttk.Spinbox
. (Надав Алан Мур у bpo-32585.)
tracemalloc¶
tracemalloc.Traceback
поводиться більше як звичайне трасування, сортуючи кадри від найстаріших до найновіших. Traceback.format()
тепер приймає негативний ліміт, скорочуючи результат до найстаріших кадрів abs(limit)
. Щоб отримати стару поведінку, використовуйте новий аргумент most_recent_first для Traceback.format()
. (Надав Джессі Беккер у bpo-32121.)
види¶
Тепер доступні нові класи WrapperDescriptorType
, MethodWrapperType
, MethodDescriptorType
і ClassMethodDescriptorType
. (Надано Мануелем Креббером і Гвідо ван Россумом у bpo-29377 та Сергієм Сторчакою у bpo-32265.)
Нова функція types.resolve_bases()
динамічно вирішує записи MRO, як зазначено в PEP 560. (Надав Іван Левківський у bpo-32717.)
unicodedata¶
The internal unicodedata
database has been upgraded to use Unicode 11. (Contributed by Benjamin
Peterson.)
unittest¶
Новий параметр командного рядка -k
command-line option allows filtering tests by a name substring or a Unix shell-like pattern. For example, python -m unittest -k foo
runs foo_tests.SomeTest.test_something
, bar_tests.SomeTest.test_foo
, but not bar_tests.FooTest.test_something
. (Надав by Jonas Haag in bpo-32071.)
unittest.mock¶
Атрибути sentinel
тепер зберігають свою ідентичність, коли їх скопіюють
або маринують
. (Надав Сергій Сторчака в bpo-20804.)
Нова функція seal()
дозволяє запечатувати екземпляри Mock
, що забороняє подальше створення макетів атрибутів. Печатка застосовується рекурсивно до всіх атрибутів, які самі по собі є макетами. (Надав Маріо Корчеро в bpo-30541.)
urllib.parse¶
urllib.parse.quote()
було оновлено з RFC 2396 до RFC 3986, додавши ~
до набору символів, які за замовчуванням ніколи не беруться в лапки. (Надано Крістіаном Теуном і Ратнадіпом Дебнатом у bpo-16285.)
uu¶
Функція uu.encode()
тепер приймає додатковий аргумент ключового слова backtick. Коли це істина, нулі представлені '`'
замість пробілів. (Надав Xiang Zhang у bpo-30103.)
uuid¶
Новий атрибут UUID.is_safe
передає інформацію з платформи про те, чи згенеровані UUID генеруються за допомогою багатопроцесорного безпечного методу. (Надав Баррі Варшау у bpo-22807.)
uuid.getnode()
тепер надає перевагу універсально адміністрованим MAC-адресам над локально адміністрованими MAC-адресами. Це забезпечує кращу гарантію глобальної унікальності UUID, що повертається з uuid.uuid1()
. Якщо доступні лише локально адміністровані MAC-адреси, повертається перша така знайдена. (Надав Баррі Варшау у bpo-32107.)
попередження¶
Ініціалізація стандартних фільтрів попереджень змінена таким чином:
попередження, увімкнені за допомогою параметрів командного рядка (включно з параметрами
-b
і новим параметром-X
dev
) завжди передаються механізму попереджень через атрибутsys.warnoptions
.фільтри попереджень, увімкнені через командний рядок або середовище, тепер мають такий порядок пріоритету:
фільтр
BytesWarning
для-b
(або-bb
)будь-які фільтри, визначені параметром
-W
будь-які фільтри, указані за допомогою змінної середовища
PYTHONWARNINGS
будь-які інші спеціальні фільтри CPython (наприклад, фільтр
за замовчуванням
, доданий для нового режиму-X dev
)будь-які неявні фільтри, визначені безпосередньо механізмом попереджень
у CPython debug builds, усі попередження тепер відображаються за замовчуванням (неявний список фільтрів порожній)
(Надано Ніком Когланом і Віктором Стіннером у bpo-20361, bpo-32043 і bpo-32230.)
Попередження про застарілу знову відображаються за замовчуванням в однофайлових сценаріях та в інтерактивному запиті. Докладніше див. PEP 565: Показати DeprecationWarning у __main__. (Надав Нік Коглан у bpo-31975.)
xml¶
As mitigation against DTD and external entity retrieval, the
xml.dom.minidom
and xml.sax
modules no longer process
external entities by default.
(Contributed by Christian Heimes in gh-61441.)
xml.etree¶
Предикати ElementPath в методах find()
тепер можуть порівнювати текст поточного вузла з [. = "текст"]
, не тільки текст у дітей. Предикати також дозволяють додавати пробіли для кращої читабельності. (Надав Стефан Бенель у bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function
тепер можна використовувати як декоратор. (Надав Xiang Zhang у bpo-7769.)
zipap¶
Функція create_archive()
тепер приймає додатковий аргумент filter, щоб дозволити користувачеві вибрати, які файли слід включити в архів. (Надано Irmen de Jong у bpo-31072.)
Функція create_archive()
тепер приймає додатковий аргумент compressed для створення стисненого архіву. Для підтримки стиснення також додано параметр командного рядка --compress
. (Надав Zhiming Wang у bpo-31638.)
zip-файл¶
ZipFile
тепер приймає новий параметр compresslevel для керування рівнем стиснення. (Надав Бо Бейлс у bpo-21417.)
Підкаталоги в архівах, створених ZipFile
, тепер зберігаються в алфавітному порядку. (Надав Bernhard M. Wiedemann у bpo-30693.)
Зміни C API¶
Реалізовано новий API для локального зберігання потоків. Перегляньте PEP 539: новий C API для потокового локального зберігання для огляду та API для спеціального зберігання потоків (TSS). для повної довідки. (Надав Масаюкі Ямамото в bpo-25658.)
Нова функція контекстних змінних відкриває ряд нових API C.
Нова функція PyImport_GetModule()
повертає попередньо імпортований модуль із вказаною назвою. (Надав Ерік Сноу в bpo-28411.)
Новий макрос Py_RETURN_RICHCOMPARE
полегшує написання розширених функцій порівняння. (Надав Петро Вікторін у bpo-23699.)
Новий макрос Py_UNREACHABLE
можна використовувати для позначення недоступних шляхів коду. (Надав Баррі Варшау у bpo-31338.)
tracemalloc
тепер відкриває C API за допомогою нових функцій PyTraceMalloc_Track()
і PyTraceMalloc_Untrack()
. (Надав Віктор Стіннер у bpo-30054.)
Нові статичні маркери import__find__load__start()
і import__find__load__done()
можна використовувати для відстеження імпорту модуля. (Надав Крістіан Хеймс у bpo-31574.)
The fields name
and doc
of structures
PyMemberDef
, PyGetSetDef
,
PyStructSequence_Field
, PyStructSequence_Desc
,
and wrapperbase
are now of type const char *
rather of
char *
. (Contributed by Serhiy Storchaka in bpo-28761.)
Результат PyUnicode_AsUTF8AndSize()
і PyUnicode_AsUTF8()
тепер має тип const char *
, а не char *
. (Надав Сергій Сторчака в bpo-28769.)
Результатом PyMapping_Keys()
, PyMapping_Values()
і PyMapping_Items()
тепер завжди є список, а не список або кортеж. (Надав Орен Мілман у bpo-28280.)
Додано функції PySlice_Unpack()
і PySlice_AdjustIndices()
. (Надав Сергій Сторчака в bpo-27867.)
PyOS_AfterFork()
застаріла на користь нових функцій PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
і PyOS_AfterFork_Child()
. (Надав Антуан Пітру в bpo-16500.)
Синглтон PyExc_RecursionErrorInst
, який був частиною загальнодоступного API, було видалено, оскільки його члени, які ніколи не очищалися, можуть спричинити помилку сегмента під час фіналізації інтерпретатора. Надав Ксав’є де Гає в bpo-22898 і bpo-30697.
Додано підтримку C API для часових поясів за допомогою конструкторів часових поясів PyTimeZone_FromOffset()
і PyTimeZone_FromOffsetAndName()
, а також доступ до синглтона UTC за допомогою PyDateTime_TimeZone_UTC
. Надав Пол Ганссле в bpo-10381.
The type of results of PyThread_start_new_thread()
and
PyThread_get_thread_ident()
, and the id parameter of
PyThreadState_SetAsyncExc()
changed from long to
unsigned long.
(Contributed by Serhiy Storchaka in bpo-6532.)
PyUnicode_AsWideCharString()
now raises a ValueError
if the
second argument is NULL
and the wchar_t* string contains null
characters. (Contributed by Serhiy Storchaka in bpo-30708.)
Зміни в послідовності запуску та управлінні розподільниками динамічної пам’яті означають, що давно задокументована вимога виклику Py_Initialize()
перед викликом більшості функцій C API тепер покладається більшою мірою, і її недотримання може призвести до segfaults у програмах для вбудовування. Додаткову інформацію див. у розділі Перенесення на Python 3.7 у цьому документі та розділі Перед ініціалізацією Python в документації C API.
Новий PyInterpreterState_GetID()
повертає унікальний ідентифікатор для заданого інтерпретатора. (Надав Ерік Сноу в bpo-29102.)
Py_DecodeLocale()
, Py_EncodeLocale()
тепер використовують кодування UTF-8, коли ввімкнено режим UTF-8. (Надав Віктор Стіннер у bpo-29240.)
PyUnicode_DecodeLocaleAndSize()
і PyUnicode_EncodeLocale()
тепер використовують поточне кодування мови для обробника помилок surrogateescape
. (Надав Віктор Стіннер у bpo-29240.)
Параметри start і end PyUnicode_FindChar()
тепер налаштовані так, щоб поводитися як фрагменти рядків. (Надав Xiang Zhang у bpo-28822.)
Зміни збірки¶
Підтримку створення --without-threads
видалено. Модуль threading
тепер завжди доступний. (Надав Антуан Пітру в bpo-31370.).
Повна копія libffi більше не додається для використання під час створення модуля _ctypes
на платформах UNIX, відмінних від OSX. Тепер для створення _ctypes
на таких платформах потрібна встановлена копія libffi. (Надано Zachary Ware у bpo-27979.)
Процес збирання Windows більше не залежить від Subversion для залучення зовнішніх джерел, замість цього для завантаження zip-файлів із GitHub використовується сценарій Python. Якщо Python 3.6 не знайдено в системі (через py -3.6
), NuGet використовується для завантаження копії 32-розрядної версії Python для цієї мети. (Надано Zachary Ware у bpo-30450.)
Для модуля ssl
потрібен OpenSSL 1.0.2 або 1.1, сумісний libssl. Термін експлуатації OpenSSL 1.0.1 завершився 31 грудня 2016 року, тому він більше не підтримується. LibreSSL також тимчасово не підтримується. У версіях LibreSSL до версії 2.6.4 відсутні необхідні API OpenSSL 1.0.2.
Оптимізації¶
Накладні витрати на виклик багатьох методів різних стандартних бібліотечних класів, реалізованих у C, були значно зменшені завдяки портуванню більшої кількості коду для використання конвенції METH_FASTCALL
. (Надано Віктором Стіннером у bpo-29300, bpo-29507, bpo-29452 та bpo-29286.)
Різні оптимізації дозволили скоротити час запуску Python на 10% у Linux і до 30% у macOS. (Надано Віктором Стіннером, INADA Naoki у bpo-29585 та Іваном Левківським у bpo-31333.)
Виклики методів тепер на 20% швидші завдяки змінам байт-коду, що дозволяє уникнути створення зв’язаних екземплярів методів. (Надано Юрієм Селівановим та INADA Naoki у bpo-26110.)
Модуль asyncio
отримав низку помітних оптимізацій для часто використовуваних функцій:
Функцію
asyncio.get_event_loop()
було повторно реалізовано в C, щоб зробити її в 15 разів швидшою. (Надав Юрій Селіванов у bpo-32296.)asyncio.Future
управління зворотними викликами оптимізовано. (Надав Юрій Селіванов у bpo-32348.)asyncio.gather()
тепер на 15% швидше. (Надав Юрій Селіванов у bpo-32355.)asyncio.sleep()
тепер у 2 рази швидше, якщо аргумент delay дорівнює нулю або від’ємний. (Надав Ендрю Свєтлов у bpo-32351.)Накладні витрати на продуктивність асинхронного режиму налагодження зменшено. (Надав Антуан Пітру в bpo-31970.)
У результаті PEP 560 work, час імпорту typing
було зменшено в 7 разів, і багато операцій набору тексту тепер виконуються швидше. (Надав Іван Левківський у bpo-32226.)
sorted()
і list.sort()
оптимізовано для звичайних випадків, щоб працювати на 40-75% швидше. (Надав Еліот Гороховський у bpo-28685.)
dict.copy()
тепер у 5,5 разів швидше. (Надав Юрій Селіванов у bpo-31179.)
hasattr()
і getattr()
тепер приблизно в 4 рази швидше, якщо name не знайдено і obj не перевизначає object.__getattr__()
або object.__getattribute__()
. (Надано INADA Naoki в bpo-32544.)
Пошук певних символів Unicode (наприклад, української великої «Є») у рядку був у 25 разів повільнішим, ніж пошук інших символів. Тепер це лише в 3 рази повільніше в гіршому випадку. (Надав Сергій Сторчака в bpo-24821.)
Фабрику collections.namedtuple()
було оновлено, щоб зробити створення іменованих кортежів у 4-6 разів швидшим. (Надано Jelle Zijlstra з подальшими вдосконаленнями INADA Naoki, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)
date.fromordinal()
і date.fromtimestamp()
тепер на 30% швидше в звичайному регістрі. (Надав Пол Ганссле в bpo-32403.)
Функція os.fwalk()
тепер у 2 рази швидша завдяки використанню os.scandir()
. (Надав Сергій Сторчака в bpo-25996.)
Швидкість функції shutil.rmtree()
покращено на 20–40% завдяки використанню функції os.scandir()
. (Надав Сергій Сторчака в bpo-28564.)
Оптимізовано без урахування регістру зіставлення та пошук регулярних виразів
. Тепер пошук деяких шаблонів може бути в 20 разів швидшим. (Надав Сергій Сторчака в bpo-30285.)
re.compile()
тепер перетворює параметр flags
на об’єкт int, якщо це RegexFlag
. Тепер він такий же швидкий, як Python 3.5, і швидший за Python 3.6 приблизно на 10% залежно від шаблону. (Надано INADA Naoki в bpo-31671.)
Методи modify()
класів selectors.EpollSelector
, selectors.PollSelector
і selectors.DevpollSelector
можуть бути приблизно на 10% швидшими за великих навантажень . (Надав Джампаоло Родола в bpo-30014)
Постійне згортання було перенесено з оптимізатора вічка в новий оптимізатор AST, який може виконувати оптимізацію більш послідовно. (Надано Євгеном Тодером та INADA Naoki у bpo-29469 та bpo-11549.)
Більшість функцій і методів у abc
було переписано на C. Це робить створення абстрактних базових класів і виклик isinstance()
і issubclass()
на них у 1,5 рази швидшим. Це також скорочує час запуску Python до 10%. (Надано Іваном Левківським та INADA Naoki у bpo-31333)
Значні покращення швидкості альтернативних конструкторів для datetime.date
і datetime.datetime
завдяки використанню конструкторів швидкого шляху, коли не створюються підкласи. (Надав Пол Ганссле в bpo-32403)
Швидкість порівняння екземплярів array.array
була значно покращена в деяких випадках. Тепер це від 10 до 70 разів швидше під час порівняння масивів, що містять значення одного цілого типу. (Надав Adrian Wielgosik у bpo-24700.)
Функції math.erf()
і math.erfc()
тепер використовують (швидшу) реалізацію бібліотеки C на більшості платформ. (Надав Сергій Сторчака в bpo-26121.)
Інші зміни в реалізації CPython¶
Trace hooks may now opt out of receiving the
line
and opt into receiving theopcode
events from the interpreter by setting the corresponding newf_trace_lines
andf_trace_opcodes
attributes on the frame being traced. (Contributed by Nick Coghlan in bpo-31344.)Виправлено деякі проблеми узгодженості з атрибутами модуля пакета простору імен. Об’єкти модуля простору імен тепер мають
__file__
, для якого встановлено значенняNone
(раніше не було встановлено), а для їх__spec__.origin
також встановлено значенняNone
(раніше це був рядок" простір імен"
). Див. bpo-32305. Крім того, об’єкт модуля простору імен__spec__.loader
має те саме значення, що і__loader__
(раніше для першого було встановлено значенняNone
). Див. bpo-32303.Словник
locals()
тепер відображається в лексичному порядку, у якому були визначені змінні. Раніше порядок був невизначеним. (Надав Реймонд Геттінгер у bpo-32690.)Команда
distutils
upload
більше не намагається змінити символи кінця рядка CR на CRLF. Це вирішує проблему пошкодження sdists, які закінчуються байтом, еквівалентним CR. (Надав Бо Бейлс у bpo-32304.)
Застаріла поведінка Python¶
Вирази yield (як yield
, так і yield from
пункти) тепер застаріли у виразах розуміння та генераторі (окрім ітераційного виразу в крайньому лівому пункті for
). Це гарантує, що розуміння завжди негайно повертатиме контейнер відповідного типу (замість потенційного повернення об’єкта generator iterator), тоді як вирази генератора не намагатимуться перемежовувати свій неявний вихід з виводом будь-яких явних виразів yield. У Python 3.7 такі вирази видають DeprecationWarning
під час компіляції, у Python 3.8 це буде SyntaxError
. (Надав Сергій Сторчака в bpo-10544.)
Повернення підкласу complex
з object.__complex__()
є застарілим і буде помилкою в майбутніх версіях Python. Це робить __complex__()
сумісним з object.__int__()
і object.__float__()
. (Надав Сергій Сторчака в bpo-28894.)
Застарілі модулі, функції та методи Python¶
aifc¶
aifc.openfp()
визнано застарілим і буде видалено в Python 3.9. Натомість використовуйте aifc.open()
. (Надав Браян Кертін у bpo-31985.)
asyncio¶
Підтримка для очікування
екземплярів asyncio.Lock
та інших примітивів синхронізації asyncio застаріла. Для отримання та звільнення ресурсу синхронізації необхідно використовувати диспетчер асинхронного контексту. (Надав Ендрю Свєтлов у bpo-32253.)
Методи asyncio.Task.current_task()
і asyncio.Task.all_tasks()
застаріли. (Надав Ендрю Свєтлов у bpo-32250.)
колекції¶
У Python 3.8 абстрактні базові класи в collections.abc
більше не відображатимуться в звичайному модулі collections
. Це допоможе створити більш чітке розмежування між конкретними класами та абстрактними базовими класами. (Надав Сергій Сторчака в bpo-25988.)
dbm¶
dbm.dumb
тепер підтримує читання файлів лише для читання та більше не записує файл індексу, якщо він не змінений. Тепер видається попередження про застаріння, якщо файл індексу відсутній і створений заново в режимах 'r'
і 'w'
(це буде помилка в майбутніх випусках Python). (Надав Сергій Сторчака в bpo-28847.)
перелік¶
У Python 3.8 спроба перевірити об’єкти, що не належать до Enum, у класах Enum
викличе TypeError
(наприклад, 1 in Color
); аналогічно спроба перевірити об’єкти без прапорців у члені Flag
викличе TypeError
(наприклад, 1 in Perm.RW
); наразі обидві операції замість цього повертають False
. (Надав Ітан Фурман у bpo-33217.)
gettext¶
Використання нецілого значення для вибору форми множини в gettext
тепер застаріло. Він ніколи не працював правильно. (Надав Сергій Сторчака в bpo-28692.)
importlib¶
Методи Metapathfinder.find_module ()
(замінено на metapathfinder.find_spec ()
) та PathEntryFinder.find_loader()
(замінено на PathEntryFinder.find_spec()
) обидва застарілі в Python 3.4 тепер видають DeprecationWarning
. (Надав Матіас Бюссонньє в bpo-29576)
importlib.abc.ResourceLoader
ABC застаріло на користь importlib.abc.ResourceReader
.
локаль¶
locale.format()
застаріло, замість нього використовуйте locale.format_string()
. (Надано Гарвітом у bpo-10379.)
macpath¶
macpath
тепер не підтримується та буде видалено в Python 3.8. (Надано Чі Сюань Єном у bpo-9850.)
різьблення¶
dummy_threading
і _dummy_thread
застаріли. Більше неможливо створити Python з вимкненою потоковою обробкою. Замість цього використовуйте threading
. (Надав Антуан Пітру в bpo-31370.)
гніздо¶
Безмовне скорочення значення аргументу в socket.htons()
і socket.ntohs()
застаріло. У майбутніх версіях Python, якщо переданий аргумент перевищує 16 біт, буде створено виняток. (Надав Орен Мілман у bpo-28332.)
ssl¶
ssl.wrap_socket()
застаріло. Замість цього використовуйте ssl.SSLContext.wrap_socket()
. (Надав Крістіан Хеймс у bpo-28124.)
sunau¶
sunau.openfp()
визнано застарілим і буде видалено в Python 3.9. Замість цього використовуйте sunau.open()
. (Надав Браян Кертін у bpo-31985.)
система¶
Застаріли sys.set_coroutine_wrapper()
і sys.get_coroutine_wrapper()
.
Недокументована функція sys.callstats()
застаріла та буде видалена в майбутній версії Python. (Надав Віктор Стіннер у bpo-28799.)
хвиля¶
wave.openfp()
визнано застарілим і буде видалено в Python 3.9. Натомість використовуйте wave.open()
. (Надав Браян Кертін у bpo-31985.)
Застарілі функції та типи C API¶
Функція PySlice_GetIndicesEx()
застаріла та замінена на макрос, якщо Py_LIMITED_API
не встановлено або встановлено значення в діапазоні від 0x03050400
до 0x03060000
(не включно), або 0x03060100
або вище. (Надав Сергій Сторчака в bpo-27867.)
PyOS_AfterFork()
застаріло. Замість цього використовуйте PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
або PyOS_AfterFork_Child()
. (Надав Антуан Пітру в bpo-16500.)
Видалення підтримки платформи¶
FreeBSD 9 і старіші більше офіційно не підтримуються.
Для повної підтримки Unicode, включно з модулями розширення, очікується, що платформи *nix нададуть принаймні один із
C.UTF-8
(повна локаль),C.utf8
(повна локаль) абоUTF-8
(LC_CTYPE
-only locale) як альтернатива застаріломуASCII
на основіC
локалі.OpenSSL 0.9.8 і 1.0.1 більше не підтримуються, що означає, що створення CPython 3.7 із підтримкою SSL/TLS на старіших платформах, які все ще використовують ці версії, потребує спеціальних параметрів збірки, які посилаються на новішу версію OpenSSL.
Зокрема, ця проблема стосується дистрибутивів LTS Linux Debian 8 (він же «jessie») і Ubuntu 14.04 (він же «Trusty»), оскільки вони все ще використовують OpenSSL 1.0.1 за замовчуванням.
Debian 9 («stretch») і Ubuntu 16.04 («xenial»), а також останні випуски інших версій LTS Linux (наприклад, RHEL/CentOS 7.5, SLES 12-SP3) використовують OpenSSL 1.0.2 або пізнішої версії та залишаються підтримуваними у конфігурації збірки за замовчуванням.
CPython’s own CI configuration file provides an example of using the SSL compatibility testing infrastructure in CPython’s test suite to build and link against OpenSSL 1.1.0 rather than an outdated system provided OpenSSL.
Видалення API та функцій¶
З Python 3.7 видалено наступні функції та API:
Функцію
os.stat_float_times()
було видалено. Він був представлений у Python 2.3 для зворотної сумісності з Python 2.2, і був застарілим з Python 3.1.Невідомі вихідні коди, що складаються з
'\'
і літери ASCII у шаблонах заміни дляre.sub()
були застарілими в Python 3.5 і тепер викликають помилку.Вилучено підтримку аргументу exclude у
tarfile.TarFile.add()
. Він був застарілим у Python 2.7 і 3.2. Натомість використовуйте аргумент filter.The
ntpath.splitunc()
function was deprecated in Python 3.1, and has now been removed. Usesplitdrive()
instead.collections.namedtuple()
більше не підтримує параметр verbose або атрибут_source
, який показував згенерований вихідний код для іменованого класу кортежу. Це було частиною оптимізації, спрямованої на прискорення створення класів. (Надано Jelle Zijlstra з подальшими вдосконаленнями INADA Naoki, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)Функції
bool()
,float()
,list()
іtuple()
більше не приймають аргументи ключових слів. Перший аргументint()
тепер можна передати лише як позиційний аргумент.Вилучено раніше застарілі в Python 2.4 класи
Plist
,Dict
і_InternalDict
у модуліplistlib
. Значення Dict у результатах функційreadPlist()
іreadPlistFromBytes()
тепер є звичайними dicts. Ви більше не можете використовувати доступ до атрибутів для доступу до елементів цих словників.Функцію
asyncio.windows_utils.socketpair()
видалено. Натомість використовуйте функціюsocket.socketpair()
, вона доступна на всіх платформах, починаючи з Python 3.5.asyncio.windows_utils.socketpair
був просто псевдонімомsocket.socketpair
на Python 3.5 і новіших версіях.asyncio
більше не експортує модуліselectors
і_overlapped
якasyncio.selectors
іasyncio._overlapped
. Замінітьfrom asyncio import selectors
наimport selectors
.Пряме створення об’єктів
ssl.SSLSocket
іssl.SSLObject
тепер заборонено. Конструктори ніколи не документувалися, не тестувалися і не проектувалися як публічні конструктори. Користувачі повинні були використовуватиssl.wrap_socket()
абоssl.SSLContext
. (Надав Крістіан Хеймс у bpo-32951.)Невикористану команду
distutils
install_misc
було видалено. (Надав Ерік Н. Вандер Віле в bpo-29218.)
Видалення модулів¶
Модуль fpectl
видалено. Він ніколи не був увімкнений за замовчуванням, ніколи не працював правильно на x86-64, і він змінював Python ABI таким чином, що викликав неочікувану поломку розширень C. (Надано Натаніелем Дж. Смітом у bpo-29137.)
Зміни лише для Windows¶
Засіб запуску Python (py.exe) може приймати 32- та 64-бітні специфікатори без необхідності вказувати проміжну версію. Тож py -3-32
і py -3-64
стають дійсними, а також py -3.7-32
, а також -m-64 і -m.n-64 тепер дозволено використовувати 64-бітний Python, навіть якщо в іншому випадку використовувався б 32-бітний. Якщо зазначена версія недоступна, py.exe завершить роботу з помилкою. (Надав Стів Барнс у bpo-30291.)
Засіб запуску можна запустити як py -0
, щоб створити список встановлених пітонів, за умовчанням позначених зірочкою. Запуск py -0p
включатиме шляхи. Якщо py запускається зі специфікатором версії, який не може бути зіставлений, він також надрукує короткий список доступних специфікаторів. (Надав Стів Барнс у bpo-30362.)
Перенесення на Python 3.7¶
У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.
Зміни в поведінці Python¶
Імена
async
іawait
тепер є зарезервованими ключовими словами. Код, який використовує ці імена як ідентифікатори, тепер викличеSyntaxError
. (Надано Jelle Zijlstra в bpo-30406.)PEP 479 увімкнено для всього коду в Python 3.7, тобто винятки
StopIteration
, викликані прямо чи опосередковано в співпрограмах і генераторах, перетворюються на виняткиRuntimeError
. (Надав Юрій Селіванов у bpo-32670.)Методи
object.__aiter__()
більше не можна оголошувати як асинхронні. (Надав Юрій Селіванов у bpo-31709.)Через помилку попередні версії Python помилково приймали такий синтаксис:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 тепер правильно викликає
SyntaxError
, оскільки вираз генератора завжди має бути безпосередньо всередині набору дужок і не може мати коми з обох боків, а дублювання дужок можна опустити лише під час викликів. (Надав Сергій Сторчака в bpo-32012 і bpo-32023.)Під час використання перемикача
-m
початковий робочий каталог тепер додається доsys.path
, а не порожній рядок (який динамічно позначає поточний робочий каталог під час кожного імпорту). Будь-які програми, які перевіряють порожній рядок або іншим чином покладаються на попередню поведінку, потрібно буде відповідним чином оновити (наприклад, також перевірившиos.getcwd()
абоos.path.dirname(__main__. __file__)
, залежно від того, чому код спочатку перевіряв порожній рядок).
Зміни в API Python¶
socketserver.ThreadingMixIn.server_close()
тепер очікує, поки завершаться всі потоки, що не є демонами. Встановіть новий атрибут класуsocketserver.ThreadingMixIn.block_on_close
наFalse
, щоб отримати поведінку до 3.7. (Надав Віктор Стіннер у bpo-31233 і bpo-33540.)socketserver.ForkingMixIn.server_close()
тепер очікує, поки завершаться всі дочірні процеси. Встановіть новий атрибут класуsocketserver.ForkingMixIn.block_on_close
наFalse
, щоб отримати поведінку до 3.7. (Надав Віктор Стіннер у bpo-31151 і bpo-33540.)У деяких випадках функція
locale.localeconv()
тепер тимчасово встановлює для локаліLC_CTYPE
значенняLC_NUMERIC
. (Надав Віктор Стіннер у bpo-31900.)pkgutil.walk_packages()
тепер викликаєValueError
, якщо path є рядком. Раніше повертався порожній список. (Надано Sanyam Khurana в bpo-24744.)Аргумент рядка форматування для
string.Formatter.format()
тепер positional-only. Передача його як аргументу ключового слова застаріла в Python 3.5. (Надав Сергій Сторчака в bpo-29193.)Атрибути
key
,value
іcoded_value
класуhttp. cookies.Morsel
тепер доступні лише для читання. Призначення їм було застарілим у Python 3.5. Для їх налаштування використовуйте методset()
. (Надав Сергій Сторчака в bpo-29192.)The mode argument of
os.makedirs()
no longer affects the file permission bits of newly created intermediate-level directories. To set their file permission bits you can set the umask before invokingmakedirs()
. (Contributed by Serhiy Storchaka in bpo-19930.)Тип
struct.Struct.format
теперstr
замістьbytes
. (Надав Віктор Стіннер у bpo-21071.)parse_multipart()
тепер приймає аргументи encoding і errors і повертає ті самі результати, що іFieldStorage
: для нефайлових полів значення, пов’язане з ключем, є списком рядки, а не байти. (Надав П’єр Квентель у bpo-29979.)Через внутрішні зміни в
socket
викликsocket.fromshare()
для сокета, створеногоsocket.share
у старіших версіях Python, не підтримується.repr
дляBaseException
змінено, щоб не включати кінцеву кому. Ця зміна стосується більшості винятків. (Надав Сергій Сторчака в bpo-30399.)repr
дляdatetime.timedelta
змінено, щоб включити ключові аргументи у вивід. (Надав Utkarsh Upadhyay у bpo-30302.)Оскільки
shutil.rmtree()
тепер реалізовано за допомогою функціїos.scandir()
, вказаний користувачем обробник onerror тепер викликається з першим аргументомos.scandir
замістьos .listdir
під час перерахування каталогу не вдається.У майбутньому може бути додано підтримку вкладених наборів і операцій із наборами в регулярних виразах, як у Технічному стандарті Unicode #18. Це змінило б синтаксис. Для сприяння цій майбутній зміні
FutureWarning
на даний момент буде викликано у неоднозначних випадках. Це включає в себе набори, що починаються з літерала'['
або містять літеральні послідовності символів'--'
,'&&'
,'~~'
і'| |'
. Щоб уникнути попередження, екрануйте їх за допомогою зворотної косої риски. (Надав Сергій Сторчака в bpo-30349.)Результат поділу рядка на
регулярний вираз
, який міг відповідати порожньому рядку, було змінено. Наприклад, розділення наr'\s*'
тепер розділятиметься не лише на пробіли, як це було раніше, але також на порожні рядки перед усіма символами, які не є пробілами, і безпосередньо перед кінцем рядка. Попередню поведінку можна відновити, змінивши шаблон наr'\s+'
.FutureWarning
було видано для таких шаблонів, починаючи з Python 3.5.Для шаблонів, які відповідають як порожнім, так і непорожнім рядкам, результат пошуку всіх збігів також може бути змінений в інших випадках. Наприклад, у рядку
'a\n\n'
, шаблонr'(?m)^\s*?$'
не лише відповідатиме порожнім рядкам у позиціях 2 і 3, але також рядок'\n'
на позиціях 2–3. Щоб відповідати лише порожнім рядкам, шаблон слід переписати якr'(?m)^[^\S\n]*$''
.re.sub()
тепер замінює порожні збіги поруч із попереднім непорожнім збігом. Наприклад,re.sub('x*', '-', 'abxd')
тепер повертає'-a-b--d-'
замість'-a-b-d-'
( перший мінус між „b“ і „d“ замінює „x“, а другий мінус замінює порожній рядок між „x“ і „d“).Змініть
re.escape()
, щоб екранувати лише спеціальні символи регулярних виразів замість екранування всіх символів, крім літер ASCII, цифр і'_'
. (Надав Сергій Сторчака в bpo-29995.)tracemalloc.Traceback
кадри тепер сортуються від найстаріших до найновіших, щоб бути більш узгодженими зtraceback
. (Надав Джессі Беккер у bpo-32121.)В ОС, які підтримують
socket.SOCK_NONBLOCK
абоsocket.SOCK_CLOEXEC
бітові прапорці,socket.type
більше не застосовують їх. Тому такі перевірки, якif sock.type == socket.SOCK_STREAM
, працюють належним чином на всіх платформах. (Надав Юрій Селіванов у bpo-32331.)У Windows стандартне значення для аргументу close_fds
subprocess.Popen
було змінено зFalse
наTrue
під час перенаправлення стандартних дескрипторів. Якщо раніше ви залежали від успадкованих дескрипторів під час використанняsubprocess.Popen
зі стандартним переспрямуванням io, вам доведеться передатиclose_fds=False
, щоб зберегти попередню поведінку, або використатиSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
– що неявно впливає наimportlib.invalidate_caches()
– тепер видаляє записи вsys.path_importer_cache
, для яких встановлено значенняNone
. (Надано Бреттом Кенноном у bpo-33169.)У
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop. getaddrinfo()
,loop.getnameinfo()
були змінені на належні методи співпрограми відповідно до їх документації. Раніше ці методи повертали екземпляриasyncio.Future
. (Надав Юрій Селіванов у bpo-32327.)asyncio.Server.sockets
тепер повертає копію внутрішнього списку серверних сокетів замість того, щоб повертати його безпосередньо. (Надав Юрій Селіванов у bpo-32662.)Struct.format
тепер є екземпляромstr
замість екземпляраbytes
. (Надав Віктор Стіннер у bpo-21071.)Підрозбірники
argparse
тепер можна зробити обов’язковими, передавшиrequired=True
уArgumentParser.add_subparsers()
. (Надав Ентоні Соттіле в bpo-26510.)ast.literal_eval()
тепер суворіший. Додавання та віднімання довільних чисел більше не дозволяється. (Надав Сергій Сторчака в bpo-31778.)Calendar.itermonthdates
тепер постійно створюватиме виняток, якщо дата виходить за межі діапазону0001-01-01
до9999-12-31
. Для підтримки програм, які не можуть допускати такі винятки, можна використовувати новіCalendar.itermonthdays3
іCalendar.itermonthdays4
. Нові методи повертають кортежі та не обмежені діапазоном, який підтримуєdatetime.date
. (Надав Олександр Бєлопольський у bpo-28292.)collections.ChainMap
тепер зберігає порядок базових відображень. (Надав Реймонд Геттінгер у bpo-32792.)Метод
submit()
concurrent.futures.ThreadPoolExecutor
іconcurrent.futures.ProcessPoolExecutor
тепер викликаєRuntimeError
, якщо викликається під час завершення роботи інтерпретатора. (Надав Марк Немек у bpo-33097.)Конструктор
configparser.ConfigParser
тепер використовуєread_dict()
для обробки значень за замовчуванням, роблячи його поведінку узгодженою з рештою синтаксичного аналізатора. Нерядкові ключі та значення в словнику за замовчуванням тепер неявно перетворюються на рядки. (Надав Джеймс Токнелл у bpo-23835.)Кілька незадокументованих внутрішніх імпортів було вилучено. Одним із прикладів є те, що
os.errno
більше не доступний; натомість використовуйтеimport errno
безпосередньо. Зауважте, що такий незадокументований внутрішній імпорт може бути видалено будь-коли без попередження, навіть у випусках мікроверсій.
Зміни в C API¶
Функція PySlice_GetIndicesEx()
вважається небезпечною для послідовностей змінного розміру. Якщо індекси фрагментів не є екземплярами int
, а об’єктами, які реалізують метод __index__()
, розмір послідовності можна змінити після передачі її довжини PySlice_GetIndicesEx()
. Це може призвести до повернення індексів поза довжиною послідовності. Щоб уникнути можливих проблем, використовуйте нові функції PySlice_Unpack()
і PySlice_AdjustIndices()
. (Надав Сергій Сторчака в bpo-27867.)
Зміни байт-коду CPython¶
Є два нові коди операції: LOAD_METHOD
і CALL_METHOD
. (Надано Юрієм Селівановим та INADA Naoki у bpo-26110.)
Код операції STORE_ANNOTATION
видалено. (Надав Марк Шеннон у bpo-32550.)
Зміни лише для Windows¶
The file used to override sys.path
is now called
<python-executable>._pth
instead of 'sys.path'
.
See Пошук модулів for more information.
(Contributed by Steve Dower in bpo-28137.)
Інші зміни реалізації CPython¶
Готуючись до потенційних майбутніх змін у загальнодоступному API ініціалізації середовища виконання CPython (перегляньте PEP 432 для початкового, але дещо застарілого чернетки), внутрішню логіку запуску та керування конфігурацією CPython було значно перероблено. Хоча ці оновлення мають бути повністю прозорими як для програм для вбудовування, так і для користувачів звичайного CLI CPython, вони згадуються тут, оскільки рефакторинг змінює внутрішній порядок різних операцій під час запуску інтерпретатора, і, отже, може виявити раніше приховані дефекти, або у програмах для вбудовування або в самому CPython. (Спочатку створено Ніком Когланом і Еріком Сноу як частину bpo-22257, а потім оновлено Ніком, Еріком і Віктором Стіннером у ряді інших випусків). Впливають деякі відомі деталі:
PySys_AddWarnOptionUnicode()
is not currently usable by embedding applications due to the requirement to create a Unicode object prior to callingPy_Initialize
. UsePySys_AddWarnOption()
instead.фільтри попереджень, додані програмою для вбудовування за допомогою
PySys_AddWarnOption()
, тепер мають більш узгоджено мати перевагу над фільтрами за замовчуванням, установленими інтерпретатором
Через зміни в способі налаштування фільтрів попереджень за замовчуванням встановлення Py_BytesWarningFlag
значення, більшого за одиницю, більше не є достатнім для видачі повідомлень BytesWarning
і їх перетворення на винятки. Натомість потрібно встановити прапорець (щоб спершу видавати попередження) і додати явний фільтр попереджень error::BytesWarning
, щоб перетворити їх на винятки.
У зв’язку зі зміною способу обробки рядків документації компілятором неявне «повернення None» у тілі функції, що складається виключно з рядка документації, тепер позначається як таке, що міститься в тому самому рядку, що й рядок документації, а не в рядку заголовка функції. .
Поточний винятковий стан було переміщено з об’єкта кадру до спільної процедури. Це спростило інтерпретатор і виправило кілька незрозумілих помилок, спричинених зміною виняткового стану під час входу або виходу з генератора. (Надав Марк Шеннон у bpo-25612.)
Помітні зміни в Python 3.7.1¶
Починаючи з версії 3.7.1, Py_Initialize()
тепер узгоджено читає та поважає всі ті самі параметри середовища, що й Py_Main()
(у попередніх версіях Python він поважав неправильно визначену підмножину цього середовища змінні, тоді як у Python 3.7.0 він не читав жодної з них через bpo-34247). Якщо така поведінка є небажаною, встановіть Py_IgnoreEnvironmentFlag
на 1 перед викликом Py_Initialize()
.
У версії 3.7.1 C API для змінних контексту було оновлено для використання покажчиків PyObject
. Дивіться також bpo-34762.
У версії 3.7.1 модуль tokenize
тепер неявно видає маркер NEWLINE
, коли надходить із введенням, яке не має кінцевого нового рядка. Ця поведінка тепер відповідає внутрішнім функціям C tokenizer. (Надав Аммар Аскар у bpo-33899.)
Помітні зміни в Python 3.7.2¶
У версії 3.7.2 venv
у Windows більше не копіює оригінальні двійкові файли, а замість них створює сценарії перенаправлення під назвами python.exe
і pythonw.exe
. Це вирішує давню проблему, коли всі віртуальні середовища потрібно було оновлювати або створювати заново з кожним оновленням Python. Однак зауважте, що для отримання нових сценаріїв цей випуск все одно потребуватиме відтворення віртуальних середовищ.
Помітні зміни в Python 3.7.6¶
Через серйозні проблеми безпеки параметр reuse_address asyncio.loop.create_datagram_endpoint()
більше не підтримується. Це через поведінку опції сокета SO_REUSEADDR
в UDP. Для отримання додаткової інформації див. документацію для loop.create_datagram_endpoint()
. (Надано Кайлом Стенлі, Антуаном Пітру та Юрієм Селівановим у bpo-37228.)
Помітні зміни в Python 3.7.10¶
Попередні версії Python дозволяли використовувати як ;
, так і &
як роздільники параметрів запиту в urllib.parse.parse_qs()
і urllib.parse.parse_qsl()
. З міркувань безпеки та для відповідності новим рекомендаціям W3C це було змінено, щоб дозволити лише один роздільний ключ із &
за замовчуванням. Ця зміна також впливає на cgi.parse()
і cgi.parse_multipart()
, оскільки вони використовують уражені функції внутрішньо. Щоб дізнатися більше, перегляньте відповідну документацію. (Надано Адамом Ґолдшмідтом, Сентилом Кумараном і Кеном Джином у bpo-42967.)
Notable changes in Python 3.7.11¶
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)
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 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.7.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.