Що нового в 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
._pthfile 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.zipfile 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
Між цифрами та після будь-якого основного специфікатора допускається одинарне підкреслення. Забороняється використовувати початкове, кінцеве або кілька символів підкреслення підряд.
The string formatting language also now has support
for the '_' option to signal the use of an underscore for a thousands
separator for floating point presentation types and for integer
presentation type 'd'. For integer presentation types 'b',
'o', 'x', and 'X', underscores will be inserted every 4
digits:
>>> '{:_}'.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), а не байтів. Однак є деякі ситуації, коли використання байтів є достатнім і правильним.
Prior to Python 3.6, data loss could result when using bytes paths on Windows.
With this change, using bytes to represent paths is now supported on Windows,
provided those bytes are encoded with the encoding returned by
sys.getfilesystemencoding(), which now defaults to 'utf-8'.
Applications that do not use str to represent paths should use
os.fsencode() and os.fsdecode() to ensure their bytes are
correctly encoded. To revert to the previous behaviour, set
PYTHONLEGACYWINDOWSFSENCODING or call
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: Збереження порядку визначення атрибутів класу¶
Attributes in a class definition body have a natural ordering: the same
order in which the names appear in the source. This order is now
preserved in the new class’s __dict__ attribute.
Крім того, ефективний простір імен виконання класу за замовчуванням (повернений з 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().Виявлення записів перед початком буфера (переповнення буфера)
Виявлення записів після закінчення буфера (переповнення буфера)
Check that the GIL is held when allocator functions of
PYMEM_DOMAIN_OBJ(ex:PyObject_Malloc()) andPYMEM_DOMAIN_MEM(ex:PyMem_Malloc()) domains are called.
Перевірка збереження 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 — забезпечити очевидний спосіб надійного генерування криптографічно надійних псевдовипадкових значень, придатних для керування секретами, такими як автентифікація облікового запису, токени тощо.
Попередження
Note that the pseudo-random generators in the random module
should NOT be used for security purposes. Use secrets
on Python 3.6+ and os.urandom() on Python 3.5 and earlier.
Дивись також
- 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.)
The namedtuple() function now accepts an optional
keyword argument module, which, when specified, is used for
the __module__ attribute of the returned named tuple class.
(Contributed by Raymond Hettinger in 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¶
The default_format attribute has been removed from
distutils.command.sdist.sdist and the formats
attribute defaults to ['gztar']. Although not anticipated,
any code relying on the presence of default_format may
need to be adapted. See bpo-27819 for more details.
електронною поштою¶
Новий 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() now outputs the implicit memo index for the
MEMOIZE opcode.
(Contributed by Serhiy Storchaka in 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.)
гніздо¶
The ioctl() function now supports the
SIO_LOOPBACK_FAST_PATH control code.
(Contributed by Daniel Stokes in bpo-26536.)
Тепер підтримуються константи getsockopt() SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC і SO_PASSSEC. (Надав Крістіан Хеймс у bpo-26907.)
setsockopt() тепер підтримує форму setsockopt(level, optname, None, optlen: int). (Надав Крістіан Хеймс у bpo-27744.)
The socket module now supports the address family
AF_ALG to interface with Linux Kernel crypto API. ALG_*,
SOL_ALG and sendmsg_afalg() were added.
(Contributed by Christian Heimes in bpo-27744 with support from
Victor Stinner.)
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 is now a context manager (contributed by
Stéphane Wirtel in 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).Allocator functions of the
PyMem_Malloc()domain (PYMEM_DOMAIN_MEM) now use the pymalloc memory allocator instead ofmalloc()function of the C library. The pymalloc allocator is optimized for objects smaller or equal to 512 bytes with a short lifetime, and usemalloc()for larger memory blocks. (Contributed by Victor Stinner in 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.)The GIL must now be held when allocator functions of
PYMEM_DOMAIN_OBJ(ex:PyObject_Malloc()) andPYMEM_DOMAIN_MEM(ex:PyMem_Malloc()) domains are called.Новий
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¶
асинчат¶
The asynchat has been deprecated in favor of asyncio.
(Contributed by Mariatta in bpo-25002.)
несиндром¶
The asyncore has been deprecated in favor of asyncio.
(Contributed by Mariatta in bpo-25002.)
dbm¶
На відміну від інших реалізацій dbm, модуль dbm.dumb створює бази даних у режимі 'rw' і дозволяє змінювати базу даних, відкриту в режимі 'r'. Ця поведінка тепер застаріла та буде видалена у версії 3.8. (Надав Сергій Сторчака в bpo-21708.)
distutils¶
The undocumented extra_path argument to the
Distribution constructor is now considered deprecated
and will raise a warning if set. Support for this parameter will be
removed in a future Python release. See bpo-27919 for details.
група¶
Підтримка нецілочисельних аргументів у 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().
The importlib.machinery.WindowsRegistryFinder class is now
deprecated. As of 3.6.0, it is still added to sys.meta_path by
default (on Windows), but this may change in future releases.
ос¶
Недокументована підтримка загальних байт-подібних об’єктів як шляхів у функціях 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¶
The tkinter.tix module is now deprecated. tkinter users
should use tkinter.ttk instead.
venv¶
Сценарій pyvenv застарів на користь python3 -m venv. Це запобігає плутанині щодо того, до якого інтерпретатора Python підключено pyvenv і, таким чином, який інтерпретатор Python використовуватиме віртуальне середовище. (Надано Бреттом Кенноном у bpo-25154.)
Застарілі функції та типи C API¶
Undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode()
and PyUnicode_AsDecodedUnicode() are deprecated now.
Use the generic codec based API instead.
Застарілі параметри збірки¶
Прапор конфігурації --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, andSTROPTSmodules 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.The format of the
co_lnotabattribute of code objects changed to support a negative line number delta. By default, Python does not emit bytecode with a negative line number delta. Functions usingframe.f_lineno,PyFrame_GetLineNumber()orPyCode_Addr2Line()are not affected. Functions directly decodingco_lnotabshould be updated to use a signed 8-bit integer type for the line number delta, but this is only required to support applications using a negative line number delta. SeeObjects/lnotab_notes.txtfor theco_lnotabformat and how to decode it, and see the PEP 511 for the rationale.Функції в модулі
compileallтепер повертають логічні значення замість1або0, щоб показати успіх або невдачу, відповідно. Завдяки тому, що булеві значення є підкласом цілих чисел, це має бути проблемою, лише якщо ви проводили перевірку ідентичності для1або0. Див. bpo-25768.Читання атрибута
portрезультатівurllib.parse.urlsplit()іurlparse()тепер викликаєValueErrorдля виходу -of-range значення замість поверненняNone. Див. bpo-20059.The
impmodule now raises aDeprecationWarninginstead ofPendingDeprecationWarning.The following modules have had missing APIs added to their
__all__attributes to match the documented APIs:calendar,cgi,csv,ElementTree,enum,fileinput,ftplib,logging,mailbox,mimetypes,optparse,plistlib,smtpd,subprocess,tarfile,threadingandwave. This means they will export new symbols whenimport *is used. (Contributed by Joel Taddei and Jacek Kołodziej in 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()now raises aPermissionErrorinstead ofKeyErrorif the user doesn’t have privileges.Метод
socket.socket.close()тепер викликає виняток, якщо базовий системний виклик повідомляє про помилку (наприклад,EBADF). (Надав Мартін Пантер у bpo-26685.)The decode_data argument for the
smtpd.SMTPChannelandsmtpd.SMTPServerconstructors is nowFalseby default. This means that the argument passed toprocess_message()is now a bytes object by default, andprocess_message()will be passed keyword arguments. Code that has already been updated in accordance with the deprecation warning generated by 3.5 will not be affected.Усі додаткові аргументи функцій
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).In
distutils.command.sdist.sdist, thedefault_formatattribute has been removed and is no longer honored. Instead, the gzipped tarfile format is the default on all platforms and no platform-specific selection is made. In environments where distributions are built on Windows and zip distributions are required, configure the project with asetup.cfgfile containing the following:[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.)The
crypt.METHOD_CRYPTwill no longer be added tocrypt.methodsif unsupported by the platform. (Contributed by Victor Stinner in 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.With the introduction of
ModuleNotFoundError, import system consumers may start expecting import system replacements to raise that more specific exception when appropriate, rather than the less-specificImportError. To provide future compatibility with such consumers, implementors of alternative import systems that completely replace__import__()will need to update their implementations to raise the new subclass when a module can’t be found at all. Implementors of compliant plugins to the default import system shouldn’t need to make any changes, as the default import system will raise the new subclass when appropriate.
Зміни в 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.)
The new
FORMAT_VALUEandBUILD_STRINGopcodes as part of the formatted string literal implementation. (Contributed by Eric Smith in bpo-25483 and Serhiy Storchaka in bpo-27078.)Новий код операції
BUILD_CONST_KEY_MAPдля оптимізації створення словників із постійними ключами. (Надав Сергій Сторчака в bpo-27140.)The function call opcodes have been heavily reworked for better performance and simpler implementation. The
MAKE_FUNCTION,CALL_FUNCTION,CALL_FUNCTION_KWandBUILD_MAP_UNPACK_WITH_CALLopcodes have been modified, the newCALL_FUNCTION_EXandBUILD_TUPLE_UNPACK_WITH_CALLhave been added, andCALL_FUNCTION_VAR,CALL_FUNCTION_VAR_KWandMAKE_CLOSUREopcodes have been removed. (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)The new
SETUP_ANNOTATIONSandSTORE_ANNOTATIONopcodes have been added to support the new variable annotation syntax. (Contributed by Ivan Levkivskyi in 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¶
Earlier Python versions allowed using both ; and & as
query parameter separators in urllib.parse.parse_qs() and
urllib.parse.parse_qsl(). Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with & as the default. This change also affects
cgi.parse() and cgi.parse_multipart() as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)