Що нового в Python 3.6¶
- Редактори
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
У цій статті пояснюється нові функції в Python 3.6 порівняно з 3.5. Python 3.6 було випущено 23 грудня 2016 року. Повний список змін див. у журналі змін.
Дивись також
PEP 494 - Графік випуску Python 3.6
Підсумок – основні моменти випуску¶
Нові функції синтаксису:
PEP 498, відформатовані рядкові літерали.
PEP 515, підкреслення в числових літералах.
PEP 526, синтаксис для анотацій змінних.
PEP 525, асинхронні генератори.
PEP 530: асинхронне розуміння.
Нові бібліотечні модулі:
Покращення реалізації CPython:
Тип dict було перереалізовано для використання більш компактного представлення на основі пропозиції Raymond Hettinger і подібного до реалізації dict PyPy. Це призвело до того, що словники використовували на 20–25% менше пам’яті порівняно з Python 3.5.
Налаштування створення класу було спрощено за допомогою нового протоколу.
Порядок визначення атрибутів класу тепер збережено.
Порядок елементів у
**kwargs
тепер відповідає порядку, у якому ключові аргументи були передані функції.DTrace і SystemTap додано підтримку зондування.
Нову змінну середовища PYTHONMALLOC тепер можна використовувати для налагодження розподілу пам’яті інтерпретатора та помилок доступу.
Значні вдосконалення стандартної бібліотеки:
Модуль
asyncio
отримав нові функції, значні покращення зручності використання та продуктивності, а також чимало виправлень помилок. Починаючи з Python 3.6, модульasyncio
більше не є тимчасовим, а його API вважається стабільним.Новий протокол шляхів файлової системи було реалізовано для підтримки шляхових об’єктів. Усі стандартні функції бібліотеки, що працюють із шляхами, оновлено для роботи з новим протоколом.
Модуль
datetime
отримав підтримку Визначення неоднозначності місцевого часу.Модуль
tracemalloc
був суттєво перероблений і тепер використовується для забезпечення кращого результату дляResourceWarning
, а також для забезпечення кращої діагностики помилок розподілу пам’яті. Перегляньте розділ PYTHONMALLOC для отримання додаткової інформації.
Покращення безпеки:
Новий модуль
secrets
додано для спрощення генерації криптографічно надійних псевдовипадкових чисел, придатних для керування секретами, такими як автентифікація облікового запису, токени тощо.У Linux
os.urandom()
тепер блокується, доки системний пул ентропії не буде ініціалізовано для підвищення безпеки. Перегляньте PEP 524 для обґрунтування.Стандартні параметри та набір функцій модуля
ssl
було покращено.Модуль
hashlib
отримав підтримку хеш-алгоритмів BLAKE2, SHA-3 і SHAKE і функції виведення ключаscrypt()
.
Покращення Windows:
PEP 528 і PEP 529, файлову систему Windows і кодування консолі змінено на UTF-8.
Засіб запуску
py.exe
, коли використовується в інтерактивному режимі, більше не надає перевагу Python 2 над Python 3, якщо користувач не вказує версію (через аргументи командного рядка або файл конфігурації). Обробка рядків shebang залишається незмінною - у цьому випадку «python» відноситься до Python 2.python.exe
іpythonw.exe
були позначені як такі, що підтримують довгий шлях, що означає, що ліміт шляху 260 символів може більше не застосовуватися. Дивіться усунення обмеження MAX_PATH для деталей.A
._pth
file can be added to force isolated mode and fully specify all search paths to avoid registry and environment lookup. See the documentation for more information.A
python36.zip
file now works as a landmark to inferPYTHONHOME
. See the documentation for more information.
Нові можливості¶
PEP 498: Відформатовані рядкові літерали¶
PEP 498 представляє новий тип рядкових літералів: f-strings або форматовані рядкові літерали.
Форматовані рядкові літерали мають префікс 'f
і подібні до рядків формату, які приймає str.format()
. Вони містять поля заміни, оточені фігурними дужками. Поля заміни — це вирази, які обчислюються під час виконання, а потім форматуються за допомогою протоколу format()
:
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
Дивись також
- PEP 498 – Літеральна інтерполяція рядків.
PEP написаний і реалізований Еріком В. Смітом.
PEP 526: Синтаксис для анотацій змінних¶
PEP 484 запровадив стандарт для анотацій типу параметрів функції, так само як підказки типу. Цей PEP додає синтаксис до Python для анотування типів змінних, включаючи змінні класу та змінні екземпляра:
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
Подібно до анотацій функцій, інтерпретатор Python не надає жодного конкретного значення анотаціям змінних і зберігає їх лише в атрибуті __annotations__
класу або модуля.
На відміну від декларацій змінних у статично типізованих мовах, метою синтаксису анотацій є надання простого способу визначення метаданих структурованого типу для сторонніх інструментів і бібліотек за допомогою абстрактного синтаксичного дерева та атрибута __annotations__
.
PEP 515: Підкреслення в числових літералах¶
PEP 515 додає можливість використовувати підкреслення в числових літералах для кращої читабельності. Наприклад:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
Між цифрами та після будь-якого основного специфікатора допускається одинарне підкреслення. Забороняється використовувати початкове, кінцеве або кілька символів підкреслення підряд.
У мові строкового форматування тепер є підтримка опції '_
, яка сигналізує про використання символу підкреслення для роздільника тисяч для типів подання з плаваючою комою та для цілочисельного типу подання 'd'
. Для цілочисельних типів подання 'b'
, 'o'
, 'x'
і 'X'
підкреслення буде вставлятися кожні 4 цифри:
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
Дивись також
- PEP 515 – Підкреслення в числових літералах
PEP автори Георг Брандл та Сергій Сторчака.
PEP 525: Асинхронні генератори¶
PEP 492 представив підтримку власних співпрограм і синтаксис async
/ await
для Python 3.5. Помітним обмеженням реалізації Python 3.5 є те, що неможливо було використовувати await
і yield
в одному тілі функції. У Python 3.6 це обмеження було знято, завдяки чому стало можливим визначення асинхронних генераторів:
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
Новий синтаксис дозволяє створювати швидший і лаконічніший код.
Дивись також
- PEP 525 – Асинхронні генератори
PEP написав і реалізував Юрій Селіванов.
PEP 530: Асинхронне розуміння¶
PEP 530 додає підтримку для використання async for
у списках, набірах, розуміннях dict і генераторних виразах:
result = [i async for i in aiter() if i % 2]
Крім того, вирази await
підтримуються у всіх видах розуміння:
result = [await fun() for fun in funcs if await condition()]
Дивись також
- PEP 530 – Асинхронне розуміння
PEP написав і реалізував Юрій Селіванов.
PEP 487: Простіша настройка створення класу¶
Тепер можна налаштувати створення підкласу без використання метакласу. Новий метод класу __init_subclass__
буде викликатися в базовому класі кожного разу, коли створюється новий підклас:
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
Щоб дозволити викликам super()
із нульовим аргументом правильно працювати з реалізацій __init_subclass__()
, спеціальні метакласи мають гарантувати, що новий запис простору імен __classcell__
поширюється на type. __new__
(як описано в Створення об’єкта класу).
Дивись також
- PEP 487 – Простіша настройка створення класів
PEP написаний і реалізований Мартіном Тайхманном.
PEP 487: Покращення протоколу дескриптора¶
PEP 487 розширює протокол дескриптора, щоб включити новий необов’язковий метод __set_name__()
. Кожного разу, коли визначається новий клас, новий метод буде викликаний для всіх дескрипторів, включених у визначення, надаючи їм посилання на клас, що визначається, і ім’я, дане дескриптору в просторі імен класу. Іншими словами, екземпляри дескрипторів тепер можуть знати назву атрибута дескриптора в класі власника:
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
Дивись також
- PEP 487 – Простіша настройка створення класів
PEP написаний і реалізований Мартіном Тайхманном.
PEP 519: Додавання протоколу шляху файлової системи¶
Шляхи файлової системи історично представлялися як об’єкти str
або bytes
. Це призвело до того, що люди, які пишуть код, який працює зі шляхами файлової системи, припускають, що такі об’єкти є лише одним із цих двох типів (int
, що представляє дескриптор файлу, не вважається, оскільки це не шлях до файлу). На жаль, це припущення не дозволяє альтернативним представленням об’єктів шляхів файлової системи, таким як pathlib
, працювати з уже існуючим кодом, включаючи стандартну бібліотеку Python.
Щоб виправити цю ситуацію, було визначено новий інтерфейс, представлений os.PathLike
. Реалізуючи метод __fspath__()
, об’єкт сигналізує, що він представляє шлях. Потім об’єкт може надати низькорівневе представлення шляху файлової системи як об’єкт str
або bytes
. Це означає, що об’єкт вважається path-подібним, якщо він реалізує os.PathLike
або є об’єктом str
чи bytes
, який представляє шлях до файлової системи. Код може використовувати os.fspath()
, os.fsdecode()
або os.fsencode()
, щоб явно отримати представлення str
та/або bytes
шляхоподібного об’єкта.
Вбудовану функцію open()
було оновлено, щоб приймати об’єкти os.PathLike
, як і всі відповідні функції в модулях os
і os.path
, і більшість інших функцій і класів у стандартній бібліотеці. Клас os.DirEntry
і відповідні класи в pathlib
також були оновлені для реалізації os.PathLike
.
Є надія, що оновлення фундаментальних функцій для роботи зі шляхами файлової системи призведе до коду третьої сторони, який неявно підтримує всі path-подібні об’єкти без будь-яких змін коду або принаймні дуже мінімальних (наприклад, виклик os.fspath()
на початку коду перед операцією з об’єктом, схожим на шлях).
Ось декілька прикладів того, як новий інтерфейс дозволяє використовувати pathlib.Path
легше та прозоріше з уже існуючим кодом:
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(Реалізовано Бреттом Кенноном, Ітаном Фурманом, Дасті Філіпсом і Джелле Зійлстра.)
Дивись також
- PEP 519 – Додавання протоколу шляху файлової системи
PEP, написаний Бреттом Кенноном і Кусом Зевенховеном.
PEP 495: Роз’яснення неоднозначності за місцевим часом¶
У більшості країн світу були й будуть часи, коли місцеві годинники переводили назад. У ті часи вводяться інтервали, в яких місцеві годинники показують один і той самий час двічі в один день. У таких ситуаціях інформації, яка відображається на локальному годиннику (або зберігається в екземплярі Python datetime), недостатньо для визначення конкретного моменту часу.
PEP 495 додає новий атрибут fold до екземплярів класів datetime.datetime
і datetime.time
, щоб розрізняти два моменти часу, для яких місцевий час однаковий:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
Значення атрибута fold
мають значення 0
для всіх випадків, крім тих, які представляють другий (хронологічно) момент часу в неоднозначному випадку.
Дивись також
- PEP 495 – Визначення місцевого часу
PEP, написаний Олександром Бєлопольським і Тімом Пітерсом, реалізація — Олександром Бєлопольським.
PEP 529: змініть кодування файлової системи Windows на UTF-8¶
Представлення шляхів файлової системи найкраще виконується за допомогою str (Unicode), а не байтів. Однак є деякі ситуації, коли використання байтів є достатнім і правильним.
До Python 3.6 втрата даних могла призвести до використання байтових шляхів у Windows. Завдяки цій зміні використання байтів для представлення шляхів тепер підтримується в Windows, за умови, що ці байти закодовано з кодуванням, яке повертає sys.getfilesystemencoding()
, яке тепер за замовчуванням 'utf-8'
.
Програми, які не використовують str для представлення шляхів, повинні використовувати os.fsencode()
і os.fsdecode()
, щоб переконатися, що їхні байти правильно закодовані. Щоб повернутися до попередньої поведінки, встановіть PYTHONLEGACYWINDOWSFSENCODING
або викличте sys._enablelegacywindowsfsencoding()
.
Перегляньте PEP 529 для отримання додаткової інформації та обговорення модифікацій коду, які можуть знадобитися.
PEP 528: Змініть кодування консолі Windows на UTF-8¶
Консоль за замовчуванням у Windows тепер прийматиме всі символи Unicode та забезпечуватиме коректне читання об’єктів str у коді Python. sys.stdin
, sys.stdout
і sys.stderr
тепер за замовчуванням у кодуванні utf-8.
Ця зміна застосовується лише під час використання інтерактивної консолі, а не під час перенаправлення файлів або каналів. Щоб повернутися до попередньої поведінки для використання інтерактивної консолі, встановіть PYTHONLEGACYWINDOWSSTDIO
.
Дивись також
- PEP 528 – Змінити кодування консолі Windows на UTF-8
PEP написаний і реалізований Стівом Дауером.
PEP 520: Збереження порядку визначення атрибутів класу¶
Атрибути в тілі визначення класу мають природний порядок: той самий порядок, у якому імена з’являються в джерелі. Цей порядок тепер збережено в атрибуті __dict__
нового класу.
Крім того, ефективний простір імен виконання класу за замовчуванням (повернений з type.__prepare__()) тепер є відображенням, що зберігає порядок вставки.
Дивись також
- PEP 520 – Збереження порядку визначення атрибутів класу
PEP написав і реалізував Ерік Сноу.
PEP 468: Збереження порядку аргументів ключового слова¶
**kwargs
у сигнатурі функції тепер гарантовано є відображенням, що зберігає порядок вставки.
Дивись також
- PEP 468 – Збереження порядку аргументів ключового слова
PEP написав і реалізував Ерік Сноу.
Нова реалізація dict¶
Тип dict тепер використовує «компактне» представлення на основі пропозиції Raymond Hettinger, яке було вперше реалізовано PyPy. Використання пам’яті нового dict()
на 20%–25% менше порівняно з Python 3.5.
Аспект збереження порядку цієї нової реалізації вважається деталлю реалізації, і на неї не слід покладатися (це може змінитися в майбутньому, але бажано мати цю нову реалізацію dict у мові протягом кількох випусків перед зміною специфікації мови надати обов’язкову семантику збереження порядку для всіх поточних і майбутніх реалізацій Python; це також допомагає зберегти зворотну сумісність зі старими версіями мови, де все ще діє випадковий порядок ітерацій, наприклад, Python 3.5).
(Надано INADA Naoki в bpo-27350. Ідею спочатку запропонував Raymond Hettinger.)
PEP 523: додавання API оцінки кадрів до CPython¶
Хоча Python надає широку підтримку для налаштування способу виконання коду, одне місце, де він цього не зробив, це оцінка об’єктів фрейму. Якщо вам потрібен якийсь спосіб перехопити оцінку кадру в Python, справді не було жодного способу без безпосереднього маніпулювання покажчиками функцій для визначених функцій.
PEP 523 змінює це, надаючи API для підключення оцінки кадрів на рівні C. Це дозволить таким інструментам, як налагоджувачі та JIT, перехоплювати оцінку кадру перед початком виконання коду Python. Це дає змогу використовувати альтернативні реалізації оцінки для коду Python, оцінки кадрів відстеження тощо.
Цей API не є частиною обмеженого API C і позначений як приватний, щоб сигналізувати про те, що використання цього API, як очікується, буде обмеженим і застосовним лише до дуже вибраних випадків використання низького рівня. Семантика API змінюватиметься разом із Python за потреби.
Дивись також
- PEP 523 – Додавання API оцінки кадрів до CPython
PEP, написаний Бреттом Кенноном і Діно Віландом.
Змінна середовища PYTHONMALLOC¶
Нова змінна середовища PYTHONMALLOC
дозволяє встановлювати розподілювачі пам’яті Python і встановлювати хуки налагодження.
Тепер можна встановлювати перехоплювачі налагодження на розподілювачі пам’яті Python на Python, скомпільованому в режимі випуску за допомогою PYTHONMALLOC=debug
. Ефекти налагоджувальних хуків:
Щойно виділена пам’ять заповнюється байтом
0xCB
Звільнена пам’ять заповнюється байтом
0xDB
Виявляти порушення API розподільника пам’яті Python. Наприклад,
PyObject_Free()
викликає блок пам’яті, виділенийPyMem_Malloc()
.Виявлення записів перед початком буфера (переповнення буфера)
Виявлення записів після закінчення буфера (переповнення буфера)
Переконайтеся, що GIL зберігається, коли функції розподільника
PYMEM_DOMAIN_OBJ
(наприклад:PyObject_Malloc()
) іPYMEM_DOMAIN_MEM
(наприклад:PyMem_Malloc()
) викликаються домени.
Перевірка збереження GIL також є новою функцією Python 3.6.
Дивіться функцію PyMem_SetupDebugHooks()
для перехоплень налагодження розподільників пам’яті Python.
Тепер також можна примусово використовувати розподільник malloc()
бібліотеки C для всіх виділень пам’яті Python за допомогою PYTHONMALLOC=malloc
. Це корисно під час використання налагоджувачів зовнішньої пам’яті, таких як Valgrind, на Python, скомпільованому в режимі випуску.
У разі помилки хуки налагодження розподілювачів пам’яті Python тепер використовують модуль tracemalloc
для отримання зворотного відстеження, де було виділено блок пам’яті.
Приклад фатальної помилки переповнення буфера за допомогою python3.6 -X tracemalloc=5
(зберігати 5 кадрів у трасах):
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
Підтримка зондування DTrace і SystemTap¶
Тепер Python можна створити --with-dtrace
, що вмикає статичні маркери для таких подій в інтерпретаторі:
виклик/повернення функції
збір сміття розпочато/завершено
виконаний рядок коду.
This can be used to instrument running interpreters in production, without the need to recompile specific debug builds or providing application-specific profiling/debugging code.
Детальніше в Інструментування CPython за допомогою DTrace і SystemTap.
Поточна реалізація перевірена на Linux і macOS. У майбутньому можуть бути додані додаткові маркери.
(Надав Łukasz Langa в bpo-21590, на основі патчів Хесуса Сеа Авіона, Девіда Малкольма та Ніхіла Бенеша.)
Інші зміни мови¶
Деякі менші зміни, внесені до основної мови Python:
Інструкція
global
абоnonlocal
тепер має текстово з’являтися перед першим використанням відповідного імені в тій самій області. Раніше це булоSyntaxWarning
.Тепер можна встановити спеціальний метод на
None
, щоб вказати, що відповідна операція недоступна. Наприклад, якщо клас встановлює__iter__()
наNone
, клас не можна повторювати. (Надано Ендрю Барнертом та Іваном Левківським у bpo-25958.)Довгі послідовності повторюваних рядків відстеження тепер скорочуються як
"[Попередній рядок повторюється {count} більше разів]"
(див. простежити для прикладу). (Надав Емануель Баррі в bpo-26823.)Імпорт тепер викликає новий виняток
ModuleNotFoundError
(підкласImportError
), коли він не може знайти модуль. Код, який наразі перевіряє ImportError (у try-except), усе ще працюватиме. (Надав Ерік Сноу в bpo-15767.)Методи класу, що покладаються на
super()
з нульовим аргументом, тепер працюватимуть правильно під час виклику з методів метакласу під час створення класу. (Надав Мартін Тейхманн у bpo-23722.)
Нові модулі¶
таємниці¶
Основна мета нового модуля secrets
— забезпечити очевидний спосіб надійного генерування криптографічно надійних псевдовипадкових значень, придатних для керування секретами, такими як автентифікація облікового запису, токени тощо.
Попередження
Зауважте, що псевдовипадкові генератори в модулі random
НЕ слід використовувати з метою безпеки. Використовуйте secrets
на Python 3.6+ і os.urandom()
на Python 3.5 і раніших версіях.
Дивись також
- PEP 506 – Додавання модуля Secrets до стандартної бібліотеки
PEP написаний і реалізований Стівеном Д’Апрано.
Покращені модулі¶
масив¶
Вичерпані ітератори array.array
тепер залишатимуться вичерпаними, навіть якщо ітерований масив буде розширено. Це узгоджується з поведінкою інших змінних послідовностей.
Надав Сергій Сторчака в bpo-26492.
аст¶
Додано новий вузол ast.Constant
AST. Може використовуватися зовнішніми оптимізаторами AST для цілей постійного згортання.
Надав Віктор Стіннер у bpo-26146.
asyncio¶
Починаючи з Python 3.6, модуль asyncio
більше не є тимчасовим, а його API вважається стабільним.
Помітні зміни в модулі asyncio
з Python 3.5.0 (усі перенесені до 3.5.x через тимчасовий статус):
Функцію
get_event_loop()
було змінено, щоб вона завжди повертала поточний цикл під час виклику із співпрограм і зворотних викликів. (Надав Юрій Селіванов у bpo-28613.)Функція
ensure_future()
і всі функції, які її використовують, такі якloop.run_until_complete()
, тепер приймають усі типи awaitable об’єктів. (Уклав Юрій Селіванов.)Нова функція
run_coroutine_threadsafe()
для надсилання співпрограм до циклів подій з інших потоків. (Надав Вінсент Мішель.)Новий метод
Transport.is_closing()
для перевірки, закривається чи закривається транспорт. (Уклав Юрій Селіванов.)Метод
loop.create_server()
тепер може приймати список хостів. (Надав Ян Сіно.)Новий метод
loop.create_future()
для створення об’єктів Future. Це дозволяє альтернативним реалізаціям циклу подій, таким як uvloop, забезпечити швидшу реалізаціюasyncio.Future
. (Надав Юрій Селіванов у bpo-27041.)Новий метод
loop.get_exception_handler()
для отримання поточного обробника винятків. (Надав Юрій Селіванов у bpo-27040.)Новий метод
StreamReader.readuntil()
для читання даних із потоку, доки не з’явиться послідовність байтів-роздільників. (Надав Марк Коренберг.)Продуктивність
StreamReader.readexactly()
була покращена. (Надав Марк Коренберг у bpo-28370.)Метод
loop.getaddrinfo()
оптимізовано, щоб уникнути виклику системної функціїgetaddrinfo
, якщо адресу вже визначено. (Надав А. Джессі Джірю Девіс.)Метод
loop.stop()
було змінено, щоб зупинити цикл одразу після поточної ітерації. Будь-які нові зворотні виклики, заплановані в результаті останньої ітерації, будуть відхилені. (Надав Гвідо ван Россум у bpo-25593.)Future.set_exception
тепер викличеTypeError
, коли передається екземпляр виняткуStopIteration
. (Надав Кріс Анджеліко в bpo-26221.)Новий метод
loop.connect_accepted_socket()
для використання серверами, які приймають підключення за межами asyncio, але використовують asyncio для їх обробки. (Надав Джим Фултон у bpo-27392.)Прапор
TCP_NODELAY
тепер установлено для всіх транспортів TCP за замовчуванням. (Надав Юрій Селіванов у bpo-27456.)Новий
loop.shutdown_asyncgens()
для належного закриття очікуваних асинхронних генераторів перед закриттям циклу. (Надав Юрій Селіванов у bpo-28003.)Класи
Future
іTask
тепер мають оптимізовану реалізацію C, яка робить асинхронний код на 30% швидшим. (Надано Юрієм Селівановим та INADA Naoki у bpo-26081 та bpo-28544.)
binascii¶
Функція b2a_base64()
тепер приймає додатковий аргумент ключового слова новий рядок, щоб контролювати, чи додається символ нового рядка до значення, що повертається. (Надав Віктор Стіннер у bpo-25357.)
cmath¶
Додано нову константу cmath.tau
(τ). (Надано Лізою Роуч у bpo-12345, подробиці див. PEP 628.)
Нові константи: cmath.inf
і cmath.nan
для відповідності math.inf
і math.nan
, а також cmath.infj
і cmath.nanj
, щоб відповідати формату, який використовується комплексним відображенням. (Надав Марк Дікінсон у bpo-23229.)
колекції¶
Новий абстрактний базовий клас Collection
додано для представлення ітерованих контейнерних класів розміру. (Надав Іван Левківський, документи Ніл Ґірдхар у bpo-27598.)
Новий Reversible
абстрактний базовий клас представляє ітераційні класи, які також забезпечують метод __reversed__()
. (Надав Іван Левківський у bpo-25987.)
Новий AsyncGenerator
абстрактний базовий клас представляє асинхронні генератори. (Надав Юрій Селіванов у bpo-28720.)
Функція namedtuple()
тепер приймає необов’язковий аргумент ключового слова module, який, якщо вказано, використовується для атрибута __module__
повернутого іменованого класу кортежу. (Надав Реймонд Геттінгер у bpo-17941.)
Аргументи verbose і rename для namedtuple()
тепер є лише ключовими словами. (Надав Реймонд Геттінгер у bpo-25628.)
Рекурсивні екземпляри collections.deque
тепер можна маринувати. (Надав Сергій Сторчака в bpo-26482.)
concurrent.futures¶
Конструктор класу ThreadPoolExecutor
тепер приймає додатковий аргумент префікс_назви_потоку, щоб можна було налаштувати імена потоків, створених пулом. (Надав Грегорі П. Сміт у bpo-27664.)
contextlib¶
The contextlib.AbstractContextManager
class has been added to
provide an abstract base class for context managers. It provides a
sensible default implementation for __enter__() which returns
self
and leaves __exit__() an abstract method. A matching
class has been added to the typing
module as
typing.ContextManager
.
(Contributed by Brett Cannon in bpo-25609.)
дата, час¶
Класи datetime
і time
мають новий атрибут fold
, який використовується для усунення неоднозначності місцевого часу, коли це необхідно. Багато функцій у datetime
було оновлено для підтримки визначення неоднозначності за місцевим часом. Перегляньте розділ Визначення неоднозначності за місцевим часом для отримання додаткової інформації. (Надав Олександр Бєлопольський у bpo-24773.)
Методи datetime.strftime()
і date.strftime()
тепер підтримують директиви дати ISO 8601 %G
, %u
і %V
(Надано Ешлі Андерсон у bpo-12006.)
Функція datetime.isoformat()
тепер приймає необов’язковий аргумент timespec, який визначає кількість додаткових компонентів значення часу, які потрібно включити. (Надано Алессандро Куччі та Олександром Белопольським у bpo-19475.)
datetime.combine()
тепер приймає необов’язковий аргумент tzinfo. (Надав Олександр Бєлопольський у bpo-27661.)
десятковий¶
Новий Decimal.as_integer_ratio()
метод, який повертає пару (n, d)
цілих чисел, які представляють заданий Decimal
екземпляр у вигляді дробу, у найменших членах і з додатним знаменником:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(Надано Стефаном Крахом та Марком Дікінсоном у bpo-25928.)
distutils¶
Атрибут default_format
було видалено з distutils.command.sdist.sdist
, а атрибут formats
за умовчанням має ['gztar']
. Хоча це не передбачається, будь-який код, який покладається на присутність default_format
, можливо, потребуватиме адаптації. Дивіться bpo-27819 для отримання додаткової інформації.
електронною поштою¶
Новий API електронної пошти, активований за допомогою ключового слова policy для різних конструкторів, більше не є тимчасовим. Документацію email
було реорганізовано та переписано, щоб зосередитися на новому API, зберігаючи при цьому стару документацію для застарілого API. (Надав Р. Девід Мюррей у bpo-24277.)
Усі класи email.mime
тепер приймають необов’язкове ключове слово policy. (Надано Berker Peksag у bpo-27331.)
DecodedGenerator
тепер підтримує ключове слово policy.
Існує новий атрибут policy
, message_factory
, який контролює, який клас використовується за замовчуванням, коли аналізатор створює нові об’єкти повідомлень. Для політики email.policy.compat32
це Message
, для нових політик це EmailMessage
. (Надав Р. Девід Мюррей у bpo-20476.)
кодування¶
У Windows додано кодування 'oem
для використання CP_OEMCP
та псевдонім 'ansi'
для існуючого кодування 'mbcs'
, яке використовує CP_ACP
кодова сторінка. (Надав Стів Дауер у bpo-27959.)
перелік¶
До модуля enum
додано два нові базові класи перерахування: Flag
і IntFlags
. Обидва використовуються для визначення констант, які можна комбінувати за допомогою побітових операторів. (Надав Ітан Фурман у bpo-23591.)
Багато модулів стандартної бібліотеки було оновлено для використання класу IntFlags
для своїх констант.
Нове значення enum.auto
можна використовувати для автоматичного призначення значень членам enum:
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
обробник помилок¶
У Windows модуль faulthandler
тепер встановлює обробник винятків Windows: див. faulthandler.enable()
. (Надав Віктор Стіннер у bpo-23848.)
введення файлу¶
hook_encoded()
тепер підтримує аргумент errors. (Надав Джозеф Хекман у bpo-25788.)
хешліб¶
hashlib
підтримує OpenSSL 1.1.0. Мінімальна рекомендована версія 1.0.2. (Надав Крістіан Хеймс у bpo-26470.)
У модуль додано хеш-функції BLAKE2. blake2b()
і blake2s()
завжди доступні та підтримують повний набір функцій BLAKE2. (Надано Крістіаном Хеймсом у bpo-26798 на основі коду Дмитра Честних і Семюеля Невеса. Документацію написав Дмитро Честних.)
Хеш-функції SHA-3 sha3_224()
, sha3_256()
, sha3_384()
, sha3_512()
і хеш-функції SHAKE Додано shake_128()
і shake_256()
. (Надано Крістіаном Хеймсом у bpo-16113. Пакет кодів Keccak від Гвідо Бертоні, Джоан Демен, Майкла Пітерса, Жиля Ван Аше та Ронні Ван Кіра.)
Функція отримання ключа на основі пароля scrypt()
тепер доступна з OpenSSL 1.1.0 і новіших версій. (Надав Крістіан Хеймс у bpo-27928.)
http.client¶
HTTPConnection.request()
і endheaders()
тепер підтримують частини запитів на кодування. (Надано Деміаном Брехтом і Рольфом Кралем у bpo-12319.)
idlelib і IDLE¶
Пакет idlelib модернізується та переробляється, щоб IDLE виглядав і працював краще, а код було легше зрозуміти, тестувати та вдосконалювати. Частиною покращення вигляду IDLE, особливо на Linux і Mac, є використання віджетів ttk, переважно в діалогових вікнах. У результаті IDLE більше не працює з tcl/tk 8.4. Тепер для цього потрібен tcl/tk 8.5 або 8.6. Ми рекомендуємо запустити останню версію будь-якого з них.
«Модернізація» включає перейменування та консолідацію модулів idlelib. Перейменування файлів із частковими назвами у верхньому регістрі подібне до перейменування, наприклад, Tkinter і TkFont на tkinter і tkinter.font у 3.0. Як наслідок, імпорт файлів idlelib, які працювали у 3.5, зазвичай не працюватимуть у 3.6. Потрібна буде принаймні зміна назви модуля (див. idlelib/README.txt), іноді більше. (Зміну назви внесли Ел Свігарт і Террі Ріді в bpo-24225. Більшість патчів idlelib відтоді були і будуть частиною процесу.)
Як компенсацію, кінцевим результатом буде те, що деякі класи idlelib стануть легшими у використанні, з кращими API та рядками документів, які їх пояснюватимуть. До idlelib буде додано додаткову корисну інформацію, коли вона стане доступною.
Нове в 3.6.2:
Кілька виправлень для автозавершення. (Надав Луї Лу в bpo-15786.)
Нове в 3.6.3:
Браузер модулів (у меню «Файл», раніше називався «Браузер класів») тепер відображає вкладені функції та класи на додаток до функцій і класів верхнього рівня. (Надано Гільєрме Поло, Шеріл Сабелла та Террі Ян Ріді в bpo-1612262.)
Функції IDLE, раніше реалізовані як розширення, були повторно реалізовані як звичайні функції. Їх налаштування переміщено з вкладки «Розширення» на інші вкладки діалогу. (Надано Charles Wohlganger і Terry Jan Reedy у bpo-27099.)
Діалогове вікно налаштувань (параметри, налаштування IDLE) було частково переписано, щоб покращити зовнішній вигляд і функції. (Надано Шеріл Сабеллою та Террі Джен Ріді в кількох випусках.)
Нове в 3.6.4:
Зразок шрифту тепер містить вибірку нелатинських символів, щоб користувачі могли краще побачити ефект від вибору певного шрифту. (Надав Террі Ян Ріді в bpo-13802.) Зразок можна редагувати, щоб включити інші символи. (Надав Сергій Сторчака в bpo-31860.)
Нове в 3.6.6:
Опцію контексту коду редактора переглянуто. Box відображає всі контекстні рядки до maxlines. Якщо клацнути рядок контексту, редактор перейде до цього рядка. Кольори контексту для спеціальних тем додано на вкладку «Висвітлення» діалогового вікна «Параметри». (Надано Шеріл Сабелла та Террі Ян Ріді в bpo-33642, bpo-33768 та bpo-33679.)
У Windows новий виклик API повідомляє Windows, що tk масштабується для DPI. У Windows 8.1+ або 10 із незмінними властивостями сумісності DPI двійкового коду Python і роздільною здатністю монітора понад 96 DPI текст і лінії мають бути чіткішими. В іншому випадку це не повинно мати ефекту. (Надав Террі Ян Ріді в bpo-33656.)
Нове в 3.6.7:
Виведення в N рядків (50 за замовчуванням) стиснуто до кнопки. N можна змінити в розділі PyShell на сторінці «Загальні» діалогового вікна «Параметри». Менше, але, можливо, наддовгих рядків можна стиснути, клацнувши правою кнопкою миші на виводі. Стиснутий вихід можна розгорнути на місці, подвійним клацанням кнопки або в буфер обміну чи окреме вікно, клацнувши кнопку правою кнопкою миші. (Надав Тал Ейнат у bpo-1529353.)
importlib¶
Імпорт тепер викликає новий виняток ModuleNotFoundError
(підклас ImportError
), коли він не може знайти модуль. Код, який зараз перевіряє ImportError
(у try-except), все ще працюватиме. (Надав Ерік Сноу в bpo-15767.)
importlib.util.LazyLoader
тепер викликає create_module()
в оберненому завантажувачі, усуваючи обмеження, які importlib.machinery.BuiltinImporter
та importlib .machinery.ExtensionFileLoader
не можна використовувати з importlib.util.LazyLoader
.
importlib.util.cache_from_source()
, importlib.util.source_from_cache()
і importlib.util.spec_from_file_location()
тепер приймають path-like object.
оглядати¶
Функція inspect.signature()
тепер повідомляє неявні параметри .0
, згенеровані компілятором для розуміння, і області виразу генератора, як якщо б вони були лише позиційними параметрами, які називаються implicit0
. (Надано Jelle Zijlstra в bpo-19611.)
Щоб зменшити відтік коду під час оновлення з Python 2.7 і застарілого inspect.getargspec()
API, раніше задокументований застарілий inspect.getfullargspec()
було скасовано. Незважаючи на те, що ця функція зручна для базового коду Python 2/3 з одним/вихідним кодом, багатший інтерфейс inspect.signature()
залишається рекомендованим підходом для нового коду. (Надав Нік Коглан у bpo-27172)
json¶
json.load()
і json.loads()
тепер підтримують двійкове введення. Закодований JSON має бути представлений за допомогою UTF-8, UTF-16 або UTF-32. (Надав Сергій Сторчака в bpo-17909.)
лісозаготівля¶
Додано новий метод WatchedFileHandler.reopenIfNeeded()
, щоб додати можливість перевірити, чи потрібно повторно відкрити файл журналу. (Надав Маріан Горбань у bpo-24884.)
математика¶
Константу tau (τ) додано до модулів math
і cmath
. (Надано Лізою Роуч у bpo-12345, подробиці див. PEP 628.)
багатопроцесорність¶
Проксі-об’єкти, які повертає multiprocessing.Manager()
, тепер можна вкладати. (Надав Девін Поттс у bpo-6766.)
ос¶
Перегляньте підсумок PEP 519, щоб дізнатися, як модулі os
і os.path
тепер підтримують path-подібні об’єкти.
scandir()
тепер підтримує шляхи bytes
у Windows.
Новий метод close()
дозволяє явно закривати ітератор scandir()
. Ітератор scandir()
тепер підтримує протокол context manager. Якщо ітератор scandir()
не вичерпано і не закрито явно, у його деструкторі буде видано ResourceWarning
. (Надав Сергій Сторчака в bpo-25994.)
У Linux os.urandom()
тепер блокується, доки системний пул ентропії не буде ініціалізовано для підвищення безпеки. Перегляньте PEP 524 для обґрунтування.
Системний виклик Linux getrandom()
(отримання випадкових байтів) тепер доступний як нова функція os.getrandom()
. (Надав Віктор Стіннер, частина PEP 524)
pathlib¶
pathlib
тепер підтримує шляхові об’єкти. (Надано Бреттом Кенноном у bpo-27186.)
Подробиці дивіться в резюме PEP 519.
pdb¶
Конструктор класу Pdb
має новий необов’язковий аргумент readrc для керування тим, чи слід читати файли .pdbrc
.
маринований огірок¶
Об’єкти, які потребують виклику __new__
із ключовими аргументами, тепер можна вибирати за допомогою протоколів pickle, старших за протокол версії 4. Протокол версії 4 уже підтримує цей випадок. (Надав Сергій Сторчака в bpo-24164.)
інструменти для маринування¶
pickletools.dis()
тепер виводить неявний індекс memo для коду операції MEMOIZE
. (Надав Сергій Сторчака в bpo-25382.)
pydoc¶
Модуль pydoc
навчився поважати змінну середовища MANPAGER
. (Надав Маттіас Клозе в bpo-8637.)
help()
і pydoc
тепер можуть перераховувати іменовані поля кортежу в порядку їх визначення, а не в алфавітному порядку. (Надав Реймонд Геттінгер у bpo-24879.)
випадковий¶
Нова функція choices()
повертає список елементів заданого розміру з заданої сукупності з додатковими вагами. (Надав Реймонд Геттінгер у bpo-18844.)
повторно¶
Додано підтримку модифікаторів span у регулярних виразах. Приклади: '(?i:p)ython
відповідає 'python'
і 'Python'
, але не 'PYTHON'
; '(?i)g(?-i:v)r''
відповідає 'GvR''
і 'gvr''
, але не 'GVR''
. (Надав Сергій Сторчака в bpo-433028.)
Доступ до груп об’єктів відповідності можна отримати за допомогою __getitem__
, що еквівалентно group()
. Отже, mo['name']
тепер еквівалентно mo.group('name')
. (Надав Ерік Сміт у bpo-24454.)
Match
об’єкти тепер підтримують індексоподібні об’єкти
як групові індекси. (Надано Jeroen Demeyer і Xiang Zhang у bpo-27177.)
readline¶
Додано set_auto_history()
, щоб увімкнути або вимкнути автоматичне додавання введених даних до списку історії. (Надав Тайлер Кромптон у bpo-26870.)
rlcompleter¶
Приватні та спеціальні назви атрибутів тепер опущені, якщо префікс не починається з підкреслення. Після деяких завершених ключових слів додається пробіл або двокрапка. (Надав Сергій Сторчака в bpo-25011 та bpo-25209.)
шлекс¶
shlex
має значно покращену сумісність оболонки завдяки новому аргументу punctuation_chars для контролю того, які символи розглядаються як знаки пунктуації. (Надав Віней Саджип у bpo-1521950.)
сайт¶
When specifying paths to add to sys.path
in a .pth file,
you may now specify file paths on top of directories (e.g. zip files).
(Contributed by Wolfgang Langner in bpo-26587).
sqlite3¶
sqlite3.Cursor.lastrowid
тепер підтримує оператор REPLACE
. (Надав Алекс ЛордТорсен у bpo-16864.)
гніздо¶
Функція ioctl()
тепер підтримує керуючий код SIO_LOOPBACK_FAST_PATH
. (Надав Деніел Стокс у bpo-26536.)
Тепер підтримуються константи getsockopt()
SO_DOMAIN
, SO_PROTOCOL
, SO_PEERSEC
і SO_PASSSEC
. (Надав Крістіан Хеймс у bpo-26907.)
setsockopt()
тепер підтримує форму setsockopt(level, optname, None, optlen: int)
. (Надав Крістіан Хеймс у bpo-27744.)
Модуль сокета тепер підтримує сімейство адрес AF_ALG
для взаємодії з API шифрування ядра Linux. Було додано ALG_*
, SOL_ALG
і sendmsg_afalg()
. (Надано Крістіаном Хеймсом у bpo-27744 за підтримки Віктора Стіннера.)
New Linux constants TCP_USER_TIMEOUT
and TCP_CONGESTION
were added.
(Contributed by Omar Sandoval, issue:26273).
сокетсервер¶
Сервери на основі модуля socketserver
, включно з тими, що визначені в http.server
, xmlrpc.server
і wsgiref.simple_server
, тепер підтримують context manager протокол. (Надав Авів Паливода в bpo-26404.)
Атрибут wfile
класів StreamRequestHandler
тепер реалізує інтерфейс для запису io.BufferedIOBase
. Зокрема, виклик write()
тепер гарантує надсилання даних у повному обсязі. (Надав Мартін Пантер у bpo-26721.)
ssl¶
ssl
підтримує OpenSSL 1.1.0. Мінімальна рекомендована версія 1.0.2. (Надав Крістіан Хеймс у bpo-26470.)
3DES було видалено зі стандартних наборів шифрів і додано набори шифрів ChaCha20 Poly1305. (Надано Крістіаном Хеймсом у bpo-27850 та bpo-27766.)
SSLContext
має кращу конфігурацію за замовчуванням для параметрів і шифрів. (Надав Крістіан Хеймс у bpo-28043.)
Сеанс SSL можна скопіювати з одного клієнтського підключення до іншого за допомогою нового класу SSLSession
. Відновлення сеансу TLS може пришвидшити початкове рукостискання, зменшити затримку та підвищити продуктивність (надано Крістіаном Хеймсом у bpo-19500 на основі чернетки Алекса Вархока.)
Новий метод get_ciphers()
можна використовувати для отримання списку ввімкнених шифрів у порядку пріоритету шифру.
Усі константи та прапорці було перетворено на IntEnum
та IntFlags
. (Надав Крістіан Хеймс у bpo-28025.)
Спеціальні для сервера та клієнта протоколи TLS для SSLContext
були додані. (Надав Крістіан Хеймс у bpo-28085.)
статистика¶
Додано нову функцію harmonic_mean()
. (Надав Стівен Д’Апрано в bpo-27181.)
структура¶
struct
тепер підтримує числа з плаваючою точкою половинної точності IEEE 754 через специфікатор формату 'e''
. (Надано Елі Стівенсом, Марком Дікінсоном у bpo-11734.)
підпроцес¶
Деструктор subprocess.Popen
тепер видає попередження ResourceWarning
, якщо дочірній процес все ще виконується. Використовуйте протокол менеджера контексту (with proc: ...
) або явно викликайте метод wait()
, щоб прочитати статус виходу дочірнього процесу. (Надав Віктор Стіннер у bpo-26741.)
Конструктор subprocess.Popen
і всі функції, які передають йому аргументи, тепер приймають аргументи encoding і errors. Визначення будь-якого з них увімкне текстовий режим для потоків stdin, stdout і stderr. (Надав Стів Дауер у bpo-6135.)
система¶
Нова функція getfilesystemencodeerrors()
повертає назву режиму помилки, який використовується для перетворення між іменами файлів Unicode та іменами файлів байтів. (Надав Стів Дауер у bpo-27781.)
У Windows значення, що повертається функцією getwindowsversion()
, тепер включає поле platform_version, яке містить точну основну версію, додаткову версію та номер збірки поточної операційної системи, а не версію, яка емулюється для процесу (надав Стів Дауер у bpo-27932.)
telnetlib¶
Telnet
тепер є контекстним менеджером (надано Stéphane Wirtel у bpo-25485).
час¶
Атрибути struct_time
tm_gmtoff
і tm_zone
тепер доступні на всіх платформах.
timeit¶
Додано новий зручний метод Timer.autorange()
для багаторазового виклику Timer.timeit()
так, щоб загальний час виконання був більшим або рівним 200 мілісекундам. (Надав Стівен Д’Апрано в bpo-6422.)
timeit
тепер попереджає про значну (4x) різницю між найкращим і гіршим часом. (Надав Сергій Сторчака в bpo-23552.)
tkinter¶
Додано методи trace_add()
, trace_remove()
і trace_info()
в клас tkinter.Variable
. Вони замінюють старі методи trace_variable()
, trace()
, trace_vdelete()
та trace_vinfo()
, які використовують застарілі команди Tcl і можуть не працювати в майбутніх версіях Tcl. (Надав Сергій Сторчака в bpo-22115).
простежити¶
Як модуль відстеження, так і вбудований дисплей винятків інтерпретатора тепер скорочують довгі послідовності повторюваних рядків у відстеженнях, як показано в наступному прикладі:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(Надав Емануель Баррі в bpo-26823.)
tracemalloc¶
Модуль tracemalloc
тепер підтримує відстеження розподілу пам’яті в кількох різних адресних просторах.
Додано новий клас фільтра DomainFilter
для фільтрації трасування блоків за їх адресним простором (доменом).
(Надав Віктор Стіннер у bpo-26588.)
введення тексту¶
Оскільки модуль typing
є провізорним, усі зміни, внесені в Python 3.6, також було перенесено до Python 3.5.x.
Модуль typing
має значно покращену підтримку загальних псевдонімів типів. Наприклад, Dict[str, Tuple[S, T]]
тепер є дійсною анотацією типу. (Надано Гвідо ван Россумом у Github #195.)
Клас typing.ContextManager
додано для представлення contextlib.AbstractContextManager
. (Надав Бретт Кеннон у bpo-25609.)
Клас typing.Collection
додано для представлення collections.abc.Collection
. (Надав Іван Левківський у bpo-27598.)
Для позначення змінних класу додано конструкцію типу typing.ClassVar
. Як представлено в PEP 526, анотація змінної, загорнена в ClassVar, вказує на те, що даний атрибут призначений для використання як змінна класу і не повинен встановлюватися для екземплярів цього класу. (Надав Іван Левківський у Github #280.)
Нова константа TYPE_CHECKING
, яка вважається True
засобами перевірки статичних типів, але є False
під час виконання. (Надано Гвідо ван Россумом у Github #230.)
Додано нову допоміжну функцію NewType()
для створення легких різних типів для анотацій:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
Засіб перевірки статичного типу розглядатиме новий тип як підклас вихідного типу. (Надав Іван Левківський у Github #189.)
unicodedata¶
The unicodedata
module now uses data from Unicode 9.0.0.
(Contributed by Benjamin Peterson.)
unittest.mock¶
Клас Mock
має наступні покращення:
Два нові методи,
Mock.assert_ called()
іMock.assert_ called_once()
, щоб перевірити, чи був викликаний макетний об’єкт. (Надав Аміт Саха в bpo-26323.)Метод
Mock.reset_mock()
тепер має два необов’язкові аргументи лише для ключових слів: return_value і side_effect. (Надав Кушал Дас у bpo-21271.)
urllib.request¶
Якщо HTTP-запит містить файл або ітераційне тіло (крім об’єкта bytes), але немає заголовка Content-Length
, а не видає помилку, AbstractHTTPHandler
тепер повертається до використання фрагментоване кодування передачі. (Надано Деміаном Брехтом і Рольфом Кралем у bpo-12319.)
urllib.robotparser¶
RobotFileParser
тепер підтримує розширення Crawl-delay
і Request-rate
. (Надав Микола Богойчев у bpo-16099.)
venv¶
venv
приймає новий параметр --prompt
. Цей параметр надає альтернативний префікс для віртуального середовища. (Запропоновано Łukasz Balcerzak і перенесено на 3.6 Stéphane Wirtel у bpo-22829.)
попередження¶
До функції warnings.warn_explicit()
додано новий необов’язковий параметр source: знищений об’єкт, який випустив ResourceWarning
. Атрибут source також додано до warnings.WarningMessage
(надано Віктором Стіннером у bpo-26568 та bpo-26567).
Коли реєструється попередження ResourceWarning
, модуль tracemalloc
тепер використовується для спроби отримати зворотне відстеження, де було розміщено знищений об’єкт.
Приклад зі скриптом example.py
:
import warnings
def func():
return open(__file__)
f = func()
f = None
Вихід команди python3.6 -Wd -X tracemalloc=5 example.py
:
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
Зворотне відстеження «Об’єкт, виділений у» є новим і відображається, лише якщо tracemalloc
відстежує виділення пам’яті Python і якщо модуль warnings
уже було імпортовано.
winreg¶
Додано 64-розрядний цілочисельний тип REG_QWORD
. (Надав Клемент Руо в bpo-23026.)
winsound¶
Дозволені аргументи ключових слів для Beep
, MessageBeep
і PlaySound
(bpo-27982).
xmlrpc.client¶
Модуль xmlrpc.client
тепер підтримує демаршалінг додаткових типів даних, які використовуються реалізацією Apache XML-RPC для чисел і None
. (Надав Сергій Сторчака в bpo-26885.)
zip-файл¶
Новий метод класу ZipInfo.from_file()
дозволяє створити екземпляр ZipInfo
з файлу файлової системи. Новий метод ZipInfo.is_dir()
можна використовувати, щоб перевірити, чи екземпляр ZipInfo
представляє каталог. (Надав Томас Клюйвер у bpo-26039.)
Метод ZipFile.open()
тепер можна використовувати для запису даних у файл ZIP, а також для вилучення даних. (Надав Томас Клюйвер у bpo-26039.)
zlib¶
Функції compress()
і decompress()
тепер приймають ключові аргументи. (Надано Aviv Palivoda у bpo-26243 та Xiang Zhang у bpo-16764 відповідно.)
Оптимізації¶
Інтерпретатор Python тепер використовує 16-бітний словесний код замість байт-коду, що зробило можливим ряд оптимізацій коду операції. (Надано Демуром Румедом із коментарями та рецензіями Сергія Сторчака та Віктора Стіннера в bpo-26647 та bpo-28050.)
Клас
asyncio.Future
тепер має оптимізовану реалізацію C. (Надано Юрієм Селівановим та INADA Naoki у bpo-26081.)Клас
asyncio.Task
тепер має оптимізовану реалізацію C. (Надав Юрій Селіванов у bpo-28544.)Різні вдосконалення реалізації в модулі
typing
(такі як кешування загальних типів) дозволяють до 30 разів підвищити продуктивність і зменшити обсяг пам’яті.Декодер ASCII тепер у 60 разів швидший для обробників помилок
surrogateescape
,ignore
іreplace
(надано Віктором Стіннером у bpo-24870).Кодери ASCII і Latin1 тепер у 3 рази швидші для обробника помилок
surrogateescape
(надано Віктором Стіннером у bpo-25227).Кодер UTF-8 тепер у 75 разів швидший для обробників помилок
ignore
,replace
,surrogateescape
,surrogatepass
(Надано Віктором Стіннером у bpo-25267).Декодер UTF-8 тепер у 15 разів швидший для обробників помилок
ignore
,replace
іsurrogateescape
(надано Віктором Стіннером у bpo-25301).bytes % args
тепер у 2 рази швидше. (Надав Віктор Стіннер у bpo-25349).bytearray % args
тепер у 2,5-5 разів швидше. (Надав Віктор Стіннер у bpo-25399).Оптимізуйте
bytes.fromhex()
іbytearray.fromhex()
: тепер вони працюють у 2-3,5 рази швидше. (Надав Віктор Стіннер у bpo-25401).Оптимізуйте
bytes.replace(b'', b'.')
іbytearray.replace(b'', b'.')
: до 80% швидше. (Надав Джош Снайдер у bpo-26574).Функції розподільника домену
PyMem_Malloc()
(PYMEM_DOMAIN_MEM
) тепер використовують розподільник пам’яті pymalloc замість функціїmalloc()
бібліотеки C . Розподільник pymalloc оптимізовано для об’єктів розміром менше або дорівнює 512 байтам із коротким часом життя, і використовуйтеmalloc()
для більших блоків пам’яті. (Надав Віктор Стіннер у bpo-26249).pickle.load()
іpickle.loads()
тепер на 10% швидше під час десеріалізації багатьох малих об’єктів (надано Віктором Стіннером у bpo-27056).Передача аргументів ключового слова до функції має додаткові витрати порівняно з передачею позиційних аргументів. Тепер у функціях розширення, реалізованих за допомогою Argument Clinic, ці накладні витрати значно зменшені. (Надав Сергій Сторчака в bpo-27574).
Оптимізовано функції
glob()
іiglob()
в модуліglob
; тепер вони приблизно в 3-6 разів швидші. (Надав Сергій Сторчака в bpo-25596).Оптимізовано глобінг у
pathlib
за допомогоюos.scandir()
; зараз це приблизно в 1,5-4 рази швидше. (Надав Сергій Сторчака в bpo-26032).xml.etree.ElementTree
продуктивність аналізу, ітерації та глибокого копіювання була значно покращена. (Надав Сергій Сторчака в bpo-25638, bpo-25873 та bpo-25869.)Створення екземплярів
fractions.Fraction
із числами з плаваючою точкою та десятковими числами тепер у 2-3 рази швидше. (Надав Сергій Сторчака в bpo-25971.)
Зміни збірки та C API¶
Для створення Python тепер потрібна певна підтримка C99 у ланцюжку інструментів. Зокрема, Python тепер використовує стандартні цілі типи та макроси замість спеціальних макросів, таких як
PY_LONG_LONG
. Для отримання додаткової інформації перегляньте PEP 7 і bpo-17884.Перехресна компіляція CPython із Android NDK і Android API на рівні 21 (Android 5.0 Lollipop) або новіша працює успішно. Хоча Android ще не підтримується платформою, набір тестів Python працює на емуляторі Android лише з приблизно 16 помилками тестів. Перегляньте метапроблему Android bpo-26865.
Додано прапор конфігурації
--enable-optimizations
. Його ввімкнення активує дорогі оптимізації, такі як PGO. (Оригінальний патч від Alecsandru Patrascu з Intel у bpo-26359.)GIL тепер потрібно утримувати, коли функції розподільника
PYMEM_DOMAIN_OBJ
(наприклад:PyObject_Malloc()
) іPYMEM_DOMAIN_MEM
(наприклад:PyMem_Malloc()
) викликаються домени.Новий
Py_FinalizeEx()
API, який вказує на помилку очищення буферизованих даних. (Надав Мартін Пантер у bpo-5319.)PyArg_ParseTupleAndKeywords()
тепер підтримує позиційні параметри. Лише позиційні параметри визначаються порожніми іменами. (Надав Сергій Сторчака в bpo-26282).Метод
PyTraceback_Print
тепер скорочує довгі послідовності повторюваних рядків як"[Попередній рядок повторюється {count} більше разів]"
. (Надав Емануель Баррі в bpo-26823.)Нова функція
PyErr_SetImportErrorSubclass()
дозволяє вказати підкласImportError
для підвищення. (Надав Ерік Сноу в bpo-15767.)Нову функцію
PyErr_ResourceWarning()
можна використовувати для генераціїResourceWarning
, яка вказує джерело розподілу ресурсу. (Надав Віктор Стіннер у bpo-26567.)Нова функція
PyOS_FSPath()
повертає представлення файлової системи path-like object. (Надав Бретт Кеннон у bpo-27186.)Функції
PyUnicode_FSConverter()
іPyUnicode_FSDecoder()
тепер прийматимуть шляхові об’єкти.
Інші вдосконалення¶
Коли
--version
(коротка форма:-V
) надається двічі, Python друкуєsys.version
для отримання детальної інформації.$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
Застаріле¶
Нові ключові слова¶
async
і await
не рекомендується використовувати як імена змінних, класів, функцій або модулів. Представлені PEP 492 у Python 3.5, вони стануть правильними ключовими словами в Python 3.7. Починаючи з Python 3.6, використання async
або await
як імен створюватиме DeprecationWarning
.
Застаріла поведінка Python¶
Підвищення винятку StopIteration
всередині генератора тепер створить DeprecationWarning
і викличе RuntimeError
у Python 3.7. Докладніше див. PEP 479: змініть обробку StopIteration всередині генераторів.
Тепер очікується, що метод __aiter__()
повертатиме безпосередньо асинхронний ітератор замість того, щоб повертати awaitable, як раніше. Виконання першого призведе до появи DeprecationWarning
. У Python 3.7 буде видалено зворотну сумісність. (Надав Юрій Селіванов у bpo-27243.)
Пара символів зворотної похилої риски, яка не є дійсною керуючою послідовністю, тепер генерує DeprecationWarning
. Хоча це з часом стане SyntaxError
, це не буде для кількох випусків Python. (Надав Емануель Баррі в bpo-27364.)
Під час виконання відносного імпорту повернення до __name__
і __path__
з викликаючого модуля, коли __spec__
або __package__
тепер не визначено, викликає ImportWarning
. (Надано Роуз Еймс у bpo-25791.)
Застарілі модулі, функції та методи Python¶
асинчат¶
asynchat
застаріло на користь asyncio
. (Надано Mariatta в bpo-25002.)
несиндром¶
asyncore
застаріло на користь asyncio
. (Надано Mariatta в bpo-25002.)
dbm¶
На відміну від інших реалізацій dbm
, модуль dbm.dumb
створює бази даних у режимі 'rw'
і дозволяє змінювати базу даних, відкриту в режимі 'r'
. Ця поведінка тепер застаріла та буде видалена у версії 3.8. (Надав Сергій Сторчака в bpo-21708.)
distutils¶
Недокументований аргумент extra_path
до конструктора Distribution
тепер вважається застарілим і викличе попередження, якщо встановлено. Підтримку цього параметра буде вилучено в майбутньому випуску Python. Докладніше див. bpo-27919.
група¶
Підтримка нецілочисельних аргументів у getgrgid()
застаріла. (Надав Сергій Сторчака в bpo-26129.)
importlib¶
Методи importlib.machinery.SourceFileLoader.load_module()
і importlib.machinery.SourcelessFileLoader.load_module()
тепер застаріли. Це були єдині реалізації importlib.abc.Loader.load_module()
в importlib
, які не були застарілими в попередніх версіях Python на користь importlib.abc.Loader.exec_module()
.
Клас importlib.machinery.WindowsRegistryFinder
тепер застарілий. Починаючи з версії 3.6.0, він усе ще додається до sys.meta_path
за замовчуванням (у Windows), але це може змінитися в наступних випусках.
ос¶
Недокументована підтримка загальних байт-подібних об’єктів як шляхів у функціях os
, compile()
та подібних функціях тепер застаріла. (Надав Сергій Сторчака в bpo-25791 та bpo-26754.)
повторно¶
Підтримка вбудованих прапорців (?літери)
в середині регулярного виразу застаріла та буде видалена в майбутній версії Python. Прапорці на початку регулярного виразу все ще дозволені. (Надав Сергій Сторчака в bpo-22493.)
ssl¶
OpenSSL 0.9.8, 1.0.0 і 1.0.1 застаріли та більше не підтримуються. У майбутньому модуль ssl
вимагатиме принаймні OpenSSL 1.0.2 або 1.1.0.
Аргументи, пов’язані з SSL, як-от certfile
, keyfile
і check_hostname
у ftplib
, http.client
, imaplib
, poplib
і smtplib
застаріли на користь context
. (Надав Крістіан Хеймс у bpo-28022.)
Кілька протоколів і функцій модуля ssl
тепер застаріли. Деякі функції більше не будуть доступні в майбутніх версіях OpenSSL. Інші функції застаріли на користь іншого API. (Надано Крістіаном Хеймсом у bpo-28022 та bpo-26470.)
tkinter¶
Модуль tkinter.tix
тепер не підтримується. Користувачі tkinter
повинні замість цього використовувати tkinter.ttk
.
venv¶
Сценарій pyvenv
застарів на користь python3 -m venv
. Це запобігає плутанині щодо того, до якого інтерпретатора Python підключено pyvenv
і, таким чином, який інтерпретатор Python використовуватиме віртуальне середовище. (Надано Бреттом Кенноном у bpo-25154.)
Застарілі функції та типи C API¶
Недокументовані функції PyUnicode_AsEncodedObject()
, PyUnicode_AsDecodedObject()
, PyUnicode_AsEncodedUnicode()
і PyUnicode_AsDecodedUnicode()
зараз застаріли. Натомість використовуйте загальний API на основі кодека.
Застарілі параметри збірки¶
Прапор конфігурації --with-system-ffi
тепер увімкнено за замовчуванням на платформах UNIX, відмінних від macOS. Його можна вимкнути за допомогою --without-system-ffi
, але використання прапора є застарілим і не буде прийматися в Python 3.7. Ця зміна не впливає на macOS. Зауважте, що багато розповсюджувачів ОС уже використовують прапорець --with-system-ffi
під час створення своєї системи Python.
Видалено¶
Видалення API та функцій¶
Невідомі вихідні коди, що складаються з
'\'
і літери ASCII у регулярних виразах, тепер спричинятимуть помилку. У шаблонах заміни дляre.sub()
вони все ще дозволені, але не рекомендовані. Прапорre.LOCALE
тепер можна використовувати лише з бінарними шаблонами.inspect.getmoduleinfo()
було видалено (було застарілим з CPython 3.3).inspect.getmodulename()
слід використовувати для отримання імені модуля для заданого шляху. (Надав Юрій Селіванов у bpo-13248.)Клас
traceback.Ignore
іtraceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
, Методиtraceback.find_strings
,traceback.find_executable_lines
видалено з модуляtraceback
. Це були недокументовані методи, які застаріли з Python 3.2, і еквівалентна функціональність доступна з приватних методів.Фіктивні методи
tk_menuBar()
іtk_bindForTraversal()
у класах віджетівtkinter
були видалені (відповідні команди Tk застаріли з Tk 4.0).Метод
open()
класуzipfile.ZipFile
більше не підтримує режим'U'
(був застарілим з Python 3.4). Використовуйтеio.TextIOWrapper
для читання стиснених текстових файлів у режимі universal newlines.The undocumented
IN
,CDROM
,DLFCN
,TYPES
,CDIO
, andSTROPTS
modules have been removed. They had been available in the platform specificLib/plat-*/
directories, but were chronically out of date, inconsistently available across platforms, and unmaintained. The script that created these modules is still available in the source distribution at Tools/scripts/h2py.py.Застарілий клас
asynchat.fifo
було видалено.
Перенесення на Python 3.6¶
У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.
Зміни в поведінці команд «python».¶
Вихід спеціальної збірки Python із визначеними макросами
COUNT_ALLOCS
,SHOW_ALLOC_COUNT
абоSHOW_TRACK_COUNT
тепер вимкнено за замовчуванням. Його можна повторно ввімкнути за допомогою параметра-X showalloccount
. Тепер він виводить наstderr
замістьstdout
. (Надав Сергій Сторчака в bpo-23034.)
Зміни в API Python¶
open()
більше не дозволить комбінувати прапор режиму'U'
з'+'
. (Надано Джеффом Балогом і Джоном О’Коннором у bpo-2091.)sqlite3
більше не явно фіксує відкриту транзакцію перед операторами DDL.У Linux
os.urandom()
тепер блокується, доки системний пул ентропії не буде ініціалізовано для підвищення безпеки.Коли визначено
importlib.abc.Loader.exec_module()
,importlib.abc.Loader.create_module()
також має бути визначено.PyErr_SetImportError()
тепер встановлюєTypeError
, коли його аргумент msg не встановлено. Раніше повертався лишеNULL
.Формат атрибута
co_lnotab
об’єктів коду змінено для підтримки від’ємної дельти номера рядка. За замовчуванням Python не видає байт-код із від’ємним номером рядка дельта. Функції, що використовуютьframe.f_lineno
,PyFrame_GetLineNumber()
абоPyCode_Addr2Line()
не впливають. Функції, які безпосередньо декодуютьco_lnotab
, слід оновити для використання 8-бітного цілого типу зі знаком для дельти номера рядка, але це потрібно лише для підтримки програм, які використовують дельту від’ємного номера рядка. ДивітьсяObjects/lnotab_notes.txt
, щоб дізнатися про форматco_lnotab
і як його декодувати, і перегляньте PEP 511 для обґрунтування.Функції в модулі
compileall
тепер повертають логічні значення замість1
або0
, щоб показати успіх або невдачу, відповідно. Завдяки тому, що булеві значення є підкласом цілих чисел, це має бути проблемою, лише якщо ви проводили перевірку ідентичності для1
або0
. Див. bpo-25768.Читання атрибута
port
результатівurllib.parse.urlsplit()
іurlparse()
тепер викликаєValueError
для виходу -of-range значення замість поверненняNone
. Див. bpo-20059.Модуль
imp
тепер викликаєDeprecationWarning
замістьPendingDeprecationWarning
.Наступні модулі мали відсутні API, додані до їхніх атрибутів
__all__
, щоб відповідати задокументованим API:calendar
,cgi
,csv
,ElementTree
,enum
,fileinput
,ftplib
,logging
,mailbox
,mimetypes
,optparse
,plistlib
,smtpd
,subprocess
,tarfile
,threading
іwave
. Це означає, що вони експортуватимуть нові символи, коли використовуєтьсяimport *
. (Надано Joel Taddei та Jacek Kołodziej у bpo-23883.)Під час виконання відносного імпорту, якщо
__package__
не порівнюється з__spec__.parent
, тоді виникаєImportWarning
. (Надано Бреттом Кенноном у bpo-25791.)Коли виконується відносний імпорт і батьківський пакет не відомий, буде викликано
ImportError
. Раніше могла виникатиSystemError
. (Надав Бретт Кеннон у bpo-18018.)Сервери на основі модуля
socketserver
, включно з тими, що визначені вhttp.server
,xmlrpc.server
іwsgiref.simple_server
, тепер перехоплюють лише винятки, отримані відException
. Тому, якщо обробник запитів викликає виняток, наприкладSystemExit
абоKeyboardInterrupt
,handle_error()
більше не викликається, і виняток зупинить однопотоковий сервер. (Надав Мартін Пантер у bpo-23430.)spwd.getspnam()
тепер викликаєPermissionError
замістьKeyError
, якщо користувач не має привілеїв.Метод
socket.socket.close()
тепер викликає виняток, якщо базовий системний виклик повідомляє про помилку (наприклад,EBADF
). (Надав Мартін Пантер у bpo-26685.)Аргумент decode_data для конструкторів
smtpd.SMTPChannel
іsmtpd.SMTPServer
тепер за умовчанням має значенняFalse
. Це означає, що аргумент, переданийprocess_message()
, тепер є об’єктом bytes за замовчуванням, аprocess_message()
буде передано ключові аргументи. Код, який уже оновлено відповідно до попередження про припинення підтримки, створеного версією 3.5, не вплине.Усі додаткові аргументи функцій
dump()
,dumps()
,load()
іloads()
іКонструктори класів ~json.JSONEncoder
іJSONDecoder
у модуліjson
тепер є лише ключовими словами. (Надав Сергій Сторчака в bpo-18726.)Підкласи
type
, які не перевизначаютьtype.__new__
, більше не можуть використовувати форму з одним аргументом для отримання типу об’єкта.Як частина PEP 487, обробка ключових аргументів, переданих у
type
(окрім підказки метакласу,metaclass
), тепер узгоджено делегованаobject.__init_subclass__()
. Це означає, щоtype.__new__()
іtype.__init__()
тепер приймають довільні ключові аргументи, алеobject.__init_subclass__()
(який викликається зtype.__new__()
) відхилить їх за замовчуванням. Користувальницькі метакласи, які приймають додаткові ключові аргументи, повинні будуть відповідним чином налаштувати свої викликиtype.__new__()
(прямі чи черезsuper
).У
distutils.command.sdist.sdist
атрибутdefault_format
видалено та більше не виконується. Натомість формат tar-файлу gzip є типовим для всіх платформ, і вибір для конкретної платформи не робиться. У середовищах, де дистрибутиви побудовані на Windows і потрібні дистрибутиви zip, налаштуйте проект за допомогою файлуsetup.cfg
, який містить наступне:[sdist] formats=zip
Ця поведінка також була перенесена до попередніх версій Python за допомогою Setuptools 26.0.0.
У модулі
urllib.request
і методіhttp.client.HTTPConnection.request()
, якщо поле заголовка Content-Length не вказано, а тіло запиту є об’єктом файлу, він тепер надсилається із фрагментованим кодуванням HTTP 1.1. Якщо файловий об’єкт потрібно надіслати на сервер HTTP 1.0, значення Content-Length тепер має вказати абонент. (Надано Деміаном Брехтом і Рольфом Кралем із налаштуваннями Мартіна Пантера в bpo-12319.)DictReader
тепер повертає рядки типуOrderedDict
. (Надав Стів Холден у bpo-27842.)crypt.METHOD_CRYPT
більше не додаватиметься доcrypt.methods
, якщо він не підтримується платформою. (Надав Віктор Стіннер у bpo-25287.)Аргументи verbose і rename для
namedtuple()
тепер є лише ключовими словами. (Надав Реймонд Геттінгер у bpo-25628.)У Linux
ctypes.util.find_library()
тепер шукає спільні бібліотеки вLD_LIBRARY_PATH
. (Надав Віней Саджип у bpo-9998.)Клас
imaplib.IMAP4
тепер обробляє прапори, що містять символ']''
у повідомленнях, надісланих із сервера, для покращення сумісності в реальному світі. (Надано Літою Чо в bpo-21815.)Функція
mmap.write()
тепер повертає кількість записаних байтів, як і інші методи запису. (Надав Якуб Стасяк у bpo-26335.)Функції
pkgutil.iter_modules()
іpkgutil.walk_packages()
тепер повертають іменовані кортежіModuleInfo
. (Надав Рамчандра Апте в bpo-17211.)re.sub()
тепер викликає помилку для недійсних посилань на числові групи в шаблонах заміни, навіть якщо шаблон не знайдено в рядку. Повідомлення про помилку для недійсних посилань на групи тепер містить індекс групи та позицію посилання. (Надано SilentGhost, Сергій Сторчака в bpo-25953.)zipfile.ZipFile
тепер викличеNotImplementedError
для нерозпізнаних значень стиснення. Раніше було викликано звичайну помилкуRuntimeError
. Крім того, виклик методівZipFile
для закритого ZipFile або виклик методуwrite()
для ZipFile, створеного в режимі'r'
, викличеValueError
. Раніше в цих сценаріях виникала помилкаRuntimeError
.коли власні метакласи поєднуються з нульовим аргументом
super()
або прямими посиланнями методів на неявну змінну закриття__class__
, неявний запис простору імен__classcell__
тепер має передаватися доtype. __new__
для ініціалізації. Якщо цього не зробити, з’явитьсяDeprecationWarning
у Python 3.6 іRuntimeError
у Python 3.8.З появою
ModuleNotFoundError
споживачі системи імпорту можуть почати очікувати, що заміни системи імпорту викликатимуть цей більш специфічний виняток, коли це доречно, а не менш специфічнуImportError
. Щоб забезпечити майбутню сумісність із такими споживачами, розробникам альтернативних систем імпорту, які повністю замінюють__import__()
, потрібно буде оновити свої реалізації, щоб підняти новий підклас, коли модуль взагалі неможливо знайти. Розробникам сумісних плагінів до системи імпорту за замовчуванням не потрібно вносити жодних змін, оскільки система імпорту за замовчуванням підніме новий підклас, коли це необхідно.
Зміни в C API¶
Сімейство розподілювачів
PyMem_Malloc()
тепер використовує розподілювач pymalloc замість системногоmalloc()
. Програми, які викликаютьPyMem_Malloc()
без утримання GIL, тепер можуть аварійно завершувати роботу. Встановіть для змінної середовищаPYTHONMALLOC
значенняdebug
, щоб перевірити використання розподільників пам’яті у вашій програмі. Див. bpo-26249.Py_Exit()
(і основний інтерпретатор) тепер замінюють статус виходу на 120, якщо очищення буферизованих даних не вдається. Див. bpo-5319.
Зміни байт-коду CPython¶
У Python 3.6 було внесено кілька значних змін у bytecode.
Інтерпретатор Python тепер використовує 16-бітний словесний код замість байт-коду. (Надано Демуром Румедом із коментарями та рецензіями Сергія Сторчака та Віктора Стіннера в bpo-26647 та bpo-28050.)
Нові коди операцій
FORMAT_VALUE
іBUILD_STRING
як частина реалізації літералу форматованого рядка. (Надано Еріком Смітом у bpo-25483 та Сергієм Сторчакою у bpo-27078.)Новий код операції
BUILD_CONST_KEY_MAP
для оптимізації створення словників із постійними ключами. (Надав Сергій Сторчака в bpo-27140.)Коди операцій виклику функцій були значно перероблені для кращої продуктивності та простішої реалізації. Коди операцій
MAKE_FUNCTION
,CALL_FUNCTION
,CALL_FUNCTION_KW
іBUILD_MAP_UNPACK_WITH_CALL
змінено, новіCALL_FUNCTION_EX
іBUILD_TUPLE_UNPACK_WITH_CALL
додано, а коди операційCALL_FUNCTION_VAR
,CALL_FUNCTION_VAR_KW
іMAKE_CLOSURE
видалено. (Надано Демуром Румедом у bpo-27095 та Сергієм Сторчакою у bpo-27213, bpo-28257.)Нові коди операцій
SETUP_ANNOTATIONS
іSTORE_ANNOTATION
додано для підтримки нового синтаксису variable annotation. (Надав Іван Левківський у bpo-27985.)
Помітні зміни в Python 3.6.2¶
Нова ціль збірки make regen-all
¶
Щоб спростити крос-компіляцію та гарантувати, що CPython можна надійно скомпілювати без наявності наявної версії Python, система збирання на основі autotools більше не намагається неявно перекомпілювати згенеровані файли на основі часу модифікації файлу.
Натомість додано нову команду make regen-all
, щоб примусово повторно генерувати ці файли за бажанням (наприклад, після того, як початкова версія Python вже була створена на основі попередньо згенерованих версій).
Також визначено більш вибіркові цілі регенерації - подробиці див. Makefile.pre.in.
(Надав Віктор Стіннер у bpo-23404.)
Нове в версії 3.6.2.
Видалення цілі збірки make touch
¶
Ціль збірки make touch
, яка раніше використовувалася для запиту неявної регенерації згенерованих файлів шляхом оновлення часу їх модифікації, видалено.
Його було замінено новою метою make regen-all
.
(Надав Віктор Стіннер у bpo-23404.)
Змінено в версії 3.6.2.
Помітні зміни в Python 3.6.4¶
Синглтон PyExc_RecursionErrorInst
, який був частиною загальнодоступного API, було видалено, оскільки його члени, які ніколи не очищалися, можуть спричинити помилку сегмента під час фіналізації інтерпретатора. (Надав Ксав’є де Гає в bpo-22898 і bpo-30697.)
Помітні зміни в Python 3.6.5¶
У деяких випадках функція locale.localeconv()
тепер тимчасово встановлює локаль LC_CTYPE
на LC_NUMERIC
. (Надав Віктор Стіннер у bpo-31900.)
Помітні зміни в Python 3.6.7¶
У версії 3.6.7 модуль tokenize
тепер неявно видає маркер NEWLINE
, коли надходить із введенням, яке не має кінцевого нового рядка. Ця поведінка тепер відповідає внутрішньому виконанню токенізера C. (Надав Аммар Аскар у bpo-33899.)
Помітні зміни в Python 3.6.10¶
Через серйозні проблеми безпеки параметр reuse_address asyncio.loop.create_datagram_endpoint()
більше не підтримується. Це через поведінку опції сокета SO_REUSEADDR
в UDP. Для отримання додаткової інформації див. документацію для loop.create_datagram_endpoint()
. (Надано Кайлом Стенлі, Антуаном Пітру та Юрієм Селівановим у bpo-37228.)
Помітні зміни в Python 3.6.13¶
Попередні версії Python дозволяли використовувати як ;
, так і &
як роздільники параметрів запиту в urllib.parse.parse_qs()
і urllib.parse.parse_qsl()
. З міркувань безпеки та для відповідності новим рекомендаціям W3C це було змінено, щоб дозволити лише один роздільний ключ із &
за замовчуванням. Ця зміна також впливає на cgi.parse()
і cgi.parse_multipart()
, оскільки вони використовують уражені функції внутрішньо. Щоб дізнатися більше, перегляньте відповідну документацію. (Надано Адамом Ґолдшмідтом, Сентилом Кумараном і Кеном Джином у bpo-42967.)