Основна інформація
Нові можливості синтаксису:
- Нове вираз yield from для реалізації генераторів.
- Синтаксис u "unicode" знову дозволений для об'єктів типу str.
Нові вбудовані модулі:
Нові вбудовані поліпшення:
- Перероблена ієрархія I / O винятків
- Переписана машина імпорту на основі importlib
- Більш компактні рядки unicode
- Більш компактні словники
- Рандомизация хеш-суми включена за замовчуванням
PEP 405: Віртуальне середовище
Віртуальні середовища допоможуть створити окремі установки Python, розділяючи загально базові установки для зручності обслуговування. Віртуальні середовища мають свій власний набір приватних пакетів (тобто локально встановлені бібліотеки), і необов'язково відокремлені від загальносистемних пакетів.
Цей PEP додає модуль venv для програмного доступу, і скрипт pyvenv для доступу до командного рядка і адміністрування. Інтерпретатора Python стає відомо про pvenv.cfg файлі, існування якого сигналізує базу дерев каталогів віртуального середовища.
PEP 420: Простір назв пакунків
Вбудована підтримка пакетів, які не вимагають файли __init__.py
PEP 393: гнучке уявлення рядків
Рядки змінені для підтримки декількох внутрішніх уявлень, в залежності від символу з найбільшим порядковим Unicode (1, 2 або 4 байти). Це дозволяє ефективно представляти рядка в більшості випадків, але дає доступ до повного UCS-4 на всіх системах. Для сумісності з існуючим API, кілька подань можуть існувати паралельно, з плином часу, ця сумісність повинна бути припинена.
На стороні C API, PEP 393 є повністю назад сумісним. API повинні залишатися доступними принаймні п'ять років. Програми, що використовують API не будуть у повній мірі користуватися скороченням пам'яті, або - ще гірше - може використовувати трохи більше пам'яті, так як Python, можливо, доведеться підтримувати дві версії кожного рядка (в застарілому форматі і в новому ефективного зберіганні).
функціональність
Зміни, внесені PEP 393:
- Python тепер завжди підтримує повний набір кодів Unicode, в тому числі не-BMP символи (тобто від U + 0000 до U + 10FFFF). Різниця між вузькою та широкою рядком більше не існує, і Python тепер поводиться як при широкій збірці, навіть під Windows.
- Зі смертю вузької версії, проблеми, характерні для вузької версії також були виправлені, наприклад:
- len () тепер завжди повертає 1 для не-BMP символів, тому len ( '\ U0010FFFF') == 1;
- сурогатні пари не рекомбінують в рядкові літерали, так '\ uDBFF \ uDFFF'! = '\ U0010FFFF';
- індекс або зріз НЕ-BMP символів повертає очікуване значення, тому '\ U0010FFFF' [0] тепер повертає '\ U0010FFFF'. а не '\ uDBFF';
- Всі інші функції в стандартній бібліотеці тепер коректно обробляти не-BMP коди.
- Значення sys.maxunicode тепер завжди 1114111 (0x10FFFF в шістнадцятковій). PyUnicode_GetMax () як і раніше повертає або 0xFFFF або 0x10FFFF для забезпечення сумісності, і його не слід використовувати з новим API Unicode.
- ./ Configure прапор --with-wide-unicode був видалений.
Продуктивність і використання ресурсів
Зберігання Unicode рядків тепер залежить від максимального коду в кодовому рядку:
- ASCII і Latin1 рядки (U + 0000- U +00 FF) використовують 1 байт;
- BMP рядки (U + 0000- U + FFFF) використовують 2 байта;
- Ні-BMP рядки (U + 10000- U +10 FFFF) використовують 4 байта.
Результатом є те, що для більшості додатків, використання пам'яті має значно зменшитися - особливо в порівнянні з колишнім Unicode, так як у багатьох випадках, рядки будуть чистим ASCII навіть в міжнародному контексті (бо багато рядків зберігають дані не-людською мовою, такі як XML-фрагменти, HTTP заголовки, JSON-кодовані даних і т.д.). Ми також сподіваємося, що вона, з тих же причин, підвищить ефективність кеш-пам'яті процесора для нетривіальних додатків. Використання пам'яті Python 3.3 в два-три рази менше, ніж Python 3.2, і трохи менше, ніж Python 2.7, на тесті Django.
PEP 3151: Переробка ОС і IO ієрархії виключень
Ієрархія винятків спрощена і більш детальна.
Вам не доведеться більше турбуватися про вибір відповідного типу виключення між OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error або select.error. Всі ці типи винятків тепер тільки один: OSError. Інші імена зберігаються в якості псевдонімів для забезпечення сумісності.
Крім того, тепер легше зловити певну умову помилки. Замість перевірки атрибут ERRNO для конкретної постійної з ERRNO модуля, ви можете обробляти конкретний підклас OSError. Доступні підкласи:
- BlockingIOError
- ChildProcessError
- ConnectionError
- FileExistsError
- FileNotFoundError
- InterruptedError
- IsADirectoryError
- NotADirectoryError
- PermissionError
- ProcessLookupError
- TimeoutError
І ConnectionError також має підкласи:
- BrokenPipeError
- ConnectionAbortedError
- ConnectionRefusedError
- ConnectionResetError
Наприклад, наступний код, написаний для Python 3.2:
Тепер може бути написаний без імпорту ERRNO і без ручної перевірки атрибутів виключення:
PEP 380: Синтаксис для делегування Subgenerator
PEP 380 додає вираз yield from. що дозволяє генератору делегувати частину своїх операцій на інший генератор. Це дозволяє частини коду, що містить 'yield', щоб бути винесена і поміщена в інший генератор. Крім того, subgenerator дозволили повернутися зі значенням, а значення стає доступним для делегування генератора.
Хоча призначений в першу чергу для використання в делегуванні subgenerator, yield from фактично дозволяє делегувати довільні subiterators.
Для простих ітераторів yield from iterable це просто скорочена форма для for item in iterable: yield item
Однак, на відміну від звичайного циклу, yield from дозволяє і повернути остаточне значення у зовнішній генератор:
Основний принцип зміни - дозволити розділити генератор на кілька субгенераторов так само легко, як одна велика функція може бути розбита на кілька підфункцій.
PEP 409: Придушення контексту виключення
PEP 409 вводить новий синтаксис, який дозволяє відключити контекст винятків. Це дозволяє отримувати чисте повідомлення про помилки в додатках, конвертувати в різні типи винятків:
Без вираження from None буде порушено стандартне виняток:
Однак оригінальне виключення все одно залишається доступним, для спрощення налагодження:
Повні імена для класів і функцій
Функції та об'єкти класу в python 3.3 мають новий атрибут __qualname__ (представляє «шлях» від модуля верхнього рівня). Для глобальних функцій і класів це те ж, що і __name__. Для інших функцій і класів, він забезпечує кращу інформацію про те, де вони були фактично визначені, і як вони можуть бути доступні з глобальної області.
Приклад з (непов'язаним) методом:
Приклад з вкладеними класами:
Приклад з вкладеною функцією:
Строкове представлення цих об'єктів також змінено, для відображення більшої інформації:
PEP 412: Ключ-Шерінг словники
Словники в python 3.3 тепер мають можливість спільно використовувати частину пам'яті, що зберігає ключі і їх хеши, що підвищує продуктивність більшості не вбудованих типів.