Що нового в 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:

Значні вдосконалення стандартної бібліотеки:

  • Модуль asyncio отримав нові функції, значні покращення зручності використання та продуктивності, а також чимало виправлень помилок. Починаючи з Python 3.6, модуль asyncio більше не є тимчасовим, а його API вважається стабільним.

  • Новий протокол шляхів файлової системи було реалізовано для підтримки шляхових об’єктів. Усі стандартні функції бібліотеки, що працюють із шляхами, оновлено для роботи з новим протоколом.

  • Модуль datetime отримав підтримку Визначення неоднозначності місцевого часу.

  • Модуль typing отримав низку покращень.

  • Модуль tracemalloc був суттєво перероблений і тепер використовується для забезпечення кращого результату для ResourceWarning, а також для забезпечення кращої діагностики помилок розподілу пам’яті. Перегляньте розділ PYTHONMALLOC для отримання додаткової інформації.

Покращення безпеки:

  • Новий модуль secrets додано для спрощення генерації криптографічно надійних псевдовипадкових чисел, придатних для керування секретами, такими як автентифікація облікового запису, токени тощо.

  • У Linux os.urandom() тепер блокується, доки системний пул ентропії не буде ініціалізовано для підвищення безпеки. Перегляньте PEP 524 для обґрунтування.

  • Модулі hashlib і ssl тепер підтримують OpenSSL 1.1.0.

  • Стандартні параметри та набір функцій модуля 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 infer PYTHONHOME. 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 526 – Синтаксис для анотацій змінних.

PEP написали Райан Гонсалес, Філіп Хаус, Іван Левківський, Ліза Роуч та Гвідо ван Россум. Реалізував Іван Левківський.

Інструменти, які використовують або використовуватимуть новий синтаксис: mypy, pytype, PyCharm тощо.

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__
  ...

(Надав Віктор Стіннер у bpo-26516 і bpo-26564.)

Підтримка зондування 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, and STROPTS modules have been removed. They had been available in the platform specific Lib/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.)