Что нового в Python 3.4¶
- Автор
R. Дэвид Мюррей <rdmurray@bitdance.com> (редактор)
В этой статье рассказывается о новых возможностях в Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 года. Полную информацию см. в changelog.
См.также
PEP 429 – График выхода Python 3.4
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
В Python 3.4 не было добавлено никаких новых возможностей синтаксиса.
Другие новые возможности:
Newly created file descriptors are non-inheritable (PEP 446).
опция командной строки для isolated mode (bpo-16499).
improvements in the handling of codecs, которые не являются текстовыми кодировками (множество проблем).
A ModuleSpec Type для системы импорта (PEP 451). (Влияет на авторов импортеров.)
Формат
marshal
стал more compact and efficient (bpo-16475).
Новые библиотечные модули:
asyncio
: New provisional API for asynchronous IO (PEP 3156).selectors
: High-level and efficient I/O multiplexing, построенный на примитивах модуляselect
(часть PEP 3156).statistics
: Базовый numerically stable statistics library (PEP 450).
Значительно улучшены библиотечные модули:
Новый
pickle
protocol 4 (PEP 3154).multiprocessing
теперь имеет an option to avoid using os.fork on Unix (bpo-8713).email
имеет новый подмодуль,contentmanager
, и новый подклассMessage
(EmailMessage
), который simplify MIME handling (bpo-18891).Модули
inspect
иpydoc
теперь способны к корректной интроспекции гораздо более широкого разнообразия вызываемых объектов, что улучшает вывод системы Pythonhelp()
.API модуля
ipaddress
объявлен стабильным
Улучшение безопасности:
Make newly created file descriptors non-inheritable (PEP 446), чтобы избежать утечки дескрипторов файлов в дочерние процессы.
Новая опция командной строки для isolated mode, (bpo-16499).
multiprocessing
теперь имеет an option to avoid using os.fork on Unix. spawn и forkserver более безопасны, так как они избегают обмена данными с дочерними процессами.multiprocessing
дочерние процессы в Windows больше не наследуют все наследуемые дескрипторы родителя, а только необходимые.Новая функция
hashlib.pbkdf2_hmac()
предоставляет PKCS#5 password-based key derivation function 2.Retrieving certificates from the Windows system cert store support для
ssl
.Класс
ssl.SSLContext
имеет lot of improvements.Все модули стандартной библиотеки, поддерживающие SSL, теперь поддерживают проверку сертификатов сервера, включая сопоставление имен хостов (
ssl.match_hostname()
) и CRL (списки отзыва сертификатов, см.ssl.SSLContext.load_verify_locations()
).
Улучшения в реализации CPython:
Используя PEP 442, в большинстве случаев module globals are no longer set to None during finalization (bpo-18214).
Пожалуйста, читайте далее полный список изменений для пользователей, включая множество других более мелких улучшений, оптимизаций CPython, устареваний и потенциальных проблем переноса.
Новые возможности¶
PEP 453: Явная загрузка PIP в установках Python¶
Загрузочный трубопровод по умолчанию¶
Новый модуль ensurepip
(определенный в PEP 453) предоставляет стандартный кроссплатформенный механизм для загрузки программы установки pip в установки Python и виртуальные среды. Версия pip
, включенная в Python 3.4.0, - pip
1.5.4, и будущие выпуски обновления 3.4.x будут обновлять поставляемую версию до последней версии pip
, доступной на момент создания кандидата в релизы.
По умолчанию на всех платформах будут установлены команды pipX
и pipX.Y
(где X.Y означает версию установки Python), а также пакет pip
Python и его зависимости. В Windows и в виртуальных средах на всех платформах также будет установлена неверсированная команда pip
. На других платформах общесистемная команда unversioned pip
обычно относится к отдельно установленной версии Python 2.
Утилита командной строки pyvenv
и модуль venv
используют модуль ensurepip
, чтобы сделать pip
легко доступным в виртуальных средах. При использовании утилиты командной строки pip
устанавливается по умолчанию, а при использовании модуля venv
API установка pip
должна быть запрошена явно.
Для CPython source builds on POSIX systems команды make install
и make altinstall
по умолчанию загружают pip
. Это поведение можно контролировать с помощью опций configure и отменять с помощью опций Makefile.
В Windows и Mac OS X программы установки CPython теперь по умолчанию устанавливают pip
вместе с самим CPython (пользователи могут отказаться от его установки в процессе установки). Пользователям Windows необходимо принять участие в автоматической модификации PATH
, чтобы pip
по умолчанию был доступен из командной строки, в противном случае его по-прежнему можно получить через программу запуска Python для Windows как py -m pip
.
Как discussed in the PEP, упаковщики платформ могут не устанавливать эти команды по умолчанию, если при вызове они предоставляют четкие и простые инструкции по их установке на данной платформе (обычно с помощью системного менеджера пакетов).
Примечание
Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3, по умолчанию при прямом вызове pip3
загружаются только версифицированные команды pip3.4
и ensurepip
- опция --default-pip
необходима, чтобы также запросить неверсифицированную команду pip
. pyvenv
и программа установки Windows обеспечивают доступность неквалифицированной команды pip
в этих средах, а pip
всегда можно вызвать с помощью ключа -m
, а не напрямую, чтобы избежать двусмысленности на системах с несколькими установками Python.
Изменения в документации¶
В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в краткие документы по началу работы и FAQ. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide и документацию отдельных проектов.
Однако, поскольку эта миграция в настоящее время еще не завершена, старые версии этих руководств остаются доступными как Установка модулей Python (версия Legacy) и Распространение модулей Python (версия Legacy).
См.также
- PEP 453 – Явная загрузка pip в установках Python
PEP написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Лёвисом и Недом Дейли.
PEP 446: Вновь созданные дескрипторы файлов не наследуются¶
PEP 446 делает вновь созданные файловые дескрипторы non-inheritable. В целом, это именно то поведение, которого хочет приложение: при запуске нового процесса открытые в данный момент файлы также открыты в новом процессе, что может привести к разного рода трудно обнаруживаемым ошибкам и, возможно, к проблемам безопасности.
Однако бывают случаи, когда наследование является желательным. Для поддержки таких случаев предлагаются следующие новые функции и методы:
См.также
- PEP 446 – Сделать вновь созданные дескрипторы файлов ненаследуемыми
PEP написан и реализован Виктором Стиннером.
Улучшения в работе с кодеками¶
С момента своего появления модуль codecs
всегда был предназначен для работы в качестве нейтральной по типу динамической системы кодирования и декодирования. Однако его тесная связь с текстовой моделью Python, особенно методы удобства с ограничением типа для встроенных типов str
, bytes
и bytearray
, исторически затушевывали этот факт.
В качестве ключевого шага в прояснении ситуации, функции удобства codecs.encode()
и codecs.decode()
теперь правильно документированы в Python 2.7, 3.3 и 3.4. Эти функции существовали в модуле codecs
(и были охвачены набором регрессионных тестов) с Python 2.4, но ранее их можно было обнаружить только с помощью интроспекции во время выполнения.
В отличие от методов удобства str
, bytes
и bytearray
, функции удобства codecs
поддерживают произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются кодировками текста Unicode (в Python 3) или преобразованиями basestring
<-> basestring
(в Python 2).
В Python 3.4 интерпретатор способен определять известные нетекстовые кодировки, представленные в стандартной библиотеке, и направлять пользователей к этим удобным функциям общего назначения, когда это необходимо:
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
В связи с этим изменением, когда это возможно без нарушения обратной совместимости, исключения, возникающие во время операций кодирования и декодирования, оборачиваются в цепочку исключений одного типа, в которой упоминается имя кодека, ответственного за возникновение ошибки:
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
Наконец, как показывают приведенные выше примеры, эти улучшения позволили восстановить удобные псевдонимы для неюникодных кодеков, которые сами были восстановлены в Python 3.2. Это означает, что кодирование двоичных данных в шестнадцатеричное представление и обратно (например) теперь может быть записано как:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
Бинарные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в Двоичные преобразования и Преобразования текста.
(Внесено Ником Когланом в bpo-7475, bpo-17827, bpo-17828 и bpo-19619).
PEP 451: Тип ModuleSpec для системы импорта¶
PEP 451 обеспечивает инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (то есть спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько API, связанных с импортом. Это изменение также является ступенькой для several future import-related improvements.
Публичные изменения из PEP являются полностью обратно совместимыми. Более того, они должны быть прозрачны для всех, кроме авторов импортеров. Методы поиска и загрузки ключей были устаревшими, но они будут продолжать работать. Новые импортеры должны использовать новые методы, описанные в PEP. Существующие импортеры должны быть обновлены для реализации новых методов. Список методов, которые должны быть заменены, и их замены смотрите в разделе Утративший силу.
Другие языковые изменения¶
Некоторые более мелкие изменения, внесенные в основной язык Python, следующие:
База данных Unicode обновлена до версии UCD 6.3.
min()
иmax()
теперь принимают аргумент default только с ключевым словом, который можно использовать для указания возвращаемого значения, если итерабель, которую они оценивают, не имеет элементов. (Внесено Джулианом Берманом в bpo-18111).Объекты модуля теперь
weakref
’able.Атрибуты модуля
__file__
(и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением__main__.__file__
, когда сценарий был выполнен напрямую с использованием относительного пути. (Внесено Бреттом Кэнноном в bpo-18416).Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты при кодировании и декодировании, если не используется обработчик ошибок
surrogatepass
, за исключением декодера UTF-16 (который принимает допустимые пары суррогатов) и кодера UTF-16 (который выдает их при кодировании не-BMP символов). (Вклад Виктора Стиннера, Кан-Хао (Кенни) Лу и Сергея Сторчака в bpo-12892).Новый немецкий EBCDIC codec
cp273
. (Внесено Майклом Биренфельдом и Эндрю Кучлингом в bpo-1097797).Новый украинский codec
cp1125
. (Внесено Сергеем Сторчакой в bpo-19668).bytes
.join() иbytearray
.join() теперь принимают в качестве аргументов произвольные буферные объекты. (Внесено Антуаном Питру в bpo-15958).Конструктор
int
теперь принимает любой объект, имеющий метод__index__
для своего аргумента base. (Внесено Марком Дикинсоном в bpo-16772).Объекты фрейма теперь имеют метод
clear()
, который очищает все ссылки на локальные переменные фрейма. (Внесено Антуаном Питру в bpo-17934).memoryview
теперь зарегистрирован какSequence
и поддерживает встроенный модульreversed()
. (Вклад Ника Коглана и Клаудиу Попы в bpo-18690 и bpo-19078).Сигнатуры, сообщаемые
help()
, были изменены и улучшены в нескольких случаях в результате введения Клиники Аргументов и других изменений в модуляхinspect
иpydoc
.__length_hint__()
теперь является частью спецификации формального языка (см. PEP 424). (Внесено Армином Ронахером в bpo-16148).
Новые модули¶
asyncio¶
Новый модуль asyncio
(определенный в PEP 3156) предоставляет стандартную подключаемую модель цикла событий для Python, обеспечивая надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и облегчая взаимодействие других реализаций цикла событий со стандартной библиотекой и друг с другом.
Для Python 3.4 этот модуль считается provisional API.
См.также
- PEP 3156 – Поддержка асинхронного ввода-вывода Перезагрузка: модуль «asyncio»
PEP написан и реализуется под руководством Гвидо ван Россума.
гарантпип¶
Новый модуль ensurepip
является основной инфраструктурой для реализации PEP 453. В обычном ходе событий конечным пользователям не потребуется взаимодействовать с этим модулем, но он может быть использован для ручной загрузки pip
, если автоматическая загрузка в инсталляцию или виртуальную среду была отклонена.
ensurepip
включает в себя поставляемую копию pip
, актуальную на момент выпуска первого кандидата в релизы того выпуска CPython, с которым он поставляется (это относится как к выпускам сопровождения, так и к выпускам функций). ensurepip
не имеет доступа к Интернету. Если установка имеет доступ в Интернет, то после запуска ensurepip
можно использовать прилагаемый pip
для обновления pip
до более свежего выпуска, чем прилагаемый. (Обратите внимание, что такая обновленная версия pip
рассматривается как отдельно установленный пакет и не будет удалена при деинсталляции Python).
Модуль назван ensurepip, потому что если его вызвать, когда pip
уже установлен, он ничего не сделает. Он также имеет опцию --upgrade
, которая заставит его установить поставляемую копию pip
, если существующая установленная версия pip
старше поставляемой копии.
enum¶
Новый модуль enum
(определенный в PEP 435) предоставляет стандартную реализацию типов перечислений, позволяя другим модулям (таким как socket
) предоставлять более информативные сообщения об ошибках и лучшую поддержку отладки путем замены непрозрачных целочисленных констант обратно совместимыми значениями перечислений.
См.также
- PEP 435 – Добавление типа Enum в стандартную библиотеку Python
PEP написан Барри Варшавой, Эли Бендерски и Итаном Фурманом, реализован Итаном Фурманом.
pathlib¶
Новый модуль pathlib
предлагает классы, представляющие пути файловой системы с семантикой, подходящей для различных операционных систем. Классы путей делятся на чистые пути, которые обеспечивают чисто вычислительные операции без ввода/вывода, и конкретные пути, которые наследуют от чистых путей, но также обеспечивают операции ввода/вывода.
Для Python 3.4 этот модуль считается provisional API.
См.также
- PEP 428 – Модуль pathlib – объектно-ориентированные пути к файловой системе
PEP написан и реализован Антуаном Питру.
селекторы¶
Новый модуль selectors
(созданный в рамках реализации PEP 3156) обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на примитивах модуля select
.
статистика¶
Новый модуль statistics
(определенный в PEP 450) предлагает некоторые основные функции статистики непосредственно в стандартной библиотеке. Этот модуль поддерживает вычисление среднего, медианы, моды, дисперсии и стандартного отклонения ряда данных.
См.также
- PEP 450 – Добавление модуля статистики в стандартную библиотеку
PEP написан и реализован Стивеном Д’Апрано
tracemalloc¶
Новый модуль tracemalloc
(определенный в PEP 454) - это отладочный инструмент для отслеживания блоков памяти, выделяемых Python. Он предоставляет следующую информацию:
Отследить, где был выделен объект
Статистика по выделенным блокам памяти на имя файла и номер строки: общий размер, количество и средний размер выделенных блоков памяти
Вычислите разницу между двумя моментальными снимками для обнаружения утечек памяти
См.также
- PEP 454 – Добавьте новый модуль tracemalloc для отслеживания выделения памяти в Python
PEP написан и реализован Виктором Стиннером
Улучшенные модули¶
abc¶
Новая функция abc.get_cache_token()
может быть использована для определения времени аннулирования кэшей, на которые влияют изменения в графе объектов. (Внесено Лукашем Ланга в bpo-16832).
Новый класс ABC
имеет ABCMeta
в качестве мета-класса. Использование ABC
в качестве базового класса имеет по сути тот же эффект, что и указание metaclass=abc.ABCMeta
, но проще для ввода и легче для чтения. (Внесено Бруно Дюпюи в bpo-16049).
aifc¶
Метод getparams()
теперь возвращает именованный кортеж, а не обычный кортеж. (Внесено Клаудиу Попа в bpo-17818).
aifc.open()
теперь поддерживает протокол управления контекстом: при использовании в блоке with
метод close()
возвращаемого объекта будет вызван автоматически в конце блока. (Внесено Сергеем Сторчача в bpo-16486).
Методы writeframesraw()
и writeframes()
теперь принимают любой bytes-like object. (Внесено Сергеем Сторчакой в bpo-8311).
argparse¶
Класс FileType
теперь принимает аргументы encoding и errors, которые передаются в open()
. (Внесено Лукасом Майстре в bpo-11175).
аудиооп¶
audioop
теперь поддерживает 24-битные сэмплы. (Внесено Сергеем Сторчакой в bpo-12866).
Новая функция byteswap()
преобразует выборки big-endian в little-endian и наоборот. (Внесено Сергеем Сторчакой в bpo-19641).
Все функции audioop
теперь принимают любые bytes-like object. Строки не принимаются: раньше они не работали, теперь сразу выдают ошибку. (Внесено Сергеем Сторчакой в bpo-16685).
base64¶
Функции кодирования и декодирования в base64
теперь принимают любой bytes-like object в тех случаях, когда раньше требовался экземпляр bytes
или bytearray
. (Внесено Ником Когланом в bpo-17839).
Новые функции a85encode()
, a85decode()
, b85encode()
и b85decode()
обеспечивают возможность кодирования и декодирования двоичных данных из и в форматы Ascii85
и git/mercurial Base85
соответственно. Функции a85
имеют опции, которые можно использовать для обеспечения их совместимости с вариантами кодировки Ascii85
, включая вариант Adobe. (Вклад Мартина Моррисона, проект Mercurial, Сергея Сторчака и Антуана Питру в bpo-17618).
коллекции¶
Метод ChainMap.new_child()
теперь принимает аргумент m, указывающий дочернюю карту для добавления в цепочку. Это позволяет использовать для дочерней карты существующую карту и/или пользовательский тип карты. (Внесено Vinay Sajip в bpo-16613).
colorsys¶
Количество цифр в коэффициентах для преобразования RGB — YIQ было увеличено, чтобы они соответствовали версиям FCC NTSC. Изменение в результатах должно быть менее 1% и может лучше соответствовать результатам, найденным в других местах. (Внесено Брайаном Ландерсом и Сергеем Сторчакой в bpo-14323).
contextlib¶
Новый менеджер контекста contextlib.suppress
помогает прояснить намерение кода, который намеренно подавляет исключения из одного оператора. (При участии Раймонда Хеттингера в bpo-15806 и Зеро Пиреуса в bpo-19266).
Новый менеджер контекста contextlib.redirect_stdout()
облегчает работу утилитных скриптов с негибкими API, которые записывают вывод в sys.stdout
и не предоставляют никаких опций для его перенаправления. С помощью менеджера контекста вывод sys.stdout
можно перенаправить в любой другой поток или, в сочетании с io.StringIO
, в строку. Последнее может быть особенно полезно, например, для перехвата вывода функции, написанной для реализации интерфейса командной строки. Рекомендуется использовать только в сценариях утилит, поскольку это влияет на глобальное состояние sys.stdout
. (Внесено Раймондом Хеттингером в bpo-15805).
Документация contextlib
также была обновлена, чтобы включить discussion различия между одноразовыми, многоразовыми и реентерабельными менеджерами контекста.
dbm¶
Объекты dbm.open()
теперь поддерживают протокол управления контекстом. При использовании в операторе with
метод close
объекта базы данных будет вызван автоматически в конце блока. (Вклад Клаудиу Попа и Ника Коглана в bpo-19282).
dis¶
Функции show_code()
, dis()
, distb()
и disassemble()
теперь принимают аргумент file, содержащий только ключевое слово, которое определяет, куда они записывают свой вывод.
Модуль dis
теперь построен вокруг класса Instruction
, который обеспечивает объектно-ориентированный доступ к деталям каждой отдельной операции байткода.
Новый метод get_instructions()
предоставляет итератор, который выдает поток инструкций для данного фрагмента кода Python. Таким образом, теперь можно написать программу, которая проверяет и манипулирует объектом байткода способами, отличными от тех, которые предоставляет сам модуль dis
. Например:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
Различные инструменты отображения в модуле dis
были переписаны для использования этих новых компонентов.
Кроме того, новый удобный для приложений класс Bytecode
предоставляет объектно-ориентированный API для проверки байткода как в человекочитаемой форме, так и для итерации инструкций. Конструктор Bytecode
принимает те же аргументы, что и get_instruction()
(плюс необязательное current_offset), а полученный объект можно итерировать для создания объектов Instruction
. Но у него также есть метод dis
, эквивалентный вызову dis
на аргументе конструктора, но возвращаемый в виде многострочной строки:
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode
также имеет метод класса, from_traceback()
, который предоставляет возможность манипулировать обратным ходом (то есть print(Bytecode.from_traceback(tb).dis())
эквивалентен distb(tb)
).
(При участии Ника Коглана, Райана Келли и Томаса Клюйвера из bpo-11816 и Клаудиу Попа из bpo-17916).
Новая функция stack_effect()
вычисляет влияние на стек Python заданного опкода и аргумента, информация, которая недоступна в других случаях. (Внесена Ларри Хастингсом в bpo-19722).
doctest¶
Новый option flag, FAIL_FAST
, останавливает выполнение теста, как только обнаруживается первый сбой. (Вклад Р. Дэвида Мюррея и Дэниела Урбана в bpo-16522).
Интерфейс командной строки doctest
теперь использует argparse
и имеет две новые опции, -o
и -f
. -o
позволяет указывать doctest options в командной строке, а -f
является сокращением для -o FAIL_FAST
(параллельно с аналогичной опцией, поддерживаемой unittest
CLI). (Внесено Р. Дэвидом Мюрреем в bpo-11390).
doctest
теперь будет находить доктесты в строках модуля расширения __doc__
. (Внесено Закари Уэйром в bpo-3158).
электронная почта¶
as_string()
теперь принимает аргумент policy для переопределения политики по умолчанию сообщения при генерации его строкового представления. Это означает, что as_string
теперь можно использовать в большем количестве случаев, вместо того, чтобы создавать и использовать generator
для передачи параметров форматирования в его метод flatten
. (Внесено Р. Дэвидом Мюрреем в bpo-18600).
Добавлен новый метод as_bytes()
для создания байтового представления сообщения аналогично тому, как as_string
создает строковое представление. Он не принимает аргумент maxheaderlen, но принимает аргументы unixfrom и policy. Метод Message
__bytes__()
вызывает его, а это значит, что bytes(mymsg)
теперь будет выдавать интуитивно понятный результат: объект bytes, содержащий полностью отформатированное сообщение. (Внесено Р. Дэвидом Мюрреем в bpo-18600).
Сообщение Message.set_param()
теперь принимает аргумент с ключевым словом replace. Если он указан, связанный заголовок будет обновлен без изменения его местоположения в списке заголовков. Для обратной совместимости по умолчанию используется False
. (Внесено Р. Дэвидом Мюрреем в bpo-18891).
Добавлена пара новых подклассов Message
(EmailMessage
и MIMEPart
), а также новый подмодуль contentmanager
и новый policy
атрибут content_manager
. Вся документация в настоящее время находится в новом модуле, который добавляется как часть нового provisional API для электронной почты. Эти классы предоставляют ряд новых методов, которые значительно упрощают извлечение содержимого из почтовых сообщений и вставку содержимого в них. Подробности см. в документации contentmanager
и email: Примеры. Эти дополнения к API завершают основную часть работы, которая была запланирована в рамках проекта email6. В настоящее время предварительный API планируется сделать окончательным в Python 3.5 (возможно, с несколькими незначительными дополнениями в области обработки ошибок). (Внесено Р. Дэвидом Мюрреем в bpo-18891).
filecmp¶
Новая функция clear_cache()
предоставляет возможность очистить кэш сравнения filecmp
, который использует информацию os.stat()
для определения того, изменился ли файл с момента последнего сравнения. Это можно использовать, например, если файл мог быть изменен и повторно проверен за время меньшее, чем разрешение поля времени модификации файла конкретной файловой системы. (Внесено Марком Левиттом в bpo-18149).
Новый атрибут модуля DEFAULT_IGNORES
предоставляет список каталогов, которые используются в качестве значения по умолчанию для параметра ignore функции dircmp()
. (Внесено Эли Бендерски в bpo-15442).
functools¶
Новый дескриптор partialmethod()
привносит в дескрипторы применение частичных аргументов, так же как partial()
обеспечивает это для обычных вызываемых методов. Новый дескриптор также упрощает получение произвольных callables (включая экземпляры partial()
), которые будут вести себя как обычные методы экземпляра, если их включить в определение класса. (Вклад Алона Хорева и Ника Коглана в bpo-4331).
Новый декоратор singledispatch()
привносит поддержку однодиспетчерных общих функций в стандартную библиотеку Python. Если объектно-ориентированное программирование фокусируется на группировке нескольких операций над общим набором данных в класс, то родовая функция фокусируется на группировке нескольких реализаций операции, что позволяет ей работать с различными видами данных.
См.также
- PEP 443 – Однодиспетчерные общие функции
PEP написан и реализован Лукашем Ланга.
total_ordering()
теперь поддерживает возвращаемое значение NotImplemented
из базовой функции сравнения. (Вклад внесла Кэти Миллер в bpo-10042).
Чисто питоновская версия функции partial()
теперь находится в stdlib; в CPython она переопределена ускоренной версией на C, но доступна для использования другими реализациями. (Внесено Брайаном Торном в bpo-12428).
gc¶
Новая функция get_stats()
возвращает список из трех словарей на поколение, содержащих статистику коллекций с момента запуска интерпретатора. (Внесено Антуаном Питру в bpo-16351).
глобус¶
Новая функция escape()
предоставляет возможность экранировать специальные символы в имени файла, чтобы они не становились частью расширения globbing, а сопоставлялись буквально. (Внесено Сергеем Сторчакой в bpo-8402).
hashlib¶
Новая функция hashlib.pbkdf2_hmac()
обеспечивает работу PKCS#5 password-based key derivation function 2. (Вклад Кристиана Хаймса в bpo-18582).
Атрибут name
хэш-объектов hashlib
теперь является формально поддерживаемым интерфейсом. Он всегда существовал в CPython’s hashlib
(хотя он не возвращал имена в нижнем регистре для всех поддерживаемых хэшей), но он не был публичным интерфейсом, и поэтому некоторые другие реализации Python ранее не поддерживали его. (Внесено Джейсоном Р. Кумбсом в bpo-18532).
hmac¶
hmac
теперь принимает bytearray
, а также bytes
для аргумента key функции new()
, а параметр msg как функции new()
, так и метода update()
теперь принимает любой тип, поддерживаемый модулем hashlib
. (Внесено Йонасом Боргстрёмом в bpo-18240).
Аргументом digestmod функции hmac.new()
теперь может быть любое имя хэш-дайджеста, распознаваемое hashlib
. Кроме того, текущее поведение, при котором значение digestmod по умолчанию равно MD5
, устарело: в будущей версии Python значение по умолчанию будет отсутствовать. (Внесено Кристианом Хаймсом в bpo-17276).
С добавлением атрибутов block_size
и name
(и формальной документации атрибута digest_size
) модуль hmac
теперь полностью соответствует API PEP 247. (Вклад Кристиана Хаймса в bpo-18775).
html¶
Новая функция unescape()
преобразует ссылки на символы HTML5 в соответствующие символы Unicode. (Внесено Эцио Мелотти в bpo-2927).
HTMLParser
принимает новый аргумент ключевого слова convert_charrefs, который, при значении True
, автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно False
, но оно изменится на True
в будущей версии Python, поэтому вам предлагается задать его явно и обновить свой код для использования этой новой возможности. (Внесено Эцио Мелотти в bpo-13633).
Аргумент strict в HTMLParser
теперь устарел. (Внесено Эцио Мелотти в bpo-15114).
http¶
send_error()
теперь принимает необязательный дополнительный параметр explain, который может быть использован для предоставления расширенного описания ошибки, заменяя жестко закодированное значение по умолчанию, если таковое имеется. Это расширенное описание ошибки будет отформатировано с помощью атрибута error_message_format
и отправлено как тело ответа на ошибку. (Внесено Карлом Коу в bpo-12921).
В http.server
command line interface теперь есть опция -b/--bind
, которая заставляет сервер прослушивать определенный адрес. (Внесено Мальте Свартом в bpo-17764).
idlelib и IDLE¶
Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, он улучшается с каждым выпуском. Кумулятивный список изменений с версии 3.3.0, а также изменения, внесенные в будущие версии 3.4.x, смотрите в Lib/idlelib/NEWS.txt
. Этот файл также доступен из диалога IDLE .
importlib¶
ABC InspectLoader
определяет новый метод source_to_code()
, который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна compile(data, path, 'exec', dont_inherit=True)
. (Вклад Эрика Сноу и Бретта Кэннона в bpo-15627).
InspectLoader
также теперь имеет реализацию по умолчанию для метода get_code()
. Тем не менее, обычно желательно переопределить реализацию по умолчанию по соображениям производительности. (Внесено Бреттом Кэнноном в bpo-18072).
Функция reload()
была перемещена из imp
в importlib
в рамках депривации модуля imp
. (Внесено Беркером Пексагом в bpo-18193).
importlib.util
теперь имеет атрибут MAGIC_NUMBER
, предоставляющий доступ к номеру версии байткода. Это заменяет функцию get_magic()
в устаревшем модуле imp
. (Внесено Бреттом Кэнноном в bpo-18192).
Новые функции importlib.util
cache_from_source()
и source_from_cache()
заменяют одноименные функции в устаревшем модуле imp
. (Внесено Бреттом Кэнноном в bpo-18194).
Бутстрап importlib
NamespaceLoader
теперь соответствует InspectLoader
ABC, что означает, что runpy
и python -m
теперь можно использовать с пакетами пространства имен. (Внесено Бреттом Кэнноном в bpo-18058).
importlib.util
имеет новую функцию decode_source()
, которая декодирует исходный текст из байтов, используя универсальную обработку новой строки. Это полезно для реализации методов InspectLoader.get_source()
.
importlib.machinery.ExtensionFileLoader
теперь имеет метод get_filename()
. Это было непреднамеренно опущено в первоначальной реализации. (Внесено Эриком Сноу в bpo-19152).
проверять¶
Модуль inspect
теперь предлагает базовый command line interface для быстрого отображения исходного кода и другой информации для модулей, классов и функций. (Вклад Клаудиу Попа и Ника Коглана в bpo-18626).
unwrap()
позволяет легко распутать цепочки функций-оберток, созданные functools.wraps()
(и любым другим API, который устанавливает атрибут __wrapped__
для функции-обертки). (Вклад Дэниела Урбана, Аарона Илса и Ника Коглана в bpo-13266).
В рамках реализации нового модуля enum
модуль inspect
теперь имеет значительно лучшую поддержку пользовательских методов __dir__
и динамических атрибутов класса, предоставляемых через метаклассы. (Вклад Итана Фурмана в bpo-18929 и bpo-19030).
getfullargspec()
и getargspec()
теперь используют API signature()
. Это позволяет им поддерживать гораздо более широкий спектр вызываемых объектов, включая те, которые имеют атрибуты __signature__
, те, метаданные которых предоставляются клиникой аргументов, объекты functools.partial()
и многое другое. Обратите внимание, что, в отличие от signature()
, эти функции по-прежнему игнорируют атрибуты __wrapped__
и сообщают об уже связанном первом аргументе для связанных методов, поэтому все еще необходимо обновить ваш код для использования signature()
непосредственно, если эти возможности желательны. (Вклад Юрия Селиванова в bpo-17481).
signature()
теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с Cython. (Вклад внесли Стефан Бехнель и Юрий Селиванов в bpo-17159).
ipaddress¶
ipaddress
был добавлен в стандартную библиотеку в Python 3.3 как provisional API. С выходом Python 3.4 эта квалификация была снята: ipaddress
теперь считается стабильным API, на который распространяются обычные требования стандартной библиотеки для поддержания обратной совместимости.
Новое свойство is_global
- True
, если адрес является глобально маршрутизируемым. (Внесено Питером Муди в bpo-17400).
ведение журнала¶
В TimedRotatingFileHandler
появился новый параметр atTime, который можно использовать для указания времени суток, когда должен произойти перенос. (Внесено Рональдом Оусореном в bpo-9556).
SocketHandler
и DatagramHandler
теперь поддерживают доменные сокеты Unix (путем установки port в None
). (Внесено Vinay Sajip в коммит ce46195b56a9.)
fileConfig()
теперь принимает экземпляр подкласса configparser.RawConfigParser
для параметра fname. Это облегчает использование конфигурационного файла, когда конфигурация протоколирования является лишь частью общей конфигурации приложения, или когда приложение изменяет конфигурацию перед передачей ее в fileConfig()
. (Внесено Vinay Sajip из bpo-16110).
Данные конфигурации журнала, полученные из сокета через функцию logging.config.listen()
, теперь могут быть проверены перед обработкой путем предоставления функции проверки в качестве аргумента нового ключевого слова verify. (Внесено Vinay Sajip в bpo-15452).
маршал¶
Версия marshal
по умолчанию была увеличена до 3. Код, реализующий новую версию, восстанавливает поведение Python2 по записи только одной копии интернированных строк и сохранению интернирования при десериализации, и расширяет эту способность «одной копии» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер файлов .pyc
, так и объем памяти, занимаемой модулем при загрузке из файла .pyc
(или .pyo
). (Внесено Кристьяном Валуром Йонссоном в bpo-16475, дополнительное ускорение достигнуто Антуаном Питру в bpo-19219).
mmap¶
Объекты mmap теперь могут быть weakref
ed. (Внесено Валери Ламберт в bpo-4885.)
многопроцессорная обработка¶
На Unix добавлены два новых start methods, spawn
и forkserver
, для запуска процессов с помощью multiprocessing
. Они делают смешивание процессов с потоками более надежным, а метод spawn
соответствует семантике, которая всегда использовалась в многопроцессорной обработке в Windows. Новая функция get_all_start_methods()
сообщает обо всех методах запуска, доступных на платформе, get_start_method()
сообщает о текущем методе запуска, а set_start_method()
устанавливает метод запуска. (Внесено Ричардом Оудкерком в bpo-8713).
multiprocessing
также теперь имеет понятие context
, которое определяет, как создаются дочерние процессы. Новая функция get_context()
возвращает контекст, использующий указанный метод запуска. Она имеет тот же API, что и сам модуль multiprocessing
, поэтому вы можете использовать ее для создания Pool
s и других объектов, которые будут работать внутри этого контекста. Это позволяет фреймворку и приложению или различным частям одного и того же приложения использовать многопроцессорность, не мешая друг другу. (Внесено Ричардом Оудкерком в bpo-18999).
За исключением случаев использования старого метода запуска fork, дочерние процессы больше не наследуют ненужные дескрипторы файлов от своих родителей (часть bpo-8713).
multiprocessing
теперь полагается на runpy
(который реализует переключатель -m
) для инициализации __main__
соответствующим образом в дочерних процессах при использовании методов запуска spawn
или forkserver
. Это решает некоторые крайние случаи, когда сочетание многопроцессорности, переключателя командной строки -m
и явного относительного импорта могло привести к непонятным сбоям в дочерних процессах. (Внесено Ником Когланом из bpo-19946).
оператор¶
Новая функция length_hint()
обеспечивает реализацию спецификации того, как должен использоваться специальный метод __length_hint__()
, как часть PEP 424 формальной спецификации этой возможности языка. (Внесено Армином Ронахером в bpo-16148).
Теперь существует чисто питоновская версия модуля operator
, доступная для ознакомления и использования в альтернативных реализациях Python. (Внесено Закари Уэйром в bpo-16694).
os¶
Появились новые функции для получения и установки inheritable flag дескриптора файла (os.get_inheritable()
, os.set_inheritable()
) или дескриптора Windows (os.get_handle_inheritable()
, os.set_handle_inheritable()
).
Новая функция cpu_count()
сообщает количество CPU, доступных на платформе, на которой запущен Python (или None
, если количество не может быть определено). Функция multiprocessing.cpu_count()
теперь реализована в терминах этой функции). (Вклад Трента Нельсона, Йогеша Чаудхари, Виктора Стиннера и Шарля-Франсуа Натали в bpo-17914).
os.path.samestat()
теперь доступен на платформе Windows (а реализация os.path.samefile()
теперь общая для Unix и Windows). (Внесено Брайаном Кертином в bpo-11939).
os.path.ismount()
теперь распознает тома, смонтированные под корнем диска в Windows. (Вклад внес Тим Голден из bpo-9035).
os.open()
поддерживает два новых флага на платформах, которые их предоставляют, O_PATH
(неоткрытый дескриптор файла) и O_TMPFILE
(безымянный временный файл; начиная с версии 3.4.0 доступен только на Linux-системах с ядром версии 3.11 или новее, имеющих заголовки uapi). (Вклад Кристиана Хаймса в bpo-18673 и Бенджамина Петерсона, соответственно).
pdb¶
pdb
был улучшен для более удобной работы с генераторами, yield
и yield from
. Это особенно полезно при отладке программ, основанных на asyncio
. (Вклад внесли Андрей Светлов и Ксавье де Гайе в bpo-16596).
Команда print
была удалена из pdb
, восстанавливая доступ к функции Python print()
из командной строки pdb. В Python2 в pdb
не было команды print
; вместо нее при вводе print
выполнялся оператор print
. В Python3 команда print
была ошибочно сделана псевдонимом для команды pdb p
. Однако команда p
печатает repr
своего аргумента, а не str
, как это делала команда Python2 print
. Хуже того, команда Python3 pdb print
затеняет функцию Python3 print
, делая ее недоступной в подсказке pdb
. (Внесено Коннором Осборном в bpo-18764).
маринованный огурец¶
pickle
теперь поддерживает (но не использует по умолчанию) новый протокол pickle, протокол 4. Этот новый протокол решает ряд проблем, которые присутствовали в предыдущих протоколах, таких как сериализация вложенных классов, очень больших строк и контейнеров, а также классов, чей метод __new__()
принимает аргументы, содержащие только ключевые слова. Он также обеспечивает некоторые улучшения эффективности.
См.также
- PEP 3154 – Pickle protocol 4
PEP, написанный Антуаном Питру и реализованный Александром Вассалотти.
plistlib¶
plistlib
теперь имеет API, который похож на стандартный шаблон для протоколов сериализации stdlib, с новыми функциями load()
, dump()
, loads()
и dumps()
. (Старый API теперь устарел.) В дополнение к уже поддерживаемому формату XML plist (FMT_XML
), он также теперь поддерживает двоичный формат plist (FMT_BINARY
). (Вклад Рональда Оуссорена и других в bpo-14455).
poplib¶
Два новых метода были добавлены к poplib
: capa()
, который возвращает список возможностей, рекламируемых POP-сервером, и stls()
, который переключает сессию POP3 с открытым текстом на шифрованную сессию POP3, если POP-сервер поддерживает ее. (Внесено Лоренцо Катуччи в bpo-4473).
pprint¶
Класс pprint
модуля PrettyPrinter
и его функции pformat()
и pprint()
имеют новую опцию compact, которая управляет форматированием вывода. В настоящее время установка compact в True
означает, что последовательности будут выводиться с таким количеством элементов последовательности, которое помещается в ширину на каждой (с отступом) строке. (Внесено Сергеем Сторчакой в bpo-19132).
Длинные строки теперь обертываются с использованием обычного синтаксиса продолжения строки Python. (Внесено Антуаном Питру в bpo-17150).
pty¶
pty.spawn()
теперь возвращает значение статуса из os.waitpid()
на дочернем процессе, вместо None
. (Внесено Грегори П. Смитом.)
pydoc¶
Модуль pydoc
теперь основан непосредственно на API интроспекции inspect.signature()
, что позволяет ему предоставлять информацию о сигнатурах для более широкого спектра вызываемых объектов. Это изменение также означает, что атрибуты __wrapped__
теперь учитываются при отображении справочной информации. (Внесено Ларри Гастингсом в bpo-19674).
Модуль pydoc
больше не отображает параметр self
для уже связанных методов. Вместо этого он стремится всегда отображать точную текущую сигнатуру предоставленного вызываемого метода. (Внесено Ларри Хастингсом в bpo-20710).
В дополнение к изменениям, внесенным непосредственно в pydoc
, его обработка пользовательских методов __dir__
и различных видов поведения дескрипторов также была значительно улучшена благодаря изменениям, лежащим в основе модуля inspect
.
Поскольку встроенный модуль help()
основан на pydoc
, приведенные выше изменения также влияют на поведение help()
.
re¶
Новая функция fullmatch()
и метод regex.fullmatch()
привязывают шаблон к обоим концам строки для сопоставления. Это дает возможность четко определить цель соответствия, что позволяет избежать целого класса тонких ошибок, когда символы $
теряются при изменении кода или добавлении альтернатив к существующему регулярному выражению. (Внесено Мэтью Барнеттом в bpo-16203).
Повтор выражения regex objects теперь включает шаблон и флаги; повтор выражения match objects теперь включает начало, конец и часть строки, которая совпала. (Вклад Уго Лопеса Тавареса и Сергея Сторчака в bpo-13592 и bpo-17087).
ресурс¶
Новая функция prlimit()
, доступная на платформах Linux с ядром версии 2.6.36 или более поздней и glibc версии 2.13 или более поздней, предоставляет возможность запрашивать или устанавливать ограничения ресурсов для процессов, отличных от того, который осуществляет вызов. (Внесено Кристианом Хаймсом в bpo-16595).
В ядре Linux версии 2.6.36 или более поздней, есть также несколько новых констант, специфичных для Linux: RLIMIT_MSGQUEUE
, RLIMIT_NICE
, RLIMIT_RTPRIO
, RLIMIT_RTTIME
и RLIMIT_SIGPENDING
. (Внесено Кристианом Хаймсом в bpo-19324).
Во FreeBSD версии 9 и более поздних версиях есть несколько новых констант, специфичных для FreeBSD: RLIMIT_SBSIZE
, RLIMIT_SWAP
и RLIMIT_NPTS
. (Внесено Клаудиу Попа в bpo-19343).
выберите¶
Объекты epoll
теперь поддерживают протокол управления контекстом. При использовании в операторе with
метод close()
будет вызван автоматически в конце блока. (Внесено Сергеем Сторчакой в bpo-16488).
Объекты devpoll
теперь имеют методы fileno()
и close()
, а также новый атрибут closed
. (Внесено Виктором Стиннером в bpo-18794).
полка¶
Экземпляры Shelf
теперь могут использоваться в операторах with
, и будут автоматически закрываться в конце блока with
. (Внесено Филипом Грущиньским в bpo-13896).
shutil¶
copyfile()
теперь вызывает определенный подкласс Error
, SameFileError
, когда источник и место назначения - один и тот же файл, что позволяет приложению предпринять соответствующие действия при этой специфической ошибке. (Вклад внесли Ацуо Ишимото и Хинек Шлавак в bpo-1492704).
smtpd¶
Классы SMTPServer
и SMTPChannel
теперь принимают аргумент ключевого слова map, который, если указан, передается в asynchat.async_chat
в качестве аргумента map. Это позволяет приложению избежать влияния на глобальную карту сокетов. (Внесено Vinay Sajip в bpo-11959).
smtplib¶
SMTPException
теперь является подклассом OSError
, что позволяет перехватывать как ошибки уровня сокета, так и ошибки уровня протокола SMTP в одном операторе try/except кодом, которому важно только то, произошла ошибка или нет. (Внесено Недом Джексоном Лавли в bpo-2118).
розетка¶
Модуль socket теперь поддерживает протокол CAN_BCM
на платформах, которые его поддерживают. (Внесено Брайаном Торном в bpo-15359).
Объекты Socket имеют новые методы для получения или установки своих inheritable flag, get_inheritable()
и set_inheritable()
.
Константы socket.AF_*
и socket.SOCK_*
теперь являются значениями перечисления с использованием нового модуля enum
. Это позволяет выводить при отладке осмысленные имена, а не целочисленные «магические числа».
Константа AF_LINK
теперь доступна на BSD и OSX.
inet_pton()
и inet_ntop()
теперь поддерживаются в Windows. (Внесено Ацуо Ишимото в bpo-7171).
sqlite3¶
Новый булев параметр функции connect()
, uri, может использоваться для указания того, что параметр database является uri
(см. SQLite URI documentation). (Внесено poq в bpo-13773).
ssl¶
Добавлены PROTOCOL_TLSv1_1
и PROTOCOL_TLSv1_2
(поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна, только если Python связан с OpenSSL 1.0.1 или более поздней версией. (Вклад Микеле Орру и Антуана Питру в bpo-16692).
Новая функция create_default_context()
предоставляет стандартный способ получения SSLContext
, настройки которого призваны обеспечить разумный баланс между совместимостью и безопасностью. Эти параметры более строгие, чем параметры по умолчанию, предоставляемые конструктором SSLContext
, и могут быть скорректированы в будущем без предварительной амортизации, если изменятся требования к безопасности лучшей практики. Новая рекомендуемая лучшая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании create_default_context()
для получения объекта SSLContext
, его модификации при необходимости, а затем передачи в качестве аргумента context соответствующего API stdlib. (Внесено Кристианом Хаймсом в bpo-19689).
Метод SSLContext
load_verify_locations()
принимает новый необязательный аргумент cadata, который может быть использован для предоставления PEM или DER кодированных сертификатов непосредственно через строки или байты, соответственно. (Внесено Кристианом Хаймсом в bpo-18138).
Новая функция get_default_verify_paths()
возвращает именованный кортеж путей и переменных окружения, которые метод set_default_verify_paths()
использует для установки по умолчанию cafile
и capath
в OpenSSL. Это может помочь в отладке проблем с проверкой по умолчанию. (Внесено Кристианом Хаймсом в bpo-18143).
В SSLContext
появился новый метод cert_store_stats()
, который сообщает количество загруженных X.509
сертификатов, X.509 CA
сертификатов и списков отзыва сертификатов (crl
s), а также метод get_ca_certs()
, который возвращает список загруженных CA
сертификатов. (Вклад Кристиана Хаймса в bpo-18147).
Если OpenSSL 0.9.8 или более поздняя версия, SSLContext
имеет новый атрибут verify_flags
, который можно использовать для управления процессом проверки сертификата, установив его в некоторую комбинацию новых констант VERIFY_DEFAULT
, VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
или VERIFY_X509_STRICT
. По умолчанию OpenSSL не выполняет проверку CRL. (Внесено Кристиеном Хаймсом в bpo-8813).
Новый метод SSLContext
load_default_certs()
загружает набор сертификатов «центра сертификации» (ЦС) по умолчанию из мест по умолчанию, которые зависят от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (purpose=
SERVER_AUTH
), которые клиент может использовать для проверки сервера, так и сертификатов, которые сервер может использовать для проверки клиентских сертификатов (purpose=
CLIENT_AUTH
). (Внесено Кристианом Хаймсом в bpo-19292).
Две новые функции enum_certificates()
и enum_crls()
, предназначенные только для windows, предоставляют возможность получать сертификаты, информацию о сертификатах и СОС из хранилища сертификатов Windows. (Вклад Кристиана Хаймса в bpo-17134).
Поддержка SNI (Server Name Indication) на стороне сервера с использованием нового метода ssl.SSLContext.set_servername_callback()
. (Внесено Дэниелом Блэком в bpo-8109).
Словарь, возвращаемый SSLSocket.getpeercert()
, содержит дополнительные элементы расширения X509v3
: crlDistributionPoints
, calIssuers
и OCSP
URI. (Внесено Кристианом Хаймсом в bpo-18379).
статистика¶
Модуль stat
теперь поддерживается реализацией на языке C в _stat
. Реализация на C необходима, так как большинство значений не стандартизированы и зависят от платформы. (Внесено Кристианом Хаймсом в bpo-11016).
Модуль поддерживает новые флаги ST_MODE
, S_IFDOOR
, S_IFPORT
и S_IFWHT
. (Вклад Кристиана Хиемеса в bpo-11016).
struct¶
Новая функция iter_unpack
и новый метод struct.Struct.iter_unpack()
на скомпилированных форматах обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры данных заданного формата. (Вклад Антуана Питру в bpo-17804).
подпроцесс¶
check_output()
теперь принимает аргумент input, который может быть использован для предоставления содержимого stdin
для выполняемой команды. (Внесено Заком Вайнбергом в bpo-16624).
getstatus()
и getstatusoutput()
теперь работают под Windows. Это изменение было непреднамеренно сделано в версии 3.3.4. (Внесено Тимом Голденом в bpo-10197).
сунау¶
Метод getparams()
теперь возвращает именованный кортеж, а не обычный кортеж. (Внесено Клаудиу Попа в bpo-18901).
sunau.open()
теперь поддерживает протокол управления контекстом: при использовании в блоке with
метод close
возвращаемого объекта будет вызван автоматически в конце блока. (Внесено Сергеем Сторчакой в bpo-18878).
AU_write.setsampwidth()
теперь поддерживает 24-битные сэмплы, таким образом добавляя поддержку записи 24 сэмплов с помощью модуля. (Внесено Сергеем Сторчакой в bpo-19261).
Методы writeframesraw()
и writeframes()
теперь принимают любой bytes-like object. (Внесено Сергеем Сторчакой в bpo-8311).
sys¶
Новая функция sys.getallocatedblocks()
возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройками по умолчанию --with-pymalloc
это выделения, сделанные через API PyObject_Malloc()
). Это может быть полезно для отслеживания утечек памяти, особенно если это автоматизировано с помощью набора тестов. (Внесено Антуаном Питру в bpo-13390).
Когда интерпретатор Python запускается в interactive mode, он проверяет наличие атрибута __interactivehook__
на модуле sys
. Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка производится после чтения файла PYTHONSTARTUP
, поэтому его можно установить там. Модуль site
sets it к функции, которая включает завершение вкладок и сохранение истории (в ~/.python-history
), если платформа поддерживает readline
. Если вам не нужно это (новое) поведение, вы можете переопределить его в PYTHONSTARTUP
, sitecustomize
или usercustomize
, удалив этот атрибут из sys
(или установив его в другой вызываемый модуль). (Внесено Éric Araujo и Antoine Pitrou в bpo-5845).
tarfile¶
Модуль tarfile
теперь поддерживает простой Интерфейс командной строки при вызове в качестве скрипта напрямую или через -m
. Это можно использовать для создания и извлечения архивов tarfile. (Внесено Беркером Пексагом в bpo-13477).
textwrap¶
Класс TextWrapper
имеет два новых атрибута/аргумента конструктора: max_lines
, который ограничивает количество строк в выводе, и placeholder
, который представляет собой строку, которая появится в конце вывода, если он был усечен из-за max_lines. Опираясь на эти возможности, новая удобная функция shorten()
сворачивает все пробельные символы во входных данных до единичных пробелов и выдает одну строку заданной ширины, которая заканчивается заместителем (по умолчанию [...]
). (Вклад Антуана Питру и Сергея Сторчака в bpo-18585 и bpo-18725).
нарезание резьбы¶
Объект Thread
, представляющий главный поток, можно получить из функции new main_thread()
. В обычных условиях это будет поток, из которого был запущен интерпретатор Python. (Внесено Андреем Светловым в bpo-18882).
traceback¶
Новая функция traceback.clear_frames()
принимает объект traceback и очищает локальные переменные во всех фреймах, на которые она ссылается, уменьшая объем потребляемой памяти. (Внесено Эндрю Кучлингом в bpo-1565525).
типы¶
Новый дескриптор DynamicClassAttribute()
предоставляет возможность определить атрибут, который действует нормально при поиске через объект экземпляра, но направляется в класс __getattr__
при поиске через класс. Это позволяет иметь свойства, активные для класса, и виртуальные атрибуты для класса с тем же именем (см. пример Enum
). (Внесено Итаном Фурманом в bpo-19030).
urllib¶
urllib.request
теперь поддерживает data:
URL через класс DataHandler
. (Вклад Матиаса Панценбёка в bpo-16423).
Метод http, который будет использоваться классом Request
, теперь можно указать, установив атрибут класса method
для подкласса. (Внесено Jason R Coombs в bpo-18978).
Объекты Request
теперь можно использовать повторно: при изменении атрибутов full_url
или data
обновляются все соответствующие внутренние свойства. Это означает, например, что теперь можно использовать один и тот же объект Request
в более чем одном вызове OpenerDirector.open()
с разными аргументами data, или модифицировать Request
„s url
вместо того, чтобы пересчитывать его с нуля. Также появился новый метод remove_header()
, который можно использовать для удаления заголовков из Request
. (Вклад Алексея Качаева в bpo-16464, Даниэля Возняка в bpo-17485, и Дэмиена Брехта и Сентхила Кумарана в bpo-17272).
Объекты HTTPError
теперь имеют атрибут headers
, который предоставляет доступ к заголовкам ответа HTTP, связанным с ошибкой. (Внесено Беркером Пексагом в bpo-15701).
unittest¶
Класс TestCase
имеет новый метод subTest()
, который создает контекстный менеджер, чей блок with
становится «подтестом». Этот контекстный менеджер позволяет методу тестирования динамически генерировать подтесты, например, вызывая контекстный менеджер subTest
внутри цикла. Таким образом, один метод тестирования может создавать неограниченное количество отдельно идентифицированных и отдельно учитываемых тестов, которые будут выполняться, даже если один или несколько из них не пройдут. Например:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
приведет к созданию шести подтестов, каждый из которых будет идентифицирован в вербальном выводе unittest меткой, состоящей из имени переменной i
и конкретного значения этой переменной (i=0
, i=1
и т.д.). Полную версию этого примера смотрите в Различение итераций теста с помощью субтестов. (Внесено Антуаном Питру в bpo-16997).
unittest.main()
теперь принимает итерацию имен тестов для defaultTest, тогда как раньше он принимал только одно имя теста в виде строки. (Внесено Юрки Пуллиайненом в bpo-15132).
Если SkipTest
возникает во время обнаружения теста (то есть на уровне модуля в файле теста), то теперь об этом сообщается как о пропуске вместо ошибки. (Внесено Заком Уэйром в bpo-16935).
discover()
теперь сортирует обнаруженные файлы для обеспечения последовательного упорядочивания тестов. (Вклад Мартина Мелина и Джеффа Рамнани в bpo-16709).
TestSuite
теперь удаляет ссылки на тесты сразу после выполнения теста, если тест прошел успешно. В интерпретаторах Python, выполняющих сборку мусора, это позволяет собирать тесты в мусор, если ни у кого больше нет ссылок на тест. Это поведение можно переопределить, создав подкласс TestSuite
, определяющий собственный метод _removeTestAtIndex
. (Вклад Тома Уордилла, Мэтта МакКлюра и Андрея Светлова в bpo-11798).
Новый контекст-менеджер тестовых утверждений assertLogs()
гарантирует, что данный блок кода выдаст сообщение журнала, используя модуль logging
. По умолчанию сообщение может исходить от любого регистратора и иметь приоритет INFO
или выше, но можно указать как имя регистратора, так и альтернативный минимальный уровень регистрации. Объект, возвращаемый менеджером контекста, может быть запрошен для получения LogRecord
s и/или форматированных сообщений, которые были зарегистрированы. (Внесено Антуаном Питру в bpo-18937).
Обнаружение тестов теперь работает с пакетами пространств имен (Внесено Клаудиу Попа в bpo-17457).
Объекты unittest.mock
теперь проверяют свои спецификационные подписи при сопоставлении вызовов, что означает, что аргумент теперь может быть сопоставлен как по позиции, так и по имени, а не только по позиции. (Внесено Антуаном Питру в bpo-17015).
Объекты mock_open()
теперь имеют методы readline
и readlines
. (Внесено Тошио Куратоми в bpo-17467).
venv¶
venv
теперь включает скрипты активации для оболочек csh
и fish
. (Внесено Андреем Светловым из bpo-15417).
EnvBuilder
и функция удобства create()
принимают новый аргумент ключевого слова with_pip, по умолчанию равный False
, который контролирует, гарантирует ли EnvBuilder
, что pip
установлен в виртуальной среде. (Внесено Ником Когланом в bpo-19552 в рамках реализации PEP 453).
волна¶
Метод getparams()
теперь возвращает именованный кортеж, а не обычный кортеж. (Внесено Клаудиу Попа в bpo-17487).
wave.open()
теперь поддерживает протокол управления контекстом. (Внесено Клаудиу Попа из bpo-17616).
wave
теперь может write output to unseekable files. (При участии Дэвида Джонса, Гильерме Поло и Сергея Сторчака в bpo-5202).
Методы writeframesraw()
и writeframes()
теперь принимают любой bytes-like object. (Внесено Сергеем Сторчакой в bpo-8311).
weakref¶
Новый класс WeakMethod
имитирует слабые ссылки на связанные методы. (Внесено Антуаном Питру в bpo-14631).
Новый класс finalize
позволяет зарегистрировать обратный вызов, который будет вызван, когда объект будет собран в мусор, без необходимости тщательно управлять жизненным циклом самой слабой ссылки. (Внесено Ричардом Оудкерком в bpo-15528).
Обратный вызов, если таковой имеется, связанный с ref
, теперь отображается через атрибут __callback__
. (Внесено Марком Дикинсоном в bpo-17643).
xml.etree¶
Новый парсер, XMLPullParser
, позволяет неблокирующим приложениям разбирать XML-документы. Пример можно увидеть в Pull API для неблокирующего парсинга. (Вклад Антуана Питру в bpo-17741).
Функции xml.etree.ElementTree
tostring()
и tostringlist()
, а также метод ElementTree
write()
теперь имеют параметр short_empty_elements keyword-only parameter, обеспечивающий контроль над тем, записываются ли элементы без содержимого в сокращенном (<tag />
) или расширенном (<tag></tag>
) виде. (Внесено Ариэлем Поляком и Сергеем Сторчакой в bpo-14377).
zipfile¶
Метод writepy()
класса PyZipFile
имеет новый параметр filterfunc, который можно использовать для управления тем, какие каталоги и файлы добавляются в архив. Например, это может быть использовано для исключения из архива тестовых файлов. (Внесено Кристианом Тисмером в bpo-19274).
Параметр allowZip64 в ZipFile
и PyZipfile
теперь по умолчанию равен True
. (Внесено Уильямом Маллардом в bpo-17201).
Изменения в реализации CPython¶
PEP 445: Настройка аллокаторов памяти CPython¶
PEP 445 добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.
См.также
- PEP 445 – Добавление новых API для настройки распределителей памяти Python
PEP написан и реализован Виктором Стиннером.
PEP 442: Безопасная финализация объектов¶
PEP 442 устраняет текущие ограничения и причуды финализации объектов в CPython. С его помощью объекты с методами __del__()
, а также генераторы с положениями finally
могут быть финализированы, если они являются частью цикла ссылок.
В рамках этого изменения глобальные файлы модулей больше не устанавливаются принудительно в None
во время закрытия интерпретатора в большинстве случаев, вместо этого полагаясь на нормальную работу циклического сборщика мусора. Это позволяет избежать целого класса ошибок при выключении интерпретатора, обычно связанных с методами __del__
, которые мучили Python с тех пор, как циклический GC был впервые представлен.
См.также
- PEP 442 – Безопасная финализация объекта
PEP написан и реализован Антуаном Питру.
PEP 456: Безопасный и взаимозаменяемый алгоритм хэширования¶
PEP 456 является продолжением предыдущей работы по исправлению безопасности хэш-алгоритма Python для решения некоторых DOS-атак, которым могут быть подвержены публичные API, основанные на поиске по словарю. (Начало текущего раунда улучшений см. в bpo-14621). PEP унифицирует хэш-код CPython, чтобы облегчить упаковщику замену другого хэш-алгоритма, и переключает реализацию Python по умолчанию на реализацию SipHash на платформах, имеющих 64-битный тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV тривиальны.
PEP добавляет дополнительные поля в именованный кортеж sys.hash_info
для описания алгоритма хэширования, используемого текущим исполняемым двоичным файлом. В остальном, PEP не изменяет никаких существующих API CPython.
PEP 436: Клиника аргументации¶
«Клиника аргументов» (PEP 436) теперь является частью процесса сборки CPython и может быть использована для упрощения процесса определения и поддержания точных сигнатур для встроенных модулей и модулей расширения стандартной библиотеки, реализованных на C.
Некоторые модули расширения стандартной библиотеки были преобразованы для использования Argument Clinic в Python 3.4, и pydoc
и inspect
были обновлены соответствующим образом.
Ожидается, что метаданные сигнатур для программной интроспекции будут добавлены к дополнительным callables, реализованным на C, в рамках релизов поддержки Python 3.4.
Примечание
PEP по Argument Clinic не полностью соответствует состоянию реализации. Это было сочтено приемлемым менеджером выпуска и основной командой разработчиков, поскольку в Python 3.4 Argument Clinic не будет доступен в качестве публичного API для стороннего использования.
См.также
- PEP 436 - Клиника аргументации DSL
PEP написан и реализован Ларри Хастингсом.
Другие изменения в сборке и C API¶
Новая функция
PyType_GetSlot()
была добавлена в стабильный ABI, позволяя извлекать указатели функций из именованных слотов типов при использовании ограниченного API. (Внесено Мартином фон Лёвисом в bpo-17162).Новый API предварительной инициализации
Py_SetStandardStreamEncoding()
позволяет приложениям, встраивающим интерпретатор CPython, надежно принудительно устанавливать определенную кодировку и обработчик ошибок для стандартных потоков. (Вклад внесли Bastien Montagne и Nick Coghlan в bpo-16129).Большинство API Python C, которые не мутируют строковые аргументы, теперь правильно помечаются как принимающие
const char *
, а неchar *
. (Внесено Сергеем Сторчакой в bpo-1772673).Новая версия оболочки
python-config
может использоваться даже тогда, когда интерпретатор python недоступен (например, в сценариях кросс-компиляции).PyUnicode_FromFormat()
теперь поддерживает спецификации ширины и точности для%s
,%A
,%U
,%V
,%S
и%R
. (Вклад внесли Ysj Ray и Виктор Стиннер в bpo-7330).Новая функция
PyStructSequence_InitType2()
дополняет существующую функциюPyStructSequence_InitType()
. Разница в том, что она возвращает0
при успехе и-1
при неудаче.Исходный текст CPython теперь может быть скомпилирован с использованием функций проверки корректности адреса в последних версиях GCC и clang: ложные срабатывания в распределителе мелких объектов были устранены. (Вклад внес Dhiru Kholia из bpo-18596).
В сборке для Windows теперь используются Address Space Layout Randomization и Data Execution Prevention. (Вклад Кристиана Хаймса в bpo-16632).
Новая функция
PyObject_LengthHint()
является эквивалентом API C дляoperator.length_hint()
. (Внесена Армином Ронахером в bpo-16148).
Прочие улучшения¶
Команда python имеет новый option,
-I
, который заставляет ее работать в «изолированном режиме», что означает, чтоsys.path
не содержит ни каталога скрипта, ни каталога пользователяsite-packages
, а все переменные окруженияPYTHON*
игнорируются (это подразумевает как-s
, так и-E
). В будущем могут быть применены и другие ограничения, цель которых - изолировать выполнение скрипта от окружения пользователя. Это уместно, например, когда Python используется для запуска системного скрипта. В большинстве систем POSIX его можно и нужно использовать в строке#!
системных скриптов. (Внесено Кристианом Хаймсом в bpo-16499).Завершение символов табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих
readline
. История также включена по умолчанию и записывается в файл~/.python-history
(и читается из него). (Вклад Антуана Питру и Эрика Араужо в bpo-5845).Вызов интерпретатора Python с помощью
--version
теперь выводит версию на стандартный вывод вместо стандартной ошибки (bpo-18338). Аналогичные изменения были внесены вargparse
(bpo-18920) и другие модули, имеющие скриптоподобные возможности вызова (bpo-18922).Программа установки CPython для Windows теперь добавляет
.py
к переменнойPATHEXT
при регистрации расширений, позволяя пользователям запускать скрипт python в командной строке windows, просто набрав его имя без расширения.py
. (Внесено Полом Муром в bpo-18569).Новая цель
make
coverage-report будет собирать python, запускать набор тестов и генерировать HTML отчет о покрытии для кодовой базы C, используяgcov
и lcov.Опция
-R
к python regression test suite теперь также проверяет утечки выделения памяти, используяsys.getallocatedblocks()
. (Внесено Антуаном Питру в bpo-13390).python -m
теперь работает с пакетами пространства имен.Модуль
stat
теперь реализован на C, что означает, что он получает значения для своих констант из заголовочных файлов C, вместо того, чтобы жестко кодировать значения в модуле python, как это было раньше.Загрузка нескольких модулей python из одного модуля ОС (
.so
,.dll
) теперь работает корректно (ранее она молча возвращала первый модуль python в файле). (Внесено Вацлавом Шмилауэром в bpo-16421).Новый опкод,
LOAD_CLASSDEREF
, был добавлен для исправления ошибки в загрузке свободных переменных в телах классов, которая могла быть вызвана некоторым использованием __prepare__. (Вклад Бенджамина Петерсона в bpo-17853).Ряд сбоев, связанных с MemoryError, был выявлен и исправлен Виктором Стиннером с помощью его инструмента PEP 445, основанного на
pyfailmalloc
(bpo-18408, bpo-18520).Команда
pyvenv
теперь принимает опцию--copies
для использования копий, а не симлинков даже в системах, где симлинки используются по умолчанию. (Внесено Винаем Саджипом в bpo-18807).Команда
pyvenv
также принимает опцию--without-pip
для подавления автоматической загрузки pip в виртуальную среду. (Внесено Ником Когланом в bpo-19552 в рамках реализации PEP 453).Имя кодировки теперь является необязательным в наборе значений для переменной окружения
PYTHONIOENCODING
. Это позволяет установить только обработчик ошибок, не изменяя кодировку по умолчанию. (Внесено Сергеем Сторчакой в bpo-18818).Функции
bz2
,lzma
иgzip
модуляopen
теперь поддерживают режимx
(эксклюзивное создание). (Вклад Тима Хини и Вайраски Кока в bpo-19201, bpo-19222 и bpo-19223).
Значительные оптимизации¶
Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Внесено Сергеем Сторчакой из bpo-14625).
Уменьшена стоимость коллизий хэша для множеств. Каждый зонд хэш-таблицы теперь проверяет серию последовательных, смежных пар ключ/хэш, прежде чем продолжить случайные зондирования хэш-таблицы. Это использует локальность кэша, чтобы сделать разрешение коллизий менее затратным. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных зондов по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR_PROBES как любое значение. Установите LINEAR_PROBES=0, чтобы полностью отключить линейное зондирование. (Внесено Раймондом Хеттингером в bpo-18771).
Интерпретатор запускается примерно на 30% быстрее. Ускорение достигается за счет нескольких мер. Интерпретатор загружает меньше модулей при запуске, например, модули
re
,collections
иlocale
и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Вклад Антуана Питру, Кристиана Хаймса и Виктора Стиннера в bpo-19219, bpo-19218, bpo-19209, bpo-19205 и bpo-9548).bz2.BZ2File
теперь работает так же быстро или быстрее, чем версия Python2 в большинстве случаев.lzma.LZMAFile
также был оптимизирован. (Вклад Сергея Сторчака и Надима Вавды в bpo-16034).random.getrandbits()
на 20%-40% быстрее для небольших целых чисел (наиболее распространенный случай использования). (Вклад Сергея Сторчака в bpo-16674).Благодаря использованию преимуществ нового формата хранения строк, травление строк теперь происходит значительно быстрее. (Вклад Виктора Стиннера и Антуана Питру в bpo-15596).
Проблема производительности в
io.FileIO.readall()
была решена. Это особенно влияет на Windows и значительно ускоряет работу при передаче значительных объемов данных черезsubprocess
. (Внесено Ричардом Оудкерком в bpo-15758).html.escape()
теперь в 10 раз быстрее. (Внесено Мэттом Брайантом из bpo-18020).В Windows вместо CRT
VirtualAlloc
вmalloc
теперь используется роднойobmalloc
. Искусственные бенчмарки показывают экономию памяти около 3%.os.urandom()
теперь использует лениво открываемый постоянный дескриптор файла, чтобы избежать использования многих файловых дескрипторов при параллельном запуске из нескольких потоков. (Внесено Антуаном Питру в bpo-18756).
Утративший силу¶
В этом разделе рассматриваются различные API и другие возможности, которые были устаревшими в Python 3.4 и будут удалены в Python 3.5 или более поздней версии. В большинстве (но не во всех) случаев использование устаревших API приведет к появлению DeprecationWarning
при запуске интерпретатора с включенными предупреждениями об устаревании (например, с помощью -Wd
).
Устранения в API Python¶
Как указано в PEP 451: Тип ModuleSpec для системы импорта, ряд методов и функций
importlib
устарели:importlib.find_loader()
заменяется наimportlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
заменяется наimportlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
заменяется наimportlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
иfind_module()
заменяются наimportlib.abc.PathEntryFinder.find_spec()
; все методыxxxLoader
ABCload_module
(importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc.FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
) больше не должны быть реализованы, вместо этого загрузчики должны реализовать методexec_module
(importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
importlib.abc.SourceLoader.exec_module()
) и позволить системе импорта позаботиться об остальном; иimportlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
иimportlib.util.set_package()
больше не нужны, поскольку их функции теперь автоматически обрабатываются системой импорта.Модуль
imp
находится в процессе депривации. Чтобы сохранить совместимость с кодовыми базами Python 2/3, удаление модуля в настоящее время не планируется.Модуль
formatter
находится на стадии устаревания и планируется к удалению в Python 3.6.MD5
как digestmod по умолчанию для функцииhmac.new()
устарел. В Python 3.6 в качестве аргумента digestmod будет требоваться явное имя или конструктор дайджеста.Внутренний класс
Netrc
в модулеftplib
уже давно задокументирован как устаревший в своей doc-строке. Сейчас он выдаетDeprecationWarning
и будет полностью удален в Python 3.5.Недокументированный аргумент endtime в
subprocess.Popen.wait()
не должен был использоваться и, надеюсь, не используется; он устарел и, скорее всего, будет удален в Python 3.5.Аргумент strict в
HTMLParser
является устаревшим.Функции
plistlib
readPlist()
,writePlist()
,readPlistFromBytes()
иwritePlistToBytes()
устарели в пользу соответствующих новых функцийload()
,dump()
,loads()
иdumps()
. ФункцияData()
устарела в пользу простого использования конструктораbytes
.Ключ
sysconfig
SO
устарел, он был заменен наEXT_SUFFIX
.Режим
U
, принимаемый различными функциямиopen
, устарел. В Python3 он не делает ничего полезного и должен быть заменен соответствующим использованиемio.TextIOWrapper
(при необходимости) и его аргумента newline.Аргумент parser в
xml.etree.ElementTree.iterparse()
был устаревшим, как и аргумент html вXMLParser()
. Чтобы подготовиться к удалению последнего, все аргументы вXMLParser
следует передавать по ключевому слову.
Утраченные функции¶
Удалено¶
Операционные системы больше не поддерживаются¶
Поддержка следующих операционных систем была удалена из исходных текстов и инструментов сборки:
Удаление API и функций¶
Следующие устаревшие и ранее устаревшие API и функции были удалены:
Не поддерживаемые каталоги
Misc/TextMate
иMisc/vim
были удалены (смотрите devguide для предложений о том, что использовать вместо них).Макрос
SO
makefile удален (он был заменен макросамиSHLIB_SUFFIX
иEXT_SUFFIX
) (bpo-16754).Поле
PyThreadState.tick_counter
было удалено; его значение было бессмысленным со времен Python 3.2, когда был введен «новый GIL» (bpo-19199).PyLoader
иPyPycLoader
были удалены изimportlib
. (Внесено Тарасом Ляпуном в bpo-15641).Аргумент strict для
HTTPConnection
иHTTPSConnection
был удален. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.Устаревшие методы getter и setter
urllib.request.Request
add_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
иis_unverifiable
были удалены (вместо них используйте прямой доступ к атрибутам).Поддержка загрузки устаревшего
TYPE_INT64
была удалена изmarshal
. (Внесено Дэном Рити в bpo-15480).inspect.Signature
: параметры только для позиционирования теперь обязаны иметь действительное имя.object.__format__()
больше не принимает непустые строки формата, теперь вместо них выдаетсяTypeError
. Использование непустой строки было устаревшим с Python 3.2. Это изменение было сделано для предотвращения ситуации, когда ранее работающий (но некорректный) код начинал давать сбой, если у объекта появлялся метод __format__. Это означает, что теперь ваш код может выдать ошибкуTypeError
, если вы используете код формата's'
с объектами, у которых нет метода __format__, который его обрабатывает. Предысторию см. в bpo-7994.difflib.SequenceMatcher.isbjunk()
иdifflib.SequenceMatcher.isbpopular()
были устаревшими в версии 3.2 и теперь удалены: используйтеx in sm.bjunk
иx in sm.bpopular
, где sm - объектSequenceMatcher
(bpo-13248).
Очистка кода¶
Неиспользуемый и недокументированный внутренний класс
Scanner
был удален из модуляpydoc
.Закрытый и фактически неиспользуемый модуль
_gestalt
был удален, вместе с закрытыми функциямиplatform
_mac_ver_lookup
,_mac_ver_gstalt
и_bcd2str
, которые могли быть вызваны только на сильно сломанных системах OSX (см. bpo-18393).Удалены жестко закодированные копии некоторых констант
stat
, которые были включены в пространство имен модуляtarfile
.
Перенос на Python 3.4¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении команды „python“¶
В posix shell установка переменной окружения
PATH
в пустое значение эквивалентна ее отсутствию. Однако установкаPYTHONPATH
в пустое значение была не эквивалентна ее отсутствию вообще: установкаPYTHONPATH
в пустое значение была эквивалентна установке в.
, что приводило к путанице при рассуждениях по аналогии с тем, как работаетPATH
. Теперь поведение соответствует соглашению posix дляPATH
.Вывод [X refs, Y blocks] в отладочной (
--with-pydebug
) сборке интерпретатора CPython теперь выключен по умолчанию. Он может быть снова включен с помощью опции-X showrefcount
. (Внесено Эцио Мелотти в bpo-17323).Команда python и большинство скриптов stdlib (а также
argparse
) теперь выводят информацию--version
вstdout
вместоstderr
(список проблем см. в Прочие улучшения выше).
Изменения в API Python¶
ABC, определенные в
importlib.abc
, теперь либо вызывают соответствующее исключение, либо возвращают значение по умолчанию вместо того, чтобы вызыватьNotImplementedError
вслепую. Это повлияет только на код, вызывающийsuper()
и проходящий весь путь до ABCs. Для совместимости, при необходимости, перехватывайте обаNotImplementedError
или соответствующее исключение.Тип модуля теперь инициализирует атрибуты
__package__
и__loader__
по умолчанию вNone
. Чтобы определить, были ли эти атрибуты установлены обратно совместимым образом, используйте, например,getattr(module, '__loader__', None) is not None
. (bpo-17115.)importlib.util.module_for_loader()
теперь устанавливает__loader__
и__package__
безоговорочно для правильной поддержки перезагрузки. Если это нежелательно, то вам нужно будет установить эти атрибуты вручную. Вы можете использоватьimportlib.util.module_to_load()
для управления модулями.Импорт теперь сбрасывает соответствующие атрибуты (например,
__name__
,__loader__
,__package__
,__file__
,__cached__
) безусловно при перезагрузке. Обратите внимание, что это восстанавливает поведение, существовавшее до версии 3.3, поскольку означает, что модуль будет найден заново при повторной загрузке (bpo-19413).Замороженные пакеты больше не устанавливают
__path__
в список, содержащий имя пакета, теперь они устанавливают его в пустой список. Предыдущее поведение могло привести к тому, что система импорта делала неправильные действия при импорте подмодулей, если существовал каталог с тем же именем, что и замороженный пакет. Правильный способ определить, является ли модуль пакетом или нет, - использоватьhasattr(module, '__path__')
(bpo-18065).Замороженные модули больше не определяют атрибут
__file__
. Семантически неправильно для замороженных модулей устанавливать этот атрибут, поскольку они не загружаются из какого-либо явного места. Если вам необходимо знать, что модуль пришел из замороженного кода, то вы можете посмотреть, установлен ли в модуле__spec__.location
атрибут'frozen'
, проверить, является ли загрузчик подклассомimportlib.machinery.FrozenImporter
, или, если необходима совместимость с Python 2, вы можете использоватьimp.is_frozen()
.py_compile.compile()
теперь выдаетFileExistsError
, если путь к файлу, в который будет производиться запись, является симлинком или нерегулярным файлом. Это предупреждение о том, что при импорте эти файлы будут перезаписаны обычным файлом, независимо от того, какой путь к файлу был изначально.importlib.abc.SourceLoader.get_source()
больше не вызываетImportError
, когда загружаемый исходный код вызываетSyntaxError
илиUnicodeDecodeError
. ПосколькуImportError
предназначен для того, чтобы вызывать ошибку только тогда, когда исходный код не может быть найден, но должен быть найден, было сочтено, что это перебор/перегрузка этого значения, когда исходный код найден, но неправильно структурирован. Если вы ловили ImportError раньше и хотите продолжать игнорировать проблемы синтаксиса или декодирования, ловите все три исключения сейчас.functools.update_wrapper()
иfunctools.wraps()
теперь корректно устанавливают атрибут__wrapped__
на оборачиваемую функцию, даже если у этой функции также установлен атрибут__wrapped__
. Это означает, что атрибуты__wrapped__
теперь корректно связывают стек декорированных функций, а не каждый атрибут__wrapped__
в цепочке ссылается на самую внутреннюю функцию. Библиотеки интроспекции, которые предполагали, что предыдущее поведение было намеренным, могут использоватьinspect.unwrap()
для доступа к первой функции в цепочке, которая не имеет атрибута__wrapped__
.inspect.getfullargspec()
был реализован поверхinspect.signature()
и, следовательно, обрабатывает гораздо большее разнообразие вызываемых объектов, чем это было в прошлом. Ожидается, что дополнительные вызываемые объекты встроенных модулей и модулей расширения получат метаданные сигнатуры в ходе работы над серией Python 3.4. Код, предполагающий, чтоinspect.getfullargspec()
не сработает на не-Python вызываемых объектах, возможно, придется соответствующим образом скорректировать.importlib.machinery.PathFinder
теперь передает текущий рабочий каталог объектам вsys.path_hooks
для пустой строки. Это приводит к тому, чтоsys.path_importer_cache
никогда не содержит''
, поэтому итерация поsys.path_importer_cache
на основеsys.path
не найдет все ключи. В__file__
при импорте модуля в текущий рабочий каталог теперь также будет указан абсолютный путь, в том числе при использовании-m
с интерпретатором (за исключением__main__.__file__
, когда сценарий был выполнен напрямую с использованием относительного пути) (Внесено Бреттом Кэнноном в bpo-18416). указан в командной строке) (bpo-18416).Удаление аргумента strict в
HTTPConnection
иHTTPSConnection
изменяет значение оставшихся аргументов, если вы указываете их позиционно, а не ключевым словом. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать все дополнительные аргументы через ключевые слова.Строки между утверждениями
from __future__ import ...
теперь всегда вызывают предупреждениеSyntaxError
. Ранее, если не было ведущей doc-строки, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже соответствовали. (bpo-17434).ssl.SSLSocket.getpeercert()
иssl.SSLSocket.do_handshake()
теперь вызываютOSError
сENOTCONN
, когдаSSLSocket
не подключен, вместо прежнего поведения, когда вызываетсяAttributeError
. Кроме того,getpeercert()
будет выдаватьValueError
, если квитирование еще не выполнено.base64.b32decode()
теперь выдаетbinascii.Error
, когда входная строка содержит символы, отличные от алфавита-b32, вместоTypeError
. Этот конкретныйTypeError
был пропущен при преобразовании другихTypeError
s. (Внесено Сергеем Сторчакой в bpo-18011.) Примечание: это изменение также было непреднамеренно применено в Python 3.3.3.Атрибут
file
теперь автоматически закрывается, когда созданный экземплярcgi.FieldStorage
собирается в мусор. Если вы вытаскивали объект файла отдельно от экземпляраcgi.FieldStorage
и не сохраняли экземпляр живым, то вам следует либо сохранить весь экземплярcgi.FieldStorage
, либо прочитать содержимое файла перед сборкой мусора экземпляраcgi.FieldStorage
.Вызов
read
илиwrite
на закрытом SSL-сокете теперь вызывает информативное сообщениеValueError
, а не более загадочноеAttributeError
(bpo-9177).slice.indices()
больше не выдаетOverflowError
для огромных значений. Как следствие этого исправления,slice.indices()
теперь выдаетValueError
, если ему дана отрицательная длина; ранее он возвращал бессмысленные значения (bpo-14794).Конструктор
complex
, в отличие от функцийcmath
, некорректно принимал значенияfloat
, если специальный метод объекта__complex__
возвращал единицу. Теперь это вызывает ошибкуTypeError
. (bpo-16290.)Конструктор
int
в 3.2 и 3.3 ошибочно принималfloat
значения для параметра base. Вряд ли кто-то делал это, но если это так, то теперь будет возникать ошибкаTypeError
(bpo-16772).Умолчания для аргументов, содержащих только ключевые слова, теперь оцениваются после умолчаний для обычных аргументов с ключевыми словами, а не перед ними. Надеюсь, никто не написал код, который зависит от предыдущего ошибочного поведения (bpo-16967).
Устаревшие состояния потоков теперь очищаются после
fork()
. Это может привести к освобождению некоторых системных ресурсов, которые ранее некорректно сохранялись вечно живыми (например, соединения базы данных, хранящиеся в локальном хранилище потоков). (bpo-17094.)Имена параметров в диктах
__annotations__
теперь преобразуются правильно, аналогично__kwdefaults__
. (Внесено Юрием Селивановым в bpo-20625).hashlib.hash.name
теперь всегда возвращает идентификатор в нижнем регистре. Ранее некоторые встроенные хэши имели имена в верхнем регистре, но теперь, когда это официальный публичный интерфейс, именование стало согласованным (bpo-18532).Поскольку
unittest.TestSuite
теперь удаляет ссылки на тесты после их выполнения, тестовые жгуты, которые повторно используютTestSuite
для повторного выполнения набора тестов, могут не работать. Наборы тестов не должны использоваться повторно таким образом, поскольку это означает, что состояние сохраняется между запусками тестов, нарушая изоляцию тестов, которую призван обеспечитьunittest
. Однако, если отсутствие изоляции считается приемлемым, старое поведение можно восстановить, создав подклассTestSuite
, определяющий метод_removeTestAtIndex
, который ничего не делает (см.TestSuite.__iter__()
) (bpo-11798).unittest
теперь используетargparse
для разбора командной строки. Существуют некоторые недопустимые формы команд, которые раньше работали, но теперь не разрешены; теоретически это не должно вызвать проблем с обратной совместимостью, поскольку запрещенные формы команд не имеют никакого смысла и вряд ли будут использоваться.Функции
re.split()
,re.findall()
иre.sub()
, а также методыgroup()
иgroups()
объектовmatch
теперь всегда возвращают объект bytes, если сопоставляемая строка является bytes-like object. Ранее тип возвращаемого значения соответствовал типу вводимого значения, поэтому если ваш код зависел от того, что возвращаемое значение было, скажем,bytearray
, вам придется изменить свой код.Функции
audioop
теперь сразу выдают ошибку при передаче строкового ввода, вместо случайного отказа в дальнейшем (bpo-16685).Новый аргумент convert_charrefs в
HTMLParser
в настоящее время имеет значение по умолчаниюFalse
для обратной совместимости, но со временем будет изменен на значение по умолчаниюTrue
. Рекомендуется добавить это ключевое слово с соответствующим значением к любым вызовамHTMLParser
в вашем коде (bpo-13633).Поскольку аргумент digestmod функции
hmac.new()
в будущем не будет иметь значения по умолчанию, все вызовыhmac.new()
должны быть изменены для явного указания digestmod (bpo-17276).Вызов
sysconfig.get_config_var()
с ключомSO
или поискSO
в результатах вызоваsysconfig.get_config_vars()
является устаревшим. Этот ключ следует заменить наEXT_SUFFIX
илиSHLIB_SUFFIX
, в зависимости от контекста (bpo-19555).Любые вызовы функций
open
, в которых указаноU
, должны быть изменены.U
неэффективен в Python3 и при его использовании будет вызвана ошибка. В зависимости от функции, эквивалент ее старого поведения в Python2 можно получить, используя либо аргумент newline, либо, при необходимости, обернув поток вTextIOWrapper
, чтобы использовать его аргумент newline (bpo-15204).Если вы используете
pyvenv
в сценарии и хотите, чтобы pip не был установлен, вы должны добавить--without-pip
к вызову команды.Поведение по умолчанию
json.dump()
иjson.dumps()
при указании отступа изменилось: теперь не создаются пробелы после элемента, разделяющего запятые в конце строк. Это будет иметь значение только в том случае, если у вас есть тесты, выполняющие сравнение такого вывода с учетом пробелов (bpo-16333).doctest
теперь ищет доктесты в строках модулей расширения__doc__
, поэтому если ваш doctest test discovery включает модули расширения, в которых есть вещи, похожие на доктесты, то при выполнении тестов (bpo-3158) вы можете увидеть ошибки тестирования, которых раньше не было.Модуль
collections.abc
был немного рефакторингован в рамках улучшения запуска Python. Как следствие этого, больше не происходит так, что импортcollections
автоматически импортируетcollections.abc
. Если ваша программа зависела от (недокументированного) неявного импорта, вам придется добавить явныйimport collections.abc
(bpo-20784).
Изменения в API языка C¶
PyEval_EvalFrameEx()
,PyObject_Repr()
иPyObject_Str()
, а также некоторые другие внутренние API языка Си, теперь включают отладочное утверждение, которое гарантирует, что они не используются в ситуациях, когда они могут молча отбросить активное исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже было сохранено локально с помощьюPyErr_Fetch()
или намеренно заменяется другим исключением), потребуется явный вызовPyErr_Clear()
, чтобы избежать срабатывания утверждения при вызове этих операций (прямо или косвенно) и выполнении их на версии Python, скомпилированной с включенными утверждениями.PyErr_SetImportError()
теперь устанавливаетTypeError
, когда его аргумент msg не установлен. Ранее возвращалось толькоNULL
без установленного исключения.Результатом обратного вызова
PyOS_ReadlineFunctionPointer
теперь должна быть строка, выделеннаяPyMem_RawMalloc()
илиPyMem_RawRealloc()
, илиNULL
, если произошла ошибка, вместо строки, выделеннойPyMem_Malloc()
илиPyMem_Realloc()
(bpo-16742).PyThread_set_key_value()
теперь всегда устанавливает значение. В Python 3.3 функция ничего не делала, если ключ уже существует (если текущее значение не являетсяNULL
указателем).Поле
f_tstate
(состояние потока) структурыPyFrameObject
было удалено для исправления ошибки: см. обоснование в bpo-14432.
Изменения в версии 3.4.3¶
PEP 476: Включение проверки сертификатов по умолчанию для http-клиентов stdlib¶
http.client
и модули, использующие его, такие как urllib.request
и xmlrpc.client
, теперь будут проверять, что сервер представляет сертификат, подписанный CA в хранилище доверия платформы, и чье имя хоста совпадает с именем хоста, запрашиваемым по умолчанию, что значительно повышает безопасность многих приложений.
Для приложений, которым требуется прежнее поведение, они могут передавать альтернативный контекст:
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)