# Що нового в 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: асинхронне розуміння.

Нові бібліотечні модулі:

- `secrets`: PEP 506 – Додавання модуля секретів до стандартної бібліотеки.

Покращення реалізації CPython:

- Тип dict було перереалізовано для використання більш компактного представлення на основі пропозиції Raymond Hettinger і подібного до реалізації dict PyPy. Це призвело до того, що словники використовували на 20–25% менше пам’яті порівняно з Python 3.5.

- Налаштування створення класу було спрощено за допомогою нового протоколу.

- Порядок визначення атрибутів класу тепер збережено.

- Порядок елементів у `**kwargs` тепер відповідає порядку, у якому ключові аргументи були передані функції.

- DTrace і SystemTap додано підтримку зондування.

- Нову змінну середовища PYTHONMALLOC тепер можна використовувати для налагодження розподілу пам’яті інтерпретатора та помилок доступу.

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

- Модуль `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 написали Райан Гонсалес, Філіп Хаус, Іван Левківський, Ліза Роуч та Гвідо ван Россум. Реалізував Іван Левківський.

Tools that use or will use the new syntax: mypy, pytype, PyCharm, etc.

### 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()`) and `PYMEM_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__
      ...

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

### Підтримка зондування DTrace і SystemTap

Тепер Python можна створити `--with-dtrace`, що вмикає статичні маркери для таких подій в інтерпретаторі:

- виклик/повернення функції

- збір сміття розпочато/завершено

- виконаний рядок коду.

Це можна використовувати для інструментування роботи інтерпретаторів у виробництві без необхідності перекомпілювати певні налагоджувальні збірки або надавати спеціальний код профілю/налагодження програми.

Детальніше в Інструментування 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, bpo-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.)

Added `ssl.SSLContext.post_handshake_auth` to enable and `ssl.SSLSocket.verify_client_post_handshake()` to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in gh-78851.)

### статистика

Додано нову функцію `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 of `malloc()` function of the C library. The pymalloc allocator is optimized for objects smaller or equal to 512 bytes with a short lifetime, and use `malloc()` 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()`) and `PYMEM_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.)

### xml

- As mitigation against DTD and external entity retrieval, the `xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. (Contributed by Christian Heimes in gh-61441.)

### Застарілі функції та типи 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`, 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`.

- The format of the `co_lnotab` attribute 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 using `frame.f_lineno`, `PyFrame_GetLineNumber()` or `PyCode_Addr2Line()` are not affected. Functions directly decoding `co_lnotab` should 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. See `Objects/lnotab_notes.txt` for the `co_lnotab` format 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 `imp` module now raises a `DeprecationWarning` instead of `PendingDeprecationWarning`.

- 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`, `threading` and `wave`. This means they will export new symbols when `import *` 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 a `PermissionError` instead of `KeyError` if the user doesn’t have privileges.

- Метод `socket.socket.close()` тепер викликає виняток, якщо базовий системний виклик повідомляє про помилку (наприклад, `EBADF`). (Надав Мартін Пантер у bpo-26685.)

- The decode_data argument for the `smtpd.SMTPChannel` and `smtpd.SMTPServer` constructors is now `False` by default. This means that the argument passed to `process_message()` is now a bytes object by default, and `process_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`, the `default_format` attribute 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 a `setup.cfg` file 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_CRYPT` will no longer be added to `crypt.methods` if 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-specific `ImportError`. 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_VALUE` and `BUILD_STRING` opcodes 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_KW` and `BUILD_MAP_UNPACK_WITH_CALL` opcodes have been modified, the new `CALL_FUNCTION_EX` and `BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and `CALL_FUNCTION_VAR`, `CALL_FUNCTION_VAR_KW` and `MAKE_CLOSURE` opcodes have been removed. (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)

- The new `SETUP_ANNOTATIONS` and `STORE_ANNOTATION` opcodes 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

`xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. See also gh-61441.

У версії 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.)

## Notable changes in Python 3.6.14

A security fix alters the `ftplib.FTP` behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a `trust_server_pasv_ipv4_address` attribute on your FTP instance to `True`. (See gh-87451)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser `urllib.parse()` preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See gh-88048)