Что нового в 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
. На других платформах общесистемная неверсированная команда 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, при прямом вызове ensurepip
по умолчанию загружаются только версионные команды pip3
и pip3.4
- для запроса неверсионной команды pip
требуется опция --default-pip
. pyvenv
и программа установки Windows гарантируют, что неквалифицированная команда pip
будет доступна в этих средах, а pip
всегда можно вызвать не напрямую, а с помощью ключа -m
, чтобы избежать двусмысленности в системах с несколькими установками Python.
Изменения в документации¶
В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в краткие документы по началу работы и FAQ. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide и документацию отдельных проектов.
Однако, поскольку в настоящее время эта миграция еще не завершена, старые версии этих руководств остаются доступными в виде Создание расширений C и C++ с помощью setuptools и Создание расширений C и C++ с помощью setuptools.
См.также
- 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).Объекты модуля теперь имеют значение weakly referenceable.
Атрибуты модуля
__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()
, были изменены и улучшены в нескольких случаях в результате внедрения Argument Clinic и других изменений в модуляхinspect
иpydoc
.__length_hint__()
теперь является частью формальной спецификации языка (см. PEP 424). (Внесено Армином Ронахером в bpo-16148).
Новые модули¶
asyncio¶
Новый модуль asyncio
(определенный в PEP 3156) предоставляет стандартную подключаемую модель цикла событий для Python, обеспечивая надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и облегчая взаимодействие других реализаций цикла событий со стандартной библиотекой и друг с другом.
Для Python 3.4 этот модуль считается provisional API.
См.также
- PEP 3156 – Поддержка асинхронного ввода-вывода Перезагрузка: модуль «asyncio»
PEP написан и реализуется под руководством Гвидо ван Россума.
ensurepip¶
Новый модуль 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¶
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).
e-mail¶
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. Новый дескриптор также упрощает получение произвольных 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
теперь является официально поддерживаемым интерфейсом. Он всегда существовал в hashlib
от CPython (хотя он не возвращал имена в нижнем регистре для всех поддерживаемых хэшей), но это не был общедоступный интерфейс, и поэтому некоторые другие реализации 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
теперь полностью соответствует PEP 247. API. (Внесено Кристианом Хаймсом в bpo-18775).
html¶
Новая функция unescape()
преобразует ссылки на символы HTML5 в соответствующие символы Unicode. (Внесена Эцио Мелотти в bpo-2927).
HTMLParser
принимает новый аргумент ключевого слова convert_charrefs, который, при значении True
, автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно False
, но в будущей версии Python оно изменится на True
, так что вам предлагается задать его явно и обновить свой код, чтобы использовать эту новую возможность. (Внесено Эцио Мелотти в 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¶
В InspectLoader
ABC определяет новый метод 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()
теперь используют signature()
API. Это позволяет им поддерживать гораздо более широкий спектр вызываемых объектов, включая атрибуты __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. (Внесено Винаем Саджипом в bpo-15452).
маршал¶
Версия marshal
по умолчанию была увеличена до 3. Код, реализующий новую версию, восстанавливает поведение Python2 по записи только одной копии интернированных строк и сохранению интернирования при десериализации, а также расширяет эту возможность «одной копии» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер .pyc
файлов, так и объем памяти, занимаемый модулем при загрузке из .pyc
(или .pyo
) файла. (Вклад Кристьяна Валура Йонссона в bpo-16475, дополнительное ускорение Антуана Питру в bpo-19219).
mmap¶
Объекты mmap теперь weakly referenceable. (Внесено Валери Ламберт в 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
и других объектов, которые будут работать в этом контексте. Это позволяет фреймворку и приложению или различным частям одного и того же приложения использовать многопроцессорность, не мешая друг другу. (Внесено Ричардом Оудкерком в 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. В pdb
Python2 не было команды 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 – Протокол огурцов 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).
ШУТИЛ¶
copyfile()
теперь вызывает специальный подкласс Error
, SameFileError
, когда источником и получателем является один и тот же файл, что позволяет приложению предпринять соответствующие действия при этой специфической ошибке. (Вклад Ацуо Ишимото и Хинека Шлавака в bpo-1492704).
smtpd¶
Классы SMTPServer
и SMTPChannel
теперь принимают аргумент с ключевым словом map, который, если указан, передается в asynchat.async_chat
в качестве аргумента map. Это позволяет приложению не влиять на глобальную карту сокетов. (Внесено Винаем Саджипом в bpo-11959).
smtplib¶
SMTPException
теперь является подклассом OSError
, что позволяет перехватывать ошибки уровня сокета и уровня протокола SMTP в одном операторе try/except кодом, которому важно только то, произошла ошибка или нет. (Внесено Недом Джексоном Лавли в bpo-2118).
сокет¶
Модуль сокетов теперь поддерживает протокол 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, предоставляют возможность получать сертификаты, информацию о сертификатах и CRL из хранилища сертификатов 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
это распределение, сделанное через PyObject_Malloc()
API.) Это может быть полезно для отслеживания утечек памяти, особенно если их автоматизировать с помощью набора тестов. (Внесено Антуаном Питру в bpo-13390).
Когда интерпретатор Python запускается в interactive mode, он проверяет наличие атрибута __interactivehook__
на модуле sys
. Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка выполняется после чтения файла PYTHONSTARTUP
, поэтому его можно установить там. Модуль site
sets it - это функция, которая включает завершение табуляции и сохранение истории (в ~/.python-history
), если платформа поддерживает readline
. Если вам не нужно это (новое) поведение, вы можете переопределить его в PYTHONSTARTUP
, sitecustomize
или usercustomize
, удалив этот атрибут из sys
(или установив его на другой вызываемый элемент). (Внесено Эриком Араужо и Антуаном Питру в bpo-5845).
tarfile¶
Модуль tarfile
теперь поддерживает простой Интерфейс командной строки, вызываемый как скрипт напрямую или через -m
. Это можно использовать для создания и извлечения архивов tarfile. (Внесено Беркером Пексагом в bpo-13477).
textwrap¶
Класс TextWrapper
имеет два новых атрибута/аргумента конструктора: max_lines
, который ограничивает количество строк в выводе, и placeholder
, который представляет собой строку, появляющуюся в конце вывода, если он был усечен из-за max_lines. Развивая эти возможности, новая удобная функция shorten()
сворачивает все пробельные символы во входных данных до одиночных пробелов и выдает одну строку заданной ширины, которая заканчивается заместителем (по умолчанию [...]
). (Вклад Антуана Питру и Сергея Сторчака в bpo-18585 и bpo-18725).
нарезка резьбы¶
Объект Thread
, представляющий главный поток, можно получить из новой функции 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
' 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 verbose меткой, состоящей из имени переменной 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).
Обнаружение тестов теперь работает с пакетами пространств имен (Внесено Claudiu Popa в 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).
zip-файл¶
Метод 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
были обновлены соответствующим образом.
Ожидается, что метаданные сигнатуры для программной интроспекции будут добавлены к дополнительным таблицам вызовов, реализованным на языке C, в рамках выпуска обновлений Python 3.4.
Примечание
PEP по Argument Clinic не полностью соответствует состоянию реализации. Это было признано приемлемым менеджером выпуска и основной командой разработчиков в данном случае, так как Argument Clinic не будет доступен в качестве публичного API для использования сторонними разработчиками в Python 3.4.
См.также
- PEP 436 – Клиника «Аргумент» DSL
PEP написан и реализован Ларри Хастингсом.
Другие изменения в сборке и C API¶
В стабильный ABI была добавлена новая функция
PyType_GetSlot()
, позволяющая извлекать указатели функций из именованных слотов типов при использовании ограниченного API. (Внесено Мартином фон Лёвисом в bpo-17162).Новый API предварительной инициализации
Py_SetStandardStreamEncoding()
позволяет приложениям, встроенным в интерпретатор CPython, надежно принудительно устанавливать определенную кодировку и обработчик ошибок для стандартных потоков. (Вклад Бастьена Монтаня и Ника Коглана в bpo-16129).Большинство API Python C, которые не мутируют строковые аргументы, теперь правильно обозначены как принимающие
const char *
, а неchar *
. (Внесено Сергеем Сторчакой в bpo-1772673).Новая версия оболочки
python-config
может использоваться даже тогда, когда интерпретатор python недоступен (например, в сценариях кросс-компиляции).PyUnicode_FromFormat()
теперь поддерживает спецификации ширины и точности для%s
,%A
,%U
,%V
,%S
и%R
. (Внесено Ysj Ray и Victor Stinner в 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()
- это эквивалентoperator.length_hint()
в C API. (Внесена Армином Ронахером в 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 вместо
malloc
вobmalloc
теперь используется роднойVirtualAlloc
, а не CRTmalloc
. Искусственные бенчмарки показывают экономию памяти около 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
уже давно задокументирован как deprecated в его docstring. Теперь он излучает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 больше не поддерживаются.Устаревшие методы геттера и сеттера
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 установка переменной окружения
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()
и проходящий весь путь до ABC. Для совместимости, при необходимости, перехватывайте и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 включает модули расширения, в которых есть вещи, похожие на доктесты, то при выполнении тестов вы можете увидеть сбои в тестах, которых раньше не было (bpo-3158).Модуль
collections.abc
был немного рефакторингован в рамках улучшения запуска Python. Вследствие этого импортcollections
больше не является автоматическим импортомcollections.abc
. Если ваша программа зависела от (недокументированного) неявного импорта, вам нужно будет добавить явныйimport collections.abc
(bpo-20784).
Изменения в API языка C¶
PyEval_EvalFrameEx()
,PyObject_Repr()
иPyObject_Str()
, а также некоторые другие внутренние API на языке C теперь включают отладочное утверждение, которое гарантирует, что они не будут использоваться в ситуациях, когда они могут молча отбросить активное в данный момент исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже было сохранено локально с помощью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
, теперь будут проверять, что сервер представляет сертификат, подписанный центром сертификации в хранилище доверия платформы, и чье имя хоста совпадает с запрашиваемым именем хоста по умолчанию, что значительно повышает безопасность для многих приложений.
Для приложений, которым требуется прежнее поведение, можно передать альтернативный контекст:
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)