Содержание страницы
Что нового в Python 2.7¶What’s New in Python 2.7
- Автор
A.M. Kuchling (amk at amk.ca)
Эта статья описывает новые возможности в Python 2.7. Python 2.7 был выпущен 3 июля 2010 года.
Обработка чисел была улучшена во многих аспектах, как для чисел с плавающей запятой, так и для класса Decimal. В стандартную библиотеку добавлено несколько полезных дополнений, таких как сильно улучшенный модуль unittest, модуль argparse для разбора параметров командной строки, удобные классы OrderedDict и Counter в модуле collections, а также множество других улучшений.
Python 2.7 планируется как последний выпуск в серии 2.x, поэтому мы постарались сделать его хорошим релизом на долгосрочную перспективу. Чтобы помочь с переносом на Python 3, в 2.7 были включены несколько новых возможностей из серии Python 3.x.
Эта статья не претендует на полное описание новых возможностей, а предоставляет удобный обзор. Для получения полной информации обратитесь к документации Python 2.7 по адресу https://docs.python.org. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности или к задаче на https://bugs.python.org, в которой обсуждалось изменение. По возможности в «Что нового в Python» даются ссылки на сообщения об ошибках/патчах для каждого изменения.
Будущее Python 2.x¶The Future for Python 2.x
Python 2.7 – последний крупный выпуск в серии 2.x, поскольку разработчики Python переключили усилия по разработке новых возможностей на серию Python 3.x. Это означает, что хотя Python 2 продолжает получать исправления ошибок и обновляться для корректной сборки на новом оборудовании и новых версиях поддерживаемых операционных систем, не будет новых полноценных релизов языка или стандартной библиотеки.
Однако, хотя между Python 2.7 и Python 3 существует большое общее подмножество, и многие изменения, связанные с миграцией на это общее подмножество или непосредственно на Python 3, можно безопасно автоматизировать, некоторые другие изменения (особенно связанные с обработкой Unicode) могут потребовать тщательного рассмотрения и, желательно, надежных автоматизированных наборов регрессионных тестов для эффективной миграции.
Это означает, что Python 2.7 останется надолго, обеспечивая стабильную и поддерживаемую базовую платформу для производственных систем, которые еще не перенесены на Python 3. Полный ожидаемый жизненный цикл серии Python 2.7 описан в PEP 373.
Некоторые ключевые следствия долгосрочного значения 2.7:
Как отмечено выше, выпуск 2.7 имеет гораздо более длительный период поддержки по сравнению с более ранними версиями 2.x. Ожидается, что Python 2.7 будет поддерживаться основной командой разработчиков (получать обновления безопасности и другие исправления ошибок) как минимум до 2020 года (10 лет после первоначального выпуска, по сравнению с более типичным периодом поддержки 18–24 месяца).
По мере старения стандартной библиотеки Python 2.7 эффективное использование Python Package Index (напрямую или через редистрибьютора) становится более важным для пользователей Python 2. В дополнение к широкому спектру сторонних пакетов для различных задач, доступные пакеты включают бэкпорты новых модулей и функций из стандартной библиотеки Python 3, совместимые с Python 2, а также различные инструменты и библиотеки, которые могут облегчить миграцию на Python 3. Python Packaging User Guide содержит рекомендации по загрузке и установке программного обеспечения из Python Package Index.
Хотя предпочтительным подходом к улучшению Python 2 теперь является публикация новых пакетов в Python Package Index, этот подход не всегда работает, особенно в случаях, связанных с сетевой безопасностью. В исключительных случаях, которые не могут быть адекватно обработаны публикацией новых или обновленных пакетов на PyPI, может быть использован процесс Python Enhancement Proposal для обоснования добавления новых возможностей непосредственно в стандартную библиотеку Python 2. Любые такие дополнения и версии сопровождения, в которых они были добавлены, будут отмечены в разделе Новые возможности, добавленные в выпуски сопровождения Python 2.7 ниже.
Для проектов, желающих перейти с Python 2 на Python 3, или для разработчиков библиотек и фреймворков, желающих поддерживать пользователей как на Python 2, так и на Python 3, существует множество инструментов и руководств, помогающих выбрать подходящий подход и справиться с некоторыми техническими деталями. Рекомендуемая отправная точка – руководство HOWTO «Перенос кода Python 2 на Python 3».
Изменения в обработке предупреждений об устаревании¶Changes to the Handling of Deprecation Warnings
Для Python 2.7 было принято решение по умолчанию подавлять предупреждения, представляющие интерес только для разработчиков. DeprecationWarning и его
потомки теперь игнорируются, если не запрошено иное, что предотвращает появление у пользователей предупреждений, вызванных приложением. Это изменение также было сделано в ветке, ставшей Python 3.2. (Обсуждалось в stdlib-sig и реализовано в bpo-7319.)
В предыдущих версиях сообщения DeprecationWarning были включены по умолчанию, предоставляя разработчикам Python четкое указание на то, где их код может сломаться в будущей основной версии Python.
Однако все больше пользователей приложений на Python не участвуют напрямую в разработке этих приложений. Сообщения DeprecationWarning не имеют значения для таких пользователей, заставляя их беспокоиться о приложении, которое на самом деле работает правильно, и создавая дополнительную нагрузку на разработчиков приложений, которым приходится отвечать на эти вопросы.
Можно повторно включить отображение сообщений DeprecationWarning, запустив Python с ключом -Wdefault (короткая форма: -Wd) или установив переменную окружения PYTHONWARNINGS
в значение "default" (или "d") перед запуском Python. Код Python также может снова включить их, вызвав warnings.simplefilter('default').
Модуль unittest также автоматически включает предупреждения об устаревании при запуске тестов.
Возможности Python 3.1¶Python 3.1 Features
Подобно тому, как Python 2.6 включал возможности из Python 3.0, версия 2.7 включает некоторые новые возможности из Python 3.1. Серия 2.x продолжает предоставлять инструменты для миграции на серию 3.x.
Частичный список возможностей 3.1, которые были перенесены в 2.7:
Синтаксис литералов множеств (
{1,2,3}– изменяемое множество).Словарные включения и включения множеств (
{i: i*2 for i in range(3)}).Несколько менеджеров контекста в одном операторе
with.Новая версия библиотеки
io, переписанная на C для производительности.Тип упорядоченного словаря, описанный в PEP 372: Adding an Ordered Dictionary to collections.
Новый спецификатор формата
",", описанный в PEP 378: Format Specifier for Thousands Separator.Объект
memoryview.Небольшое подмножество модуля
importlib, описанное ниже.repr()числа с плавающей запятойxво многих случаях короче: теперь оно основано на кратчайшей десятичной строке, которая гарантированно округляется обратно кx. Как и в предыдущих версиях Python, гарантируется, чтоfloat(repr(x))восстанавливаетx.Преобразования чисел с плавающей запятой в строки и обратно правильно округляются. Функция
round()теперь тоже правильно округляется.Тип
PyCapsule, используемый для предоставления C API для модулей расширения.Функция C API
PyLong_AsLongAndOverflow().
Другие новые предупреждения в режиме Python3 включают:
operator.isCallable()иoperator.sequenceIncludes(), которые не поддерживаются в 3.x, теперь вызывают предупреждения.Переключатель
-3теперь автоматически включает переключатель-Qwarn, который вызывает предупреждения об использовании классического деления с целыми числами и длинными целыми числами.
PEP 372: Добавление упорядоченного словаря в collections¶PEP 372: Adding an Ordered Dictionary to collections
Обычные словари Python перебирают пары ключ/значение в произвольном порядке.
За эти годы многие авторы написали альтернативные реализации,
которые запоминают порядок, в котором ключи были изначально вставлены. Основываясь на
опыте этих реализаций, версия 2.7 вводит новый
класс OrderedDict в модуль collections.
API OrderedDict предоставляет тот же интерфейс, что и обычные
словари, но перебирает ключи и значения в гарантированном порядке,
зависящем от того, когда ключ был вставлен первым:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Если новая запись перезаписывает существующую, исходное положение вставки остаётся без изменений:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
Удаление записи и повторная вставка переместит её в конец:
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
Метод popitem() имеет необязательный аргумент last,
который по умолчанию равен True. Если last равен true, возвращается и удаляется
самый недавно добавленный ключ; если он равен false, выбирается
самый старый ключ:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
Сравнение двух упорядоченных словарей проверяет как ключи, так и значения, и требует, чтобы порядок вставки был одинаковым:
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Переместить ключ 'third' в конец
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
Сравнение OrderedDict с обычным словарём игнорирует порядок вставки
и просто сравнивает ключи и значения.
Как работает OrderedDict? Он поддерживает двусвязный список ключей, добавляя новые ключи в список по мере их вставки. Дополнительный словарь сопоставляет ключи с соответствующим узлом списка, поэтому удаление не требует обхода всего связного списка и, следовательно, остаётся O(1).
Стандартная библиотека теперь поддерживает использование упорядоченных словарей в нескольких модулях.
Модуль
ConfigParserиспользует их по умолчанию, то есть конфигурационные файлы теперь можно читать, изменять, а затем записывать обратно в их исходном порядке.Метод
_asdict()дляcollections.namedtuple()теперь возвращает упорядоченный словарь, в котором значения располагаются в том же порядке, что и индексы соответствующего кортежа.Конструктор класса
JSONDecoderмодуляjsonбыл расширен параметром object_pairs_hook, чтобы позволить декодеру создавать экземплярыOrderedDict. Также была добавлена поддержка сторонних инструментов, таких как PyYAML.
См. также
- PEP 372 – Добавление упорядоченного словаря в collections
PEP написан Армином Ронахером и Рэймондом Хеттингером; реализован Рэймондом Хеттингером.
PEP 378: Спецификатор формата для разделителя тысяч¶PEP 378: Format Specifier for Thousands Separator
Чтобы сделать вывод программы более читаемым, может быть полезно добавлять разделители в большие числа, отображая их как 18,446,744,073,709,551,616 вместо 18446744073709551616.
Полностью общее решение для этого – модуль locale,
который может использовать разные разделители (“,” в Северной Америке, “.” в
Европе) и разные размеры групп, но locale сложен
в использовании и непригоден для многопоточных приложений, где разные
потоки создают вывод для разных локалей.
Поэтому в мини-язык, используемый методом str.format(), был добавлен
простой механизм группировки запятыми. При
форматировании числа с плавающей запятой просто укажите запятую между
шириной и точностью:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
При форматировании целого числа укажите запятую после ширины:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Этот механизм совершенно не настраивается; запятые всегда используются в качестве
разделителя, а группировка всегда по три цифры. Механизм
форматирования запятыми не так универсален, как модуль locale,
но проще в использовании.
См. также
- PEP 378 - Спецификатор формата для разделителя тысяч
PEP написан Рэймондом Хеттингером; реализован Эриком Смитом.
PEP 389: Модуль argparse для разбора командной строки¶PEP 389: The argparse Module for Parsing Command Lines
Модуль argparse для разбора аргументов командной строки был добавлен как более мощная замена модуля optparse.
Это означает, что теперь Python поддерживает три различных модуля для разбора аргументов командной строки: getopt, optparse и argparse. Модуль getopt очень похож на функцию getopt() из библиотеки C, поэтому он остаётся полезным, если вы пишете прототип на Python, который впоследствии будет переписан на C. optparse становится избыточным, но планов по его удалению нет, поскольку многие скрипты всё ещё используют его, и нет автоматического способа обновить эти скрипты. (Обсуждалась, но была отклонена как слишком запутанная и сложная идея сделать API argparse согласованным с интерфейсом optparse.)
Короче говоря, если вы пишете новый скрипт и вам не нужно беспокоиться о совместимости с предыдущими версиями Python, используйте argparse вместо optparse.
Вот пример:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Добавить необязательные переключатели
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Разрешить любое количество дополнительных аргументов.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
Если не переопределить их, ключи -h и --help добавляются автоматически и формируют аккуратно отформатированный вывод:
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
Как и в optparse, ключи и аргументы командной строки возвращаются как объект с атрибутами, названными в соответствии с параметрами dest:
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse обладает гораздо более мощной проверкой, чем optparse; можно указать точное количество аргументов целым числом, 0 или более аргументов, передав '*', 1 или более – передав '+', или необязательный аргумент с '?'. Родительский парсер может содержать подпарсеры для определения подкоманд с разными наборами ключей, как в svn commit, svn checkout и т.д. Тип аргумента можно указать как FileType, который автоматически откроет файлы и понимает, что '-' означает стандартный ввод или вывод.
См. также
- Документация
argparse Страница документации модуля argparse.
- Обновление кода optparse
Часть документации Python, описывающая, как преобразовать код, использующий
optparse.- PEP 389 - argparse - Новый модуль разбора командной строки
PEP написан и реализован Стивеном Бетардом.
PEP 391: Конфигурация логирования на основе словарей¶PEP 391: Dictionary-Based Configuration For Logging
Модуль logging очень гибкий; приложения могут определять дерево подсистем логирования, и каждый регистратор в этом дереве может отфильтровывать определённые сообщения, форматировать их по-разному и направлять сообщения различному количеству обработчиков.
Вся эта гибкость может потребовать много настроек. Можно писать операторы Python для создания объектов и установки их свойств, но сложная настройка требует многословного, но скучного кода. logging также поддерживает функцию fileConfig(), которая разбирает файл, но формат файла не поддерживает настройку фильтров, и его сложнее генерировать программно.
Python 2.7 добавляет функцию dictConfig(), которая использует словарь для настройки логирования. Есть много способов получить словарь из разных источников: создать его программно; разобрать файл с JSON; или использовать библиотеку разбора YAML, если она установлена. Дополнительную информацию см. в функциях конфигурации.
Следующий пример настраивает два регистратора: корневой и регистратор с именем «network». Сообщения, отправленные корневому регистратору, будут отправлены в системный журнал по протоколу syslog, а сообщения для регистратора «network» будут записаны в файл network.log, который будет ротироваться, как только журнал достигнет 1 МБ.
import logging
import logging.config
configdict = {
'version': 1, # Используемая схема конфигурации; пока должна быть равна 1
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Указать все подчинённые логгеры
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Указать свойства корневого логгера
'root': {
'handlers': ['syslog']
},
}
# Настроить конфигурацию
logging.config.dictConfig(configdict)
# В качестве примера записать два сообщения об ошибках
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
Три менее значительных улучшения модуля logging, все реализованные Винаем Саджипом:
Класс
SysLogHandlerтеперь поддерживает системное журналирование через TCP. Конструктор имеет параметр socktype, указывающий тип используемого сокета:socket.SOCK_DGRAMдля UDP илиsocket.SOCK_STREAMдля TCP. Протокол по умолчанию остаётся UDP.Экземпляры
Loggerполучили методgetChild(), который получает дочерний регистратор по относительному пути. Например, получив регистратор с помощьюlog = getLogger('app'), вызовlog.getChild('network.listen')эквивалентенgetLogger('app.network.listen').Класс
LoggerAdapterполучил методisEnabledFor(), который принимает уровень и возвращает, будет ли соответствующий регистратор обрабатывать сообщение этого уровня важности.
См. также
- PEP 391 - Конфигурация логирования на основе словарей
PEP написан и реализован Винаем Саджипом.
PEP 3106: Представления словарей¶PEP 3106: Dictionary Views
Методы словаря keys(), values() и items() отличаются в Python 3.x. Они возвращают объект, называемый представлением, вместо полностью материализованного списка.
Невозможно изменить возвращаемые значения keys(), values() и items() в Python 2.7, потому что слишком много кода сломается. Вместо этого версии 3.x были добавлены под новыми именами viewkeys(), viewvalues() и viewitems().
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
Представления можно перебирать, но представления ключей и элементов также ведут себя как множества. Оператор & выполняет пересечение, а | – объединение:
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
Представление отслеживает словарь, и его содержимое изменяется по мере изменения словаря:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
Однако обратите внимание, что нельзя добавлять или удалять ключи во время итерации по представлению:
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Методы представлений можно использовать в коде Python 2.x, и конвертер 2to3 заменит их на стандартные методы keys(), values() и items().
PEP 3137: Объект memoryview¶PEP 3137: The memoryview Object
Объект memoryview предоставляет представление содержимого памяти другого объекта,
которое соответствует интерфейсу типа bytes.
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Возвращает длину базового объекта
52
>>> m[0], m[25], m[26] # Индексация возвращает один байт
('a', 'z', 'A')
>>> m2 = m[0:26] # Срез возвращает другой memoryview
>>> m2
<memory at 0x37f080>
Содержимое представления можно преобразовать в строку байтов или список целых чисел:
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
Объекты memoryview позволяют изменять базовый объект, если
он является изменяемым.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Создание изменяемого объекта
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Присвоить значение представлению, изменив bytearray.
>>> b[0:5] # Bytearray был изменён.
bytearray(b'*bcde')
>>>
Прочие изменения языка ¶Other Language Changes
Некоторые небольшие изменения, внесённые в ядро языка Python:
Синтаксис литералов множеств был портирован из Python 3.x. Фигурные скобки используются для обрамления содержимого результирующего изменяемого множества; литералы множеств отличаются от словарей тем, что не содержат двоеточий и значений.
{}по-прежнему обозначает пустой словарь; используйтеset()для пустого множества.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # пустое множество set([]) >>> {} # пустой словарь {}
Портирован Александром Вассалотти; bpo-2335.
Генераторы словарей и множеств – ещё одна возможность, портированная из 3.x, обобщающая генераторы списков/выражения-генераторы для использования синтаксиса литералов множеств и словарей.
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
Портирован Александром Вассалотти; bpo-2333.
Оператор
withтеперь может использовать несколько менеджеров контекста в одном операторе. Менеджеры контекста обрабатываются слева направо, и каждый из них рассматривается как начало нового оператораwith. Это означает, что:with A() as a, B() as b: ... suite of statements ...
эквивалентно:
with A() as a: with B() as b: ... suite of statements ...
Функция
contextlib.nested()предоставляет очень похожую функциональность, поэтому она больше не нужна и объявлена устаревшей.(Предложено в https://codereview.appspot.com/53094; реализовано Георгом Брандлем.)
Преобразования между числами с плавающей запятой и строками теперь правильно округляются на большинстве платформ. Эти преобразования происходят во многих местах:
str()для чисел с плавающей запятой и комплексных чисел; конструкторыfloatиcomplex; форматирование чисел; сериализация и десериализация чисел с плавающей запятой и комплексных чисел с использованием модулейmarshal,pickleиjson; разбор литералов чисел с плавающей запятой и мнимых чисел в коде Python; и преобразованиеDecimalв число с плавающей запятой.В связи с этим,
repr()числа с плавающей запятой x теперь возвращает результат на основе кратчайшей десятичной строки, которая гарантированно округляется обратно к x при правильном округлении (с режимом округления «банковское округление»). Ранее возвращалась строка, основанная на округлении x до 17 десятичных цифр.Библиотека округления, отвечающая за это улучшение, работает на Windows и Unix-платформах с компиляторами gcc, icc или suncc. Может быть небольшое количество платформ, на которых корректная работа этого кода не гарантируется, поэтому код не используется на таких системах. Узнать, какой код используется, можно, проверив
sys.float_repr_style, – он будет равенshort, если используется новый код, иlegacy, если нет.Реализовано Эриком Смитом и Марком Дикинсоном с использованием библиотеки
dtoa.cДэвида Гея; bpo-7117.Преобразования длинных целых и обычных целых чисел в числа с плавающей запятой теперь округляются иначе, возвращая число с плавающей запятой, ближайшее к числу. Это несущественно для маленьких целых чисел, которые могут быть преобразованы точно, но для больших чисел, которые неизбежно теряют точность, Python 2.7 теперь аппроксимирует более точно. Например, Python 2.6 вычислял следующее:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Результат с плавающей запятой в Python 2.7 больше, но гораздо ближе к истинному значению:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(Реализовано Марком Дикинсоном; bpo-3166.)
Целочисленное деление также стало более точным в своём поведении округления. (Также реализовано Марком Дикинсоном; bpo-1811.)
Неявное приведение для комплексных чисел было удалено; интерпретатор больше никогда не будет пытаться вызывать метод
__coerce__()для комплексных объектов. (Удалено Мидором Инге и Марком Дикинсоном; bpo-5211.)Метод
str.format()теперь поддерживает автоматическую нумерацию полей замены. Это делает использованиеstr.format()более похожим на использование форматирования%s:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
Автонумерация берёт поля слева направо, поэтому первый спецификатор
{...}будет использовать первый аргумент дляstr.format(), следующий спецификатор – следующий аргумент и так далее. Нельзя смешивать автонумерацию и явную нумерацию – либо нумеруйте все поля спецификаторов, либо ни одного, – но можно смешивать автонумерацию и именованные поля, как во втором примере выше. (Добавлено Эриком Смитом; bpo-5237.)Комплексные числа теперь правильно поддерживают использование с
format()и по умолчанию выравниваются вправо. Указание точности или разделения запятыми применяется как к действительной, так и к мнимой части числа, но указанная ширина поля и выравнивание применяются ко всему результирующему выводу1.5+3j. (Добавлено Эриком Смитом; bpo-1588 и bpo-7988.)Код форматирования ‘F’ теперь всегда форматирует вывод заглавными символами, поэтому теперь он будет выдавать ‘INF’ и ‘NAN’. (Добавлено Эриком Смитом; bpo-3382.)
Низкоуровневое изменение: метод
object.__format__()теперь вызываетPendingDeprecationWarning, если ему передаётся строка формата, потому что метод__format__()дляobjectпреобразует объект в строковое представление и форматирует его. Ранее метод молча применял строку формата к строковому представлению, но это могло скрывать ошибки в коде Python. Если вы передаёте информацию о форматировании, например выравнивание или точность, то, вероятно, ожидаете, что форматирование будет применено специфичным для объекта способом. (Исправлено Эриком Смитом; bpo-7994.)Типы
int()иlong()получили методbit_length, который возвращает количество битов, необходимое для представления своего аргумента в двоичном виде:>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(Добавлено Фредриком Юханссоном и Виктором Стиннером; bpo-3439.)
Оператор
importбольше не будет пытаться выполнить абсолютный импорт, если относительный импорт (например,from .os import sep) завершится неудачей. Это исправляет ошибку, но может нарушить работу некоторых операторовimport, которые работали только случайно. (Исправлено Meador Inge; bpo-7902.)Теперь подкласс встроенного типа
unicodeможет переопределить метод__unicode__(). (Реализовано Victor Stinner; bpo-1583863.)Метод
translate()типаbytearrayтеперь принимаетNoneв качестве первого аргумента. (Исправлено Georg Brandl; bpo-4759.)При использовании
@classmethodи@staticmethodдля оборачивания методов как методов класса или статических методов, объект-обёртка теперь предоставляет обёрнутую функцию в своём атрибуте__func__. (Предложено Amaury Forgeot d’Arc после предложения George Sakkis; bpo-5982.)Когда ограниченный набор атрибутов задавался с помощью
__slots__, удаление незаданного атрибута не вызывалоAttributeError, как можно было бы ожидать. Исправлено Benjamin Peterson; bpo-7604.)Теперь поддерживаются две новые кодировки: «cp720», используемая в основном для арабского текста; и «cp858», вариант CP 850, добавляющий символ евро. (CP720 добавлена Alexander Belchenko и Amaury Forgeot d’Arc в bpo-1616979; CP858 добавлена Tim Hatch в bpo-8016.)
Объект
fileтеперь устанавливает атрибутfilenameв исключенииIOErrorпри попытке открыть каталог на платформах POSIX (отмечено Jan Kaliszewski; bpo-4764), и теперь явно проверяет и запрещает запись в объекты файлов, доступные только для чтения, вместо того чтобы полагаться на библиотеку C для перехвата и сообщения об ошибке (исправлено Stefan Krah; bpo-5677).Токенизатор Python теперь сам преобразует концы строк, поэтому встроенная функция
compile()теперь принимает код, использующий любые соглашения о концах строк. Кроме того, больше не требуется, чтобы код заканчивался символом новой строки.Лишние скобки в определениях функций недопустимы в Python 3.x, что приводит к синтаксической ошибке
def f((x)): pass. В режиме предупреждений Python 3 (Python3-warning mode) Python 2.7 теперь будет предупреждать о таком странном использовании. (Отмечено James Lingard; bpo-7362.)Теперь можно создавать слабые ссылки на объекты классов старого стиля. Классы нового стиля всегда поддерживали слабые ссылки. (Исправлено Antoine Pitrou; bpo-8268.)
Когда объект модуля удаляется сборщиком мусора, словарь модуля теперь очищается только в том случае, если никто другой не держит ссылку на этот словарь (bpo-7140).
Изменения в интерпретаторе¶Interpreter Changes
Новая переменная окружения PYTHONWARNINGS позволяет управлять предупреждениями. Её следует установить в строку, содержащую настройки предупреждений, эквивалентные тем, что используются с ключом -W, разделённые запятыми. (Предложено Brian Curtin; bpo-7301.)
Например, следующая настройка будет выводить предупреждения каждый раз, когда они возникают, но превращать предупреждения из модуля Cookie в ошибку. (Точный синтаксис установки переменной окружения различается в разных операционных системах и оболочках.)
export PYTHONWARNINGS=all,error:::Cookie:0
Оптимизации¶Optimizations
Было добавлено несколько улучшений производительности:
Добавлен новый опкод для выполнения начальной настройки операторов
with, выполняющий поиск методов__enter__()и__exit__(). (Предложено Benjamin Peterson.)Сборщик мусора теперь работает лучше для одного распространённого шаблона использования: когда много объектов выделяется без освобождения каких-либо из них. Раньше это приводило к квадратичному времени сборки мусора, но теперь количество полных сборок мусора уменьшается по мере роста числа объектов в куче. Новая логика выполняет полный проход сборки мусора только тогда, когда среднее поколение было собрано 10 раз и когда количество выживших объектов из среднего поколения превышает 10% от количества объектов в старейшем поколении. (Предложено Martin von Löwis и реализовано Antoine Pitrou; bpo-4074.)
Сборщик мусора старается избегать отслеживания простых контейнеров, которые не могут быть частью цикла. В Python 2.7 это верно для кортежей и словарей, содержащих атомарные типы (например, целые числа, строки и т.д.). По транзитивности, словарь, содержащий кортежи атомарных типов, также не будет отслеживаться. Это помогает снизить затраты на каждую сборку мусора за счёт уменьшения количества объектов, которые необходимо рассматривать и обходить сборщику. (Предложено Antoine Pitrou; bpo-4688.)
Длинные целые числа теперь хранятся внутри в системе счисления по основанию
2**15или2**30, причём основание определяется во время сборки. Ранее они всегда хранились по основанию2**15. Использование основания2**30даёт значительное улучшение производительности на 64-битных машинах, но результаты тестов на 32-битных машинах были неоднозначными. Поэтому по умолчанию на 64-битных машинах используется основание2**30, а на 32-битных – основание2**15; в Unix есть новая опция конфигурации--enable-big-digits, которую можно использовать для переопределения этого значения по умолчанию.Помимо улучшений производительности, это изменение должно быть незаметно для конечных пользователей, за одним исключением: для целей тестирования и отладки появилась новая structseq
sys.long_info, которая предоставляет информацию о внутреннем формате, указывая количество бит на цифру и размер в байтах типа C, используемого для хранения каждой цифры:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Автор: Mark Dickinson; bpo-4258.)
Ещё один набор изменений сделал длинные объекты на несколько байт меньше: на 2 байта меньше на 32-битных системах и на 6 байт на 64-битных. (Предложено Mark Dickinson; bpo-5260.)
Алгоритм деления для длинных целых чисел был ускорен за счёт оптимизации внутреннего цикла, использования сдвигов вместо умножений и исправления лишней итерации. Различные тесты показывают ускорение от 50% до 150% для операций деления и взятия остатка от длинных целых чисел. (Предложено Mark Dickinson; bpo-5512.) Побитовые операции также стали значительно быстрее (начальный патч от Gregory Smith; bpo-1087418).
Реализация
%проверяет, является ли левый операнд строкой Python, и обрабатывает этот случай отдельно; это даёт прирост производительности на 1–3% для приложений, которые часто используют%со строками, например, библиотеки шаблонов. (Реализовано Collin Winter; bpo-5176.)Списковые включения с условием
ifкомпилируются в более быстрый байт-код. (Патч от Antoine Pitrou, портирован в 2.7 Jeffrey Yasskin; bpo-4715.)Преобразование целого числа или длинного целого числа в десятичную строку было ускорено за счёт выделения отдельного случая для основания 10 вместо использования обобщённой функции преобразования, поддерживающей произвольные основания. (Патч от Gawain Bolton; bpo-6713.)
Методы
split(),replace(),rindex(),rpartition()иrsplit()строкоподобных типов (строки, строки Unicode и объектыbytearray) теперь используют быстрый алгоритм обратного поиска вместо посимвольного сканирования. Это иногда быстрее в 10 раз. (Добавлено Florent Xicluna; bpo-7462 и bpo-7622.)Модули
pickleиcPickleтеперь автоматически интернируют строки, используемые для имён атрибутов, уменьшая использование памяти объектами, полученными в результате распаковки (unpickling). (Предложено Jake McGuire; bpo-5084.)Модуль
cPickleтеперь обрабатывает словари отдельно, сокращая почти вдвое время, необходимое для их сериализации (pickle). (Предложено Collin Winter; bpo-5670.)
Новые и улучшенные модули¶New and Improved Modules
Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее заметных изменений, отсортированный по имени модуля в алфавитном порядке. Обратитесь к файлу Misc/NEWS в дереве исходного кода для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.
Базовый отладочный класс
Bdbмодуляbdbполучил возможность пропускать модули. Теперь конструктор принимает итерируемый объект, содержащий glob-шаблоны, напримерdjango.*; отладчик не будет заходить в стековые кадры модуля, соответствующего одному из таких шаблонов. (Предложено Maru Newby по идее Senthil Kumaran; bpo-5142.)Модуль
binasciiтеперь поддерживает буферный API, поэтому его можно использовать с экземплярамиmemoryviewи другими подобными буферными объектами. (Перенесено из 3.x Florent Xicluna; bpo-7703.)Обновлён модуль: модуль
bsddbобновлён с версии 4.7.2devel9 до версии 4.8.4 пакета pybsddb. Новая версия обеспечивает лучшую совместимость с Python 3.x, различные исправления ошибок и добавляет несколько новых флагов и методов BerkeleyDB. (Обновлено Хесусом Сеа Авионом; bpo-8156. Журнал изменений pybsddb можно прочитать по адресу http://hg.jcea.es/pybsddb/file/tip/ChangeLog.)Метод
BZ2Fileмодуляbz2теперь поддерживает протокол управления контекстом, так что можно писатьwith bz2.BZ2File(...) as f:. (Предложено Hagen Fürstenau; bpo-3860.)Новый класс: класс
Counterв модулеcollectionsполезен для подсчёта данных. ЭкземплярыCounterведут себя в основном как словари, но возвращают ноль для отсутствующих ключей вместо возбуждения исключенияKeyError:>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
Есть три дополнительных метода
Counter.most_common()возвращает N наиболее часто встречающихся элементов и их количество.elements()возвращает итератор по содержащимся элементам, повторяя каждый элемент столько раз, каково его количество.subtract()принимает итерируемый объект и вычитает единицу для каждого элемента вместо добавления; если аргумент – словарь или другой объектCounter, количества вычитаются.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Счётчик теперь меньше -1
Предложено Raymond Hettinger; bpo-1696199.
Новый класс:
OrderedDictописан в предыдущем разделе PEP 372: Adding an Ordered Dictionary to collections.Новый метод: тип данных
dequeтеперь имеет методcount(), который возвращает количество содержащихся элементов, равных переданному аргументу x, и методreverse(), который обращает порядок элементов дека на месте.dequeтакже предоставляет свою максимальную длину как атрибутmaxlenтолько для чтения. (Обе возможности добавлены Raymond Hettinger.)Класс
namedtupleтеперь имеет необязательный параметр rename. Если rename равно true, имена полей, которые недопустимы из-за повторения или не являются допустимыми идентификаторами Python, будут переименованы в допустимые имена, образованные от позиции поля в списке полей:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(Добавлено Raymond Hettinger; bpo-1818.)
Наконец, абстрактный базовый класс
Mappingтеперь возвращаетNotImplemented, если отображение сравнивается с другим типом, не являющимсяMapping. (Исправлено Daniel Stutzbach; bpo-8729.)Конструкторы классов разбора в модуле
ConfigParserтеперь принимают параметр allow_no_value, по умолчанию false; если true, опции без значений будут разрешены. Например:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(Предложено Mats Kindahl; bpo-7005.)
Устаревшая функция:
contextlib.nested(), которая позволяла обрабатывать несколько менеджеров контекста одним операторомwith, устарела, поскольку операторwithтеперь поддерживает несколько менеджеров контекста.Модуль
cookielibтеперь игнорирует куки с недопустимым полем версии, не содержащим целочисленного значения. (Исправлено John J. Lee; bpo-3924.)Функция
deepcopy()модуляcopyтеперь корректно копирует связанные методы экземпляров. (Реализовано Robert Collins; bpo-1515.)Модуль
ctypesтеперь всегда преобразуетNoneв указатель CNULLдля аргументов, объявленных как указатели. (Изменено Thomas Heller; bpo-4606.) Базовая библиотека libffi обновлена до версии 3.0.9, содержащей различные исправления для разных платформ. (Обновлено Matthias Klose; bpo-8142.)Новый метод: класс
timedeltaмодуляdatetimeполучил методtotal_seconds(), возвращающий количество секунд длительности. (Предложено Brian Quinlan; bpo-5788.)Новый метод: класс
Decimalполучил метод классаfrom_float(), выполняющий точное преобразование числа с плавающей запятой вDecimal. Это точное преобразование стремится к ближайшему десятичному приближению к значению представления с плавающей запятой; поэтому результирующее десятичное значение всё равно будет содержать неточность, если таковая имеется. Например,Decimal.from_float(0.1)возвращаетDecimal('0.1000000000000000055511151231257827021181583404541015625'). (Реализовано Raymond Hettinger; bpo-4796.)Сравнение экземпляров
Decimalс числами с плавающей запятой теперь даёт разумные результаты, основанные на числовых значениях операндов. Ранее такие сравнения использовали стандартные правила Python для сравнения объектов, которые приводили к произвольным результатам, зависящим от их типа. Обратите внимание, что по-прежнему нельзя комбинироватьDecimalи числа с плавающей запятой в других операциях, таких как сложение, поскольку необходимо явно выбирать способ преобразования между float иDecimal. (Исправлено Марком Дикинсоном; bpo-2531.)Конструктор
Decimalтеперь принимает числа с плавающей запятой (добавлено Raymond Hettinger; bpo-8257) и неевропейские символы Unicode, такие как арабо-индийские цифры (предложено Mark Dickinson; bpo-6595).Большинство методов класса
Contextтеперь принимают как целые числа, так и экземплярыDecimal; единственные исключения – методыcanonical()иis_canonical(). (Патч от Juan José Conti; bpo-7633.)При использовании экземпляров
Decimalс методомformat()строки выравнивание по умолчанию ранее было левосторонним. Оно изменено на правостороннее, что более разумно для числовых типов. (Изменено Mark Dickinson; bpo-6857.)Сравнения с участием сигнального NaN (или
sNAN) теперь сигнализируютInvalidOperationвместо того, чтобы молча возвращать истинное или ложное значение в зависимости от оператора сравнения. Тихие NaN (илиNaN) теперь являются хешируемыми. (Исправлено Mark Dickinson; bpo-7279.)Модуль
difflibтеперь генерирует вывод, более совместимый с современными инструментами diff/patch, благодаря одному небольшому изменению: в заголовке с именем файла в качестве разделителя используется символ табуляции вместо пробелов. (Исправлено Anatoly Techtonik; bpo-7585.)Команда
sdistDistutils теперь всегда заново генерирует файлMANIFEST, поскольку даже если файлыMANIFEST.inилиsetup.pyне были изменены, пользователь мог создать новые файлы, которые следует включить. (Исправлено Tarek Ziadé; bpo-8688.)Флаг
IGNORE_EXCEPTION_DETAILмодуляdoctestтеперь будет игнорировать имя модуля, содержащего тестируемое исключение. (Патч от Lennart Regebro; bpo-7490.)Класс
Messageмодуляemailтеперь принимает полезную нагрузку в виде Unicode, автоматически преобразуя её в кодировку, указаннуюoutput_charset. (Добавлено R. David Murray; bpo-1368247.)Класс
Fractionтеперь принимает в качестве аргументов конструктора один экземпляр float илиDecimal, либо два рациональных числа. (Реализовано Mark Dickinson; рациональные числа добавлены в bpo-5812, float/decimal – в bpo-8294.)Операции упорядочивания (
<,<=,>,>=) между дробями и комплексными числами теперь возбуждают исключениеTypeError. Это исправляет упущение, приводя поведениеFractionв соответствие с другими числовыми типами.Новый класс:
FTP_TLSв модулеftplibобеспечивает безопасные FTP-соединения с использованием TLS-инкапсуляции как для аутентификации, так и для последующих передач управления и данных. (Предложено Giampaolo Rodola; bpo-2054.)Метод
storbinary()для двоичной загрузки теперь может перезапускать загрузки благодаря добавленному параметру rest (исправление Пабло Моусо; bpo-6845.)Новый декоратор класса:
total_ordering()в модулеfunctoolsпринимает класс, определяющий метод__eq__()и один из__lt__(),__le__(),__gt__()или__ge__(), и генерирует недостающие методы сравнения. Поскольку метод__cmp__()помечен как устаревший в Python 3.x, этот декоратор упрощает определение упорядоченных классов. (Добавлено Рэймондом Хеттинджером; bpo-5479.)Новая функция:
cmp_to_key()принимает старую функцию сравнения, ожидающую два аргумента, и возвращает новый вызываемый объект, который можно использовать как параметр key для таких функций, какsorted(),min()иmax()и т. д. Основное предназначение – упростить адаптацию кода для совместимости с Python 3.x. (Добавлено Рэймондом Хеттинджером.)Новая функция:
is_tracked()модуляgcвозвращает истину, если заданный экземпляр отслеживается сборщиком мусора, и ложь в противном случае. (Предложено Антуаном Питу; bpo-4688.)GzipFileмодуляgzipтеперь поддерживает протокол менеджера контекста, поэтому можно писатьwith gzip.GzipFile(...) as f:(предложено Хагеном Фюрстенау; bpo-3860), а также реализует абстрактный базовый классio.BufferedIOBase, так что его можно обернуть с помощьюio.BufferedReaderдля ускорения обработки (предложено Ниром Айдесом; bpo-7471). Кроме того, теперь можно переопределить время изменения, записанное в gzip-файле, передав необязательную метку времени в конструктор. (Предложено Жаком Фреше; bpo-4272.)Файлы в формате gzip могут дополняться завершающими нулевыми байтами; модуль
gzipтеперь будет учитывать эти завершающие байты. (Исправлено Тадеком Петрашеком и Брайаном Кертином; bpo-2846.)Новый атрибут: модуль
hashlibтеперь имеет атрибутalgorithms, содержащий кортеж с перечнем поддерживаемых алгоритмов. В Python 2.7hashlib.algorithmsсодержит('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Предложено Карлом Шене; bpo-7418.)Класс
HTTPResponse, используемый по умолчанию в модулеhttplib, теперь поддерживает буферизацию, что значительно ускоряет чтение HTTP-ответов. (Предложено Кристьяном Валюром Йонссоном; bpo-4879.)Классы
HTTPConnectionиHTTPSConnectionтеперь поддерживают параметр source_address – кортеж(host, port)из двух элементов, задающий исходный адрес для соединения. (Предложено Элдоном Зиглером; bpo-3972.)Модуль
ihooksтеперь поддерживает относительные импорты. Обратите внимание, чтоihooks– более старый модуль для настройки импортов, заменённый модулемimputil, добавленным в Python 2.0. (Поддержка относительных импортов добавлена Нилом Шеменауэром.)Модуль
imaplibтеперь поддерживает IPv6-адреса. (Предложено Дереком Морром; bpo-1655.)Новая функция:
getcallargs()модуляinspectпринимает вызываемый объект и его позиционные и именованные аргументы, определяет, какой параметр вызываемого объекта получит каждый аргумент, и возвращает словарь, отображающий имена аргументов в их значения. Например:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Предложено Джорджем Саккисом; bpo-3135.
Обновлённый модуль: библиотека
ioобновлена до версии, поставляемой с Python 3.1. Для 3.1 библиотека ввода-вывода была полностью переписана на C и работает в 2–20 раз быстрее в зависимости от выполняемой задачи. Исходная версия на Python переименована в модуль_pyio.Одно небольшое изменение: класс
io.TextIOBaseтеперь имеет атрибутerrors, задающий режим обработки ошибок кодирования и декодирования (одно из значений:'strict','replace','ignore').Класс
io.FileIOтеперь вызывает исключениеOSErrorпри передаче некорректного файлового дескриптора. (Реализовано Бенджамином Петерсоном; bpo-4991.) Методtruncate()теперь сохраняет позицию в файле; ранее он изменял позицию на конец нового файла. (Исправлено Паскалем Шамбоном; bpo-6939.)Новая функция:
itertools.compress(data, selectors)принимает два итератора. Элементы из data возвращаются, если соответствующее значение в selectors истинно:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
Новая функция:
itertools.combinations_with_replacement(iter, r)возвращает все возможные сочетания элементов из итерабельного объекта iter длины r. В отличие отcombinations(), отдельные элементы могут повторяться в генерируемых сочетаниях:itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
Обратите внимание: элементы считаются уникальными в зависимости от их позиции во входных данных, а не от фактических значений.
Функция
itertools.count()теперь имеет аргумент step, который позволяет увеличивать не только на 1.count()теперь tакже принимает именованные аргументы и нецелые значения, такие как числа с плавающей точкой или экземплярыDecimal. (Реализовано Рэймондом Хеттинджером; bpo-5032.)itertools.combinations()иitertools.product()ранее вызывалиValueErrorдля значений r, превышающих dлину входного итерабельного объекта. Это было признано ошибкой спецификации, поэтому теперь они возвращают пустой итератор. (Исправлено Рэймондом Хеттинджером; bpo-4816.)Обновлённый модуль: модуль
jsonобновлён до версии 2.0.9 пакета simplejson, которая включает расширение на C, ускоряющее кодирование и декодирование. (Предложено Бобом Ипполито; bpo-4136.)Для поддержки нового типа
collections.OrderedDictвjson.load()теперь добавлен необязательный параметр object_pairs_hook, который будет вызываться с любым литералом объекта, декодируемым в список пар. (Предложено Рэймондом Хеттинджером; bpo-5381.)Класс
Maildirмодуляmailboxтеперь запоминает временную метку прочитанных каталогов и повторно читает их только в том случае, если время изменения впоследствии изменилось. Это улучшает производительность за счёт отказа от ненужного сканирования каталогов. (Исправлено А. М. Куклингом и Антуаном Питу; bpo-1607951, bpo-6896.)Новые функции: модуль
mathпополнился функциямиerf()(функция ошибок) иerfc()(дополнительная функция ошибок),expm1(), которая вычисляетe**x - 1с большей точностью, чем использованиеexp()с вычитанием 1,gamma()(гамма-функция) иlgamma()(натуральный логарифм гамма-функции). (Предложено Марком Дикинсоном и nirinA raseliarison; bpo-3366.)Классам
Manager*модуляmultiprocessingтеперь можно передавать вызываемый объект, который будет вызываться при каждом запуске подпроцесса, вместе с набором аргументов, передаваемых этому вызываемому объекту. (Предложено lekma; bpo-5585.)Класс
Pool, управляющий пулом рабочих процессов, теперь имеет необязательный параметр maxtasksperchild. Рабочие процессы будут выполнять указанное количество задач, а затем завершаться, что приведёт к запуску нового рабочего процесса вPool. Это полезно, если задачи могут приводить к утечке памяти или других ресурсов, или если некоторые задачи могут значительно увеличить размер рабочего процесса. (Предложено Чарльзом Казабоном; bpo-6963.)Модуль
nntplibтеперь поддерживает IPv6-адреса. (Предложено Дереком Морром; bpo-1664.)Новые функции: модуль
osоборачивает следующие системные вызовы POSIX:getresgid()иgetresuid(), которые возвращают реальные, эффективные и сохранённые GID и UID;setresgid()иsetresuid(), которые устанавливают реальные, эффективные и сохранённые GID и UID в новые значения;initgroups(), которая инициализирует список группового доступа для текущего процесса. (Функции GID/UID предложены Travis H.; bpo-6508. Поддержка initgroups добавлена Жан-Полем Калдероном; bpo-7333.)Функция
os.fork()теперь повторно инициализирует блокировку импорта в дочернем процессе; это устраняет проблемы на Solaris, когдаfork()вызывается из потока. (Исправлено Жольтом Черна; bpo-7242.)В модуле
os.pathфункцииnormpath()иabspath()теперь сохраняют Unicode; если входной путь является строкой Unicode, возвращаемое значение также является строкой Unicode. (normpath()исправлено Мэттом Джукой в bpo-5827;abspath()исправлено Эцио Мелотти в bpo-3426.)Модуль
pydocтеперь содержит справку по различным символам, используемым в Python. Теперь можно, например, выполнитьhelp('<<')илиhelp('@'). (Предложено Дэвидом Лабаном; bpo-4739.)Функции
split(),sub()иsubn()модуляreтеперь принимают необязательный аргумент flags для согласованности с другими функциями модуля. (Добавлено Грегори П. Смитом.)Новая функция:
run_path()из модуляrunpyвыполняет код по указанному пути path. Аргумент path может быть путём к исходному файлу Python (example.py), скомпилированному байт-коду (example.pyc), каталогу (./package/) или zip-архиву (example.zip). Если указан каталог или zip, он добавляется в началоsys.path, и импортируется модуль__main__. Ожидается, что каталог или zip содержит__main__.py; если нет, то из более поздних позиций вsys.pathможет быть импортирован другой__main__.py. Это предоставляет больше возможностей механизмаrunpyсценариям, которые хотят имитировать обработку явного имени пути командной строкой Python. (Добавлено Ником Коглан; bpo-6816.)Новая функция: в модуле
shutil,make_archive()принимает имя файла, тип архива (zip или tar) и путь к каталогу, и создаёт архив, содержащий содержимое каталога. (Добавлено Тареком Зиаде.)Функции
copyfile()иcopytree()изshutilтеперь вызывают исключениеSpecialFileErrorпри попытке скопировать именованный канал. Раньше код обрабатывал именованные каналы как обычные файлы, открывая их для чтения, и это приводило к бесконечному блокированию. (Исправлено Антуаном Питру; bpo-3002.)Модуль
signalбольше не переустанавливает обработчик сигналов без крайней необходимости, что устраняет ошибку, из-за которой было невозможно надёжно перехватить сигнал EINTR. (Исправлено Шарлем-Франсуа Натали; bpo-8354.)Новые функции: в модуле
siteтри новые функции возвращают различные пути, специфичные для сайта и пользователя.getsitepackages()возвращает список, содержащий все глобальные каталоги site-packages,getusersitepackages()возвращает путь к каталогу site-packages пользователя, аgetuserbase()возвращает значение переменной окруженияUSER_BASE, указывающее путь к каталогу, который можно использовать для хранения данных. (Предложено Tarek Ziadé; bpo-6693.)Модуль
siteтеперь сообщает об исключениях, возникающих при импорте модуляsitecustomize, и больше не перехватывает и не проглатывает исключениеKeyboardInterrupt. (Исправлено Виктором Стиннером; bpo-3137.)Функция
create_connection()получила параметр source_address – кортеж из 2 элементов(host, port), задающий исходный адрес для соединения. (Автор: Элдон Зиглер; bpo-3972.)Методы
recv_into()иrecvfrom_into()теперь выполняют запись в объекты, поддерживающие буферный API, в частности в объектыbytearrayиmemoryview. (Реализовано Антуаном Питру; bpo-8104.)Класс
TCPServerмодуляSocketServerтеперь поддерживает тайм-ауты сокетов и отключение алгоритма Нейгла. Атрибут классаdisable_nagle_algorithmпо умолчанию равенFalse; если установить его в true, для новых входящих соединений будет установлен параметр TCP_NODELAY, предотвращающий буферизацию множества мелких отправок в один TCP-пакет. Атрибут классаtimeoutможет содержать тайм-аут в секундах, применяемый к сокету запроса; если в течение этого времени запрос не получен, будет вызванhandle_timeout()иhandle_request()вернёт управление. (Автор: Кристьян Валур Йонссон; bpo-6192 и bpo-6267.)Обновлён модуль: модуль
sqlite3обновлён до версии 2.6.0 пакета pysqlite. Версия 2.6.0 содержит ряд исправлений ошибок и добавляет возможность загружать расширения SQLite из разделяемых библиотек. Вызовите методenable_load_extension(True)для включения расширений, затемload_extension()для загрузки конкретной разделяемой библиотеки. (Обновлено Герхардом Херингом.)Объекты
SSLSocketмодуляsslтеперь поддерживают буферный API, что исправило сбой в наборе тестов (исправление Антуана Питру; bpo-7133) и автоматически устанавливает параметр OpenSSLSSL_MODE_AUTO_RETRY, предотвращающий возврат кода ошибки из операцийrecv(), которые инициируют пересмотр SSL (исправление Антуана Питру; bpo-8222).Функция-конструктор
ssl.wrap_socket()теперь принимает аргумент ciphers – строку с перечнем разрешённых алгоритмов шифрования; формат строки описан в документации OpenSSL. (Добавлено Антуаном Питру; bpo-8322.)Ещё одно изменение заставляет расширение загружать все шифры и алгоритмы дайджестов OpenSSL, так что все они становятся доступны. Ранее некоторые SSL-сертификаты не удавалось проверить, выдавалась ошибка «неизвестный алгоритм». (Сообщено Бедой Косатой, исправлено Антуаном Питру; bpo-8484.)
Версия используемого OpenSSL теперь доступна в виде атрибутов модуля:
ssl.OPENSSL_VERSION(строка),ssl.OPENSSL_VERSION_INFO(кортеж из 5 элементов) иssl.OPENSSL_VERSION_NUMBER(целое число). (Добавлено Антуаном Питру; bpo-8321.)Модуль
structбольше не будет молча игнорировать ошибки переполнения, когда значение слишком велико для определённого кода целочисленного формата (один изbBhHiIlLqQ); теперь он всегда возбуждает исключениеstruct.error. (Изменено Марком Дикинсоном; bpo-1523.) Функцияpack()также будет пытаться использовать__index__()для преобразования и упаковки нецелых чисел перед тем, как пробовать метод__int__()или сообщать об ошибке. (Изменено Марком Дикинсоном; bpo-8300.)Новая функция:
check_output()модуляsubprocessзапускает команду с указанным набором аргументов и возвращает вывод команды в виде строки, если команда завершилась без ошибки; в противном случае возбуждает исключениеCalledProcessError.>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(Автор: Грегори П. Смит.)
Модуль
subprocessтеперь будет повторять свои внутренние системные вызовы при получении сигналаEINTR. (Сообщено несколькими людьми; окончательный патч от Грегори П. Смита в bpo-1068268.)Новая функция:
is_declared_global()в модулеsymtableвозвращает true для переменных, явно объявленных глобальными, и false для неявно глобальных. (Автор: Джереми Хилтон.)Модуль
syslogтеперь будет использовать значениеsys.argv[0]в качестве идентификатора вместо предыдущего значения по умолчанию'python'. (Изменено Sean Reifschneider; bpo-8451.)Значение
sys.version_infoтеперь является именованным кортежем с атрибутамиmajor,minor,micro,releaselevelиserial. (Автор: Росс Лайт; bpo-4285.)sys.getwindowsversion()также возвращает именованный кортеж с атрибутамиmajor,minor,build,platform,service_pack,service_pack_major,service_pack_minor,suite_maskиproduct_type. (Автор: Брайан Кёртин; bpo-7766.)Обработка ошибок по умолчанию в модуле
tarfileизменилась: теперь она не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был 0, что означало, что ошибки только записывались в отладочный журнал, но, поскольку отладочный журнал не активирован по умолчанию, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию – 1, что вызывает исключение при любой ошибке. (Изменено Lars Gustäbel; bpo-7357.)tarfileтеперь поддерживает фильтрацию объектовTarInfo, добавляемых в tar-файл. При вызовеadd()можно указать необязательный аргумент filter – вызываемый объект. Этот вызываемый объект filter будет получатьTarInfoдля каждого добавляемого файла и может модифицировать его и вернуть. Если вызываемый объект возвращаетNone, файл будет исключён из результирующего архива. Это более мощный механизм, чем существующий аргумент exclude, который поэтому считается устаревшим. (Добавлено Ларсом Густабелем; bpo-6856.) КлассTarFileтакже теперь поддерживает протокол менеджера контекста. (Добавлено Ларсом Густабелем; bpo-7232.)Метод
wait()классаthreading.Eventтеперь по выходу возвращает внутренний флаг. Это означает, что метод обычно возвращает true, так какwait()должен блокироваться, пока внутренний флаг не станет true. Возвращаемое значение будет false только если был указан тайм-аут и операция превысила его. (Автор: Тим Лешер; bpo-1674032.)База данных Unicode, предоставляемая модулем
unicodedata, теперь используется внутри для определения, какие символы являются цифрами, пробельными или обозначают разрывы строк. База данных также включает информацию из файла данныхUnihan.txt(патч Андерса Кригстрёма и Амори Форжо д’Арка; bpo-1571184) и обновлена до версии 5.2.0 (обновлено Флораном Ксиклуна; bpo-8024).Метод
urlsplit()модуляurlparseтеперь обрабатывает неизвестные URL-схемы в соответствии с RFC 3986: если URL имеет форму"<something>://...", текст перед://рассматривается как схема, даже если это вымышленная схема, неизвестная модулю. Это изменение может нарушить код, который обходил старое поведение. Например, Python 2.6.4 или 2.5 вернёт следующее:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (и Python 2.6.5) вернёт:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 на самом деле выдаёт немного другой вывод, поскольку он возвращает именованный кортеж вместо стандартного кортежа.)
Модуль
urlparseтакже поддерживает буквенные IPv6-адреса, определённые в RFC 2732 (автор: Сентил Кумаран; bpo-2987).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
Новый класс: класс
WeakSetв модулеweakrefпредставляет собой множество, которое хранит только слабые ссылки на свои элементы; элементы удаляются, когда на них не остаётся ссылок. (Изначально реализован в Python 3.x Рэймондом Хеттингером, портирован в 2.7 Майклом Фордом.)Библиотека ElementTree,
xml.etree, больше не экранирует амперсанды и угловые скобки при выводе инструкции обработки XML (которая выглядит как<?xml-stylesheet href="#style1"?>) или комментария (который выглядит как<!-- comment -->). (Патч от Neil Muller; bpo-2746.)Клиент и сервер XML-RPC, предоставляемые модулями
xmlrpclibиSimpleXMLRPCServer, повысили производительность за счёт поддержки HTTP/1.1 keep-alive и опционального использования gzip-сжатия для сжимания передаваемого XML. Сжатие gzip управляется атрибутомencode_thresholdобъектаSimpleXMLRPCRequestHandler, который содержит размер в байтах; ответы больше этого размера будут сжаты. (Предоставлено Kristján Valur Jónsson; bpo-6267.)ZipFileмодуляzipfileтеперь поддерживает протокол управления контекстом, поэтому можно писатьwith zipfile.ZipFile(...) as f:. (Предоставлено Brian Curtin; bpo-5511.)zipfileтеперь также поддерживает архивирование пустых каталогов и корректно извлекает их. (Исправлено Kuba Wieczorek; bpo-4710.) Чтение файлов из архива стало быстрее, и чередованиеread()иreadline()теперь работает корректно. (Предложено Nir Aides; bpo-7610.)Функция
is_zipfile()теперь принимает файловый объект, помимо путей, которые принимались в более ранних версиях. (Предоставлено Gabriel Genellina; bpo-4756.)Метод
writestr()теперь имеет необязательный параметр compress_type, позволяющий переопределить метод сжатия по умолчанию, заданный в конструктореZipFile. (Предоставлено Ronald Oussoren; bpo-6003.)
Новый модуль: importlib¶New module: importlib
Python 3.1 включает пакет importlib, повторную реализацию
логики, лежащей в основе оператора import Python.
importlib полезен для разработчиков интерпретаторов Python и
для пользователей, желающих написать новые импортёры, способные участвовать в
процессе импорта. Python 2.7 не содержит полный пакет
importlib, а вместо этого имеет крошечное подмножество, содержащее
единственную функцию import_module().
import_module(name, package=None) импортирует модуль. name – это строка, содержащая имя модуля или пакета. Можно выполнять относительный импорт, передав строку, начинающуюся с символа ., например ..utils.errors. Для относительного импорта необходимо указать аргумент package – имя пакета, который будет использоваться как точка привязки для относительного импорта. import_module() как вставляет импортированный модуль в sys.modules, так и возвращает объект модуля.
Вот несколько примеров:
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Стандартный абсолютный импорт
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Относительный импорт
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib был реализован Brett Cannon и представлен в Python 3.1.
Новый модуль: sysconfig¶New module: sysconfig
Модуль sysconfig был выделен из пакета Distutils и стал новым самостоятельным модулем верхнего уровня. sysconfig предоставляет функции для получения информации о процессе сборки Python: параметры компилятора, пути установки, имя платформы и то, запущен ли Python из его исходного каталога.
Некоторые функции модуля:
get_config_var()возвращает переменные из Makefile Python и файлаpyconfig.h.get_config_vars()возвращает словарь, содержащий все переменные конфигурации.get_path()возвращает настроенный путь для определённого типа модулей: стандартная библиотека, сайт-специфичные модули, платформо-специфичные модули и т.д.is_python_build()возвращает true, если исполняемый файл запущен из дерева исходных кодов Python, и false в противном случае.
Обратитесь к документации sysconfig за более подробной информацией и полным списком функций.
Пакет Distutils и sysconfig теперь поддерживаются Tarek Ziadé, который также начал работу над пакетом Distutils2 (хранилище исходного кода: https://hg.python.org/distutils2/) для разработки следующего поколения Distutils.
ttk: Тематические виджеты для Tk¶ttk: Themed Widgets for Tk
Tcl/Tk 8.5 включает набор тематических виджетов, которые повторно реализуют базовые виджеты Tk, но имеют более настраиваемый внешний вид и поэтому могут более точно напоминать виджеты родной платформы. Этот набор виджетов изначально назывался Tile, но был переименован в Ttk (от «themed Tk») при добавлении в Tcl/Tk версии 8.5.
Чтобы узнать больше, прочитайте документацию модуля ttk. Также вы можете прочитать страницу руководства Tcl/Tk, описывающую механизм тем Ttk, доступную по адресу https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm. Некоторые скриншоты использования кода Python/Ttk находятся по адресу https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.
Модуль ttk был написан Guilherme Polo и добавлен в bpo-2983. Альтернативная версия под названием Tile.py, написанная Martin Franklin и поддерживаемая Kevin Walzer, предлагалась для включения в bpo-2618, но авторы утверждали, что работа Guilherme Polo была более полной.
Обновлённый модуль: unittest¶Updated module: unittest
Модуль unittest был значительно улучшен; многие
новые возможности были добавлены. Большинство этих функций было реализовано
Майклом Фордом, если не указано иное. Улучшенная версия
модуля доступна для отдельной загрузки для использования с Python 2.4–2.6,
упакованная как пакет unittest2, по адресу
https://pypi.org/project/unittest2.
При использовании из командной строки модуль может автоматически обнаруживать тесты. Он не такой навороченный, как py.test или nose, но предоставляет простой способ запуска тестов, хранящихся в наборе каталогов пакетов. Например, следующая команда будет искать в подкаталоге test/ любые импортируемые тестовые файлы с именем test*.py:
python -m unittest discover -s test
Обратитесь к документации модуля unittest за более подробной информацией. (Разработано в bpo-6001.)
Функция main() поддерживает некоторые другие новые параметры:
-bили--bufferбудет буферизовать потоки стандартного вывода и стандартной ошибки во время каждого теста. Если тест пройден, любой результирующий вывод будет отброшен; при неудаче буферизованный вывод будет отображён.-cили--catchприведёт к тому, что прерывание по Control-C будет обрабатываться более корректно. Вместо немедленного прерывания процесса тестирования, текущий выполняющийся тест будет завершён, а затем будут сообщены частичные результаты до момента прерывания. Если вы нетерпеливы, повторное нажатие Control-C вызовет немедленное прерывание.Этот обработчик Control-C пытается избежать проблем, когда тестируемый код или запускаемые тесты определили собственный обработчик сигнала: он замечает, что обработчик уже установлен, и вызывает его. Если это не подходит, существует декоратор
removeHandler(), который можно использовать для пометки тестов, для которых обработка Control-C должна быть отключена.-fили--failfastзаставляет выполнение тестов немедленно остановиться при сбое теста, вместо продолжения выполнения следующих тестов. (Предложено Cliff Dyer, реализовано Michael Foord; bpo-8074.)
Сообщения о ходе выполнения теперь показывают ‘x’ для ожидаемых сбоев и ‘u’ для неожиданных успехов при запуске в подробном режиме. (Предложено Бенджамином Петерсоном.)
Тестовые случаи могут вызывать исключение SkipTest, чтобы пропустить тест (bpo-1034053).
Сообщения об ошибках для сбоев assertEqual(), assertTrue() и assertFalse() теперь содержат больше информации. Если установить атрибут longMessage ваших классов TestCase в true, для сбоев будут выводиться как стандартное сообщение об ошибке, так и любое дополнительное сообщение, которое вы предоставите. (Добавлено Майклом Фордом; bpo-5663.)
Метод assertRaises() теперь возвращает контекстный менеджер при вызове без указания вызываемого объекта для выполнения. Например, можно написать так:
with self.assertRaises(KeyError):
{}['foo']
(Реализовано Антуаном Питру; bpo-4444.)
Теперь поддерживаются фикстуры setup и teardown на уровне модуля и класса. Модули могут содержать функции setUpModule() и tearDownModule(). Классы могут иметь методы setUpClass() и tearDownClass(), которые должны быть определены как методы класса (с помощью @classmethod или эквивалента). Эти функции и методы вызываются, когда исполнитель тестов переключается на тестовый случай в другом модуле или классе.
Были добавлены методы addCleanup() и doCleanups(). addCleanup() позволяет добавлять функции очистки, которые будут вызываться безусловно (после setUp(), если setUp() завершается неудачей, иначе после tearDown()). Это позволяет значительно упростить выделение и освобождение ресурсов во время тестов (bpo-5679).
Было добавлено несколько новых методов, которые предоставляют более специализированные тесты. Многие из этих методов были написаны инженерами Google для использования в их наборах тестов; Грегори П. Смит, Майкл Форд и Гвидо ван Россум работали над интеграцией их в версию unittest от Python.
assertIsNone()иassertIsNotNone()принимают одно выражение и проверяют, является ли результатNoneили нет.assertIs()иassertIsNot()принимают два значения и проверяют, приводятся ли эти два значения к одному и тому же объекту или нет. (Добавлено Майклом Фордом; bpo-2578.)assertIsInstance()иassertNotIsInstance()проверяют, является ли результирующий объект экземпляром конкретного класса или одного из кортежа классов. (Добавлено Георгом Брандлем; bpo-7031.)assertGreater(),assertGreaterEqual(),assertLess()иassertLessEqual()сравнивают две величины.assertMultiLineEqual()сравнивает две строки, и если они не равны, отображает полезное сравнение, которое выделяет различия в двух строках. Это сравнение теперь используется по умолчанию при сравнении строк Unicode сassertEqual().assertRegexpMatches()иassertNotRegexpMatches()проверяют, является ли первый аргумент строкой, соответствующей или не соответствующей регулярному выражению, переданному в качестве второго аргумента (bpo-8038).assertRaisesRegexp()проверяет, возбуждается ли определённое исключение, а затем также проверяет, что строковое представление исключения соответствует предоставленному регулярному выражению.assertIn()иassertNotIn()проверяют, находится ли first в second или нет.assertItemsEqual()проверяет, содержат ли две предоставленные последовательности одни и те же элементы.assertSetEqual()сравнивает, равны ли два множества, и сообщает только о различиях между множествами в случае ошибки.Аналогично,
assertListEqual()иassertTupleEqual()сравнивают указанные типы и объясняют любые различия, не обязательно выводя их полные значения; эти методы теперь используются по умолчанию при сравнении списков и кортежей с помощьюassertEqual(). В более общем смысле,assertSequenceEqual()сравнивает две последовательности и может опционально проверять, являются ли обе последовательности определенного типа.assertDictEqual()сравнивает два словаря и сообщает о различиях; теперь он используется по умолчанию при сравнении двух словарей с помощьюassertEqual().assertDictContainsSubset()проверяет, все ли пары ключ/значение в first присутствуют в second.assertAlmostEqual()иassertNotAlmostEqual()проверяют, приблизительно ли равны первый и второй. Этот метод может либо округлить их разность до указанного количества знаков после запятой (по умолчанию 7) и сравнить её с нулём, либо потребовать, чтобы разность была меньше заданного значения дельта.loadTestsFromName()корректно учитывает атрибутsuiteClassобъектаTestLoader. (Исправлено Марком Родди; bpo-6866.)Новый хук позволяет расширить метод
assertEqual()для обработки новых типов данных. МетодaddTypeEqualityFunc()принимает объект типа и функцию. Эта функция будет использоваться, когда оба сравниваемых объекта относятся к указанному типу. Функция должна сравнивать два объекта и вызывать исключение, если они не совпадают; желательно, чтобы функция предоставляла дополнительную информацию о том, почему объекты не совпадают, подобно тому, как это делают новые методы сравнения последовательностей.
unittest.main() теперь принимает необязательный аргумент exit. Если false, main() не вызывает sys.exit(), что позволяет использовать main() из интерактивного интерпретатора. (Предложено Х. Пабло Фернандесом; bpo-3379.)
TestResult имеет новые методы startTestRun() и stopTestRun(), которые вызываются непосредственно до и после выполнения теста. (Предложено Робертом Коллинзом; bpo-5728.)
После всех этих изменений unittest.py стал неудобно большим, поэтому модуль был преобразован в пакет, а код разделён на несколько файлов (Бенджамином Петерсоном). Это не влияет на то, как модуль импортируется или используется.
См. также
- http://www.voidspace.org.uk/python/articles/unittest2.shtml
Описывает новые возможности, как их использовать, и обоснование различных проектных решений. (Автор: Майкл Форд.)
Обновлённый модуль: ElementTree 1.3¶Updated module: ElementTree 1.3
Версия библиотеки ElementTree, включённой в Python, обновлена до версии 1.3. Некоторые из новых возможностей:
Различные функции синтаксического анализа теперь принимают именованный аргумент parser, задающий экземпляр
XMLParser, который будет использоваться. Это позволяет переопределить внутреннюю кодировку файла:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
Ошибки при синтаксическом анализе XML теперь вызывают исключение
ParseError, экземпляры которого имеют атрибутposition, содержащий кортеж (line, column) с указанием местоположения проблемы.Код ElementTree для преобразования деревьев в строку был значительно переработан, что сделало его примерно в два раза быстрее во многих случаях. Методы
ElementTree.write()иElement.write()теперь имеют параметр method, который может быть «xml» (по умолчанию), «html» или «text». Режим HTML будет выводить пустые элементы как<empty></empty>вместо<empty/>, а текстовый режим будет пропускать элементы и выводить только текстовые фрагменты. Если установить атрибутtagэлемента вNone, но оставить его дочерние элементы на месте, элемент будет опущен при записи дерева, так что не нужно выполнять более обширную перестановку для удаления одного элемента.Обработка пространств имен также была улучшена. Все объявления
xmlns:<whatever>теперь выводятся на корневом элементе, а не разбросаны по всему результирующему XML. Можно задать пространство имен по умолчанию для дерева, установив атрибутdefault_namespace, и зарегистрировать новые префиксы с помощьюregister_namespace(). В режиме XML можно использовать логический параметр xml_declaration для подавления объявления XML.Новый метод
Element:extend()добавляет элементы из последовательности в дочерние элементы элемента. Сами элементы ведут себя как последовательности, поэтому легко перемещать дочерние элементы из одного элемента в другой:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Выводит <root><item>1</item>...</root> print ET.tostring(new)
Новый метод
Element:iter()возвращает дочерние элементы элемента в виде генератора. Также можно написатьfor child in elem:для перебора дочерних элементов элемента. Существующий методgetiterator()теперь устарел, как иgetchildren(), который создает и возвращает список дочерних элементов.Новый метод
Element:itertext()возвращает все текстовые фрагменты, являющиеся потомками элемента. Например:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Выводит ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
Устарело: использование элемента в качестве логического значения (т.е.
if elem:) возвращало true, если у элемента были дочерние элементы, и false, если их не было. Это поведение сбивает с толку –Noneравно false, но и элемент без детей тоже? – поэтому теперь это будет вызыватьFutureWarning. В своем коде следует быть явным: пишитеlen(elem) != 0, если вас интересует количество дочерних элементов, илиelem is not None.
Fredrik Lundh разрабатывает ElementTree и создал версию 1.3; вы можете прочитать его статью, описывающую 1.3, по адресу https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna обновил версию, включенную в Python, после обсуждений в python-dev и в bpo-6472.)
Изменения в сборке и C API¶Build and C API Changes
Изменения процесса сборки Python и C API включают:
Последний выпуск GNU Debugger, GDB 7, может быть скриптован с помощью Python. Когда вы начинаете отладку исполняемой программы P, GDB ищет файл с именем
P-gdb.pyи автоматически читает его. Dave Malcolm добавилpython-gdb.py, который добавляет ряд команд, полезных при отладке самого Python. Например,py-upиpy-downперемещают на один фрейм стека Python вверх или вниз, что обычно соответствует нескольким фреймам стека C.py-printвыводит значение переменной Python, аpy-btвыводит трассировку стека Python. (Добавлено в результате bpo-8032.)Если вы используете файл
.gdbinit, поставляемый с Python, макрос «pyo» в версии 2.7 теперь работает корректно, когда отлаживаемый поток не удерживает GIL; макрос теперь захватывает его перед выводом. (Предложено Victor Stinner; bpo-3632.)Py_AddPendingCall()теперь потокобезопасен, позволяя любому рабочему потоку отправлять уведомления главному потоку Python. Это особенно полезно для асинхронных операций ввода-вывода. (Предложено Kristján Valur Jónsson; bpo-4293.)Новая функция:
PyCode_NewEmpty()создает пустой объект кода; требуются только имя файла, имя функции и номер первой строки. Это полезно для модулей расширения, которые пытаются построить более полезный стек трассировки. Ранее таким расширениям приходилось вызыватьPyCode_New(), у которой было гораздо больше аргументов. (Добавлено Jeffrey Yasskin.)Новая функция:
PyErr_NewExceptionWithDoc()создает новый класс исключения, так же как существующаяPyErr_NewException(), но принимает дополнительный аргументchar *, содержащий строку документации для нового класса исключения. (Добавлено пользователем 'lekma' в баг-трекере Python; bpo-7033.)Новая функция:
PyFrame_GetLineNumber()принимает объект фрейма и возвращает номер строки, которую фрейм в данный момент выполняет. Ранее коду требовалось получить индекс текущей выполняемой инструкции байт-кода, а затем найти номер строки, соответствующий этому адресу. (Добавлено Jeffrey Yasskin.)Новые функции:
PyLong_AsLongAndOverflow()иPyLong_AsLongLongAndOverflow()аппроксимируют длинное целое Python как Clongилиlong long. Если число слишком велико для размещения в выходном типе, устанавливается флаг переполнения и возвращается вызывающей стороне. (Предложено Case Van Horsen; bpo-7528 и bpo-7767.)Новая функция: в результате переработки преобразования строки в число с плавающей точкой была добавлена новая функция
PyOS_string_to_double(). Старые функцииPyOS_ascii_strtod()иPyOS_ascii_atof()теперь устарели.Новая функция:
PySys_SetArgvEx()устанавливает значениеsys.argvи может опционально обновлятьsys.path, чтобы включить каталог, содержащий скрипт, указанный вsys.argv[0], в зависимости от значения параметра updatepath.Эта функция была добавлена для закрытия уязвимости безопасности в приложениях, встраивающих Python. Старая функция
PySys_SetArgv()всегда обновлялаsys.path, и иногда добавляла текущий каталог. Это означало, что если вы запускали приложение, встраивающее Python, в каталоге, контролируемом кем-то другим, злоумышленники могли поместить в этот каталог троянский модуль (например, файл с именемos.py), который ваше приложение затем импортировало и запускало.Если вы поддерживаете C/C++ приложение, встраивающее Python, проверьте, вызываете ли вы
PySys_SetArgv(), и тщательно обдумайте, должно ли приложение использоватьPySys_SetArgvEx()с updatepath, установленным в false.Проблема безопасности, о которой сообщалось как о CVE-2008-5983; обсуждалась в bpo-5753 и была исправлена Антуаном Питру.
Новые макросы: заголовочные файлы Python теперь определяют следующие макросы:
Py_ISALNUM,Py_ISALPHA,Py_ISDIGIT,Py_ISLOWER,Py_ISSPACE,Py_ISUPPER,Py_ISXDIGIT,Py_TOLOWERиPy_TOUPPER. Все эти функции аналогичны стандартным макросам C для классификации символов, но игнорируют текущую локаль, поскольку в нескольких местах Python нужно анализировать символы независимо от локали. (Добавлено Eric Smith; bpo-5793.)Удаленная функция:
PyEval_CallObjectтеперь доступна только как макрос. Версия функции сохранялась для сохранения совместимости ABI, но это было в 1997; теперь ее можно смело удалить. (Удалено Antoine Pitrou; bpo-8276.)Новые коды формата: функции
PyFormat_FromString(),PyFormat_FromStringV()иPyErr_Format()теперь принимают коды формата%lldи%lluдля отображения типовlong longв C. (Предложено Mark Dickinson; bpo-7228.)Сложное взаимодействие между потоками и форком процессов было изменено. Ранее дочерний процесс, созданный с помощью
os.fork(), мог завершиться ошибкой, поскольку дочерний процесс создается с работающим только одним потоком – тем, который выполняетos.fork(). Если другие потоки удерживали блокировку, например, блокировку импорта Python, то при выполнении форка блокировка все еще помечалась как «удерживаемая» в новом процессе. Но в дочернем процессе никто никогда не освободит блокировку, поскольку другие потоки не были реплицированы, и дочерний процесс больше не сможет выполнять импорт.Python 2.7 захватывает блокировку импорта перед выполнением
os.fork(), а также освобождает любые блокировки, созданные с помощью модуляthreading. Модули расширений C, имеющие внутренние блокировки или вызывающиеfork()самостоятельно, не выигрывают от этой очистки.(Исправлено Thomas Wouters; bpo-1590864.)
Функция
Py_Finalize()теперь вызывает внутреннюю функциюthreading._shutdown(); это предотвращает возникновение некоторых исключений при завершении работы интерпретатора. (Патч от Adam Olsen; bpo-1722344.)При использовании структуры
PyMemberDefдля определения атрибутов типа Python больше не позволит пытаться удалить или установить атрибутT_STRING_INPLACE.Глобальные символы, определенные модулем
ctypes, теперь имеют префиксPyили_ctypes. (Реализовано Thomas Heller; bpo-3102.)Новая опция configure: флаг
--with-system-expatпозволяет собрать модульpyexpatс системной библиотекой Expat. (Предложено Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Новая опция configure: опция
--with-valgrindтеперь отключает аллокатор pymalloc, который трудно корректно анализировать детектору ошибок памяти Valgrind. Поэтому Valgrind будет лучше обнаруживать утечки памяти и переполнения. (Предложено James Henstridge; bpo-2422.)Новая опция configure: теперь можно передать пустую строку в
--with-dbmliborder=, чтобы отключить все различные модули DBM. (Добавлено Arfrever Frehtes Taifersar Arahesis; bpo-6491.)Скрипт configure теперь проверяет наличие ошибок округления чисел с плавающей точкой на некоторых 32-битных чипах Intel и определяет макрос препроцессора
X87_DOUBLE_ROUNDING. Никакой код пока не использует это определение, но оно доступно, если кто-то захочет им воспользоваться. (Добавлено Mark Dickinson; bpo-2937.)configure также теперь устанавливает переменную
LDCXXSHAREDMakefile для поддержки связывания C++. (Вклад Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)Процесс сборки теперь создаёт необходимые файлы для поддержки pkg-config. (Предложено Clinton Roy; bpo-3585.)
Процесс сборки теперь поддерживает Subversion 1.7. (Предложено Arfrever Frehtes Taifersar Arahesis; bpo-6094.)
Капсулы¶Capsules
Python 3.1 добавляет новый тип данных C, PyCapsule, для предоставления C API модулю расширения. Капсула по сути является хранилищем указателя C void * и доступна как атрибут модуля; например, API модуля socket предоставляется как socket.CAPI, а unicodedata предоставляет ucnhash_CAPI. Другие расширения могут импортировать модуль, получить доступ к его словарю, чтобы извлечь объект капсулы, а затем получить указатель void *, который обычно указывает на массив указателей на различные API-функции модуля.
Существует уже используемый для этого тип данных PyCObject, но он не обеспечивает типобезопасность. Злонамеренный код на чистом Python может вызвать ошибку сегментации, взяв PyCObject из модуля A и каким-то образом подставив его вместо PyCObject в модуле B. Капсулы знают своё собственное имя, и для получения указателя необходимо указать имя:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Можно быть уверенным, что vtable указывает на то, что ожидается. Если была передана другая капсула, PyCapsule_IsValid() обнаружит несовпадение имени и вернёт false. Дополнительную информацию об использовании этих объектов см. в Providing a C API for an Extension Module.
Python 2.7 теперь внутренне использует капсулы для предоставления различных API модулей расширения, но PyCObject_AsVoidPtr() был изменён для работы с капсулами, сохраняя совместимость на этапе компиляции с интерфейсом CObject. Использование PyCObject_AsVoidPtr() вызовет PendingDeprecationWarning, который по умолчанию молчалив.
Реализовано в Python 3.1 и перенесено в 2.7 Ларри Хастингсом; обсуждалось в bpo-5630.
Изменения для конкретных платформ: Windows¶Port-Specific Changes: Windows
Модуль
msvcrtтеперь содержит некоторые константы из заголовочного файлаcrtassem.h:CRT_ASSEMBLY_VERSION,VC_ASSEMBLY_PUBLICKEYTOKENиLIBRARIES_ASSEMBLY_NAME_PREFIX. (Предложено David Cournapeau; bpo-4365.)Модуль
_winregдля доступа к реестру теперь реализует функцииCreateKeyEx()иDeleteKeyEx(), расширенные версии ранее поддерживаемых функций, принимающие несколько дополнительных аргументов.DisableReflectionKey(),EnableReflectionKey()иQueryReflectionKey()также были протестированы и документированы. (Реализовано Брайаном Кертином: bpo-7347.)Новый API
_beginthreadex()используется для запуска потоков, и теперь используются нативные функции потокового локального хранилища. (Предложено Kristján Valur Jónsson; bpo-3582.)Функция
os.kill()теперь работает в Windows. Значение сигнала может быть константамиCTRL_C_EVENT,CTRL_BREAK_EVENTили любое целое число. Первые две константы отправляют события нажатия клавиш Control-C и Control-Break подпроцессам; любое другое значение будет использовать APITerminateProcess(). (Автор: Мики Тебека; bpo-1220212.)Функция
os.listdir()теперь корректно завершается ошибкой для пустого пути. (Исправлено Hirokazu Yamamoto; bpo-5913.)Модуль
mimelibтеперь при инициализации читает базу данных MIME из реестра Windows. (Патч от Gabriel Genellina; bpo-4969.)
Изменения для конкретных платформ: Mac OS X¶Port-Specific Changes: Mac OS X
Путь
/Library/Python/2.7/site-packagesтеперь добавляется кsys.path, чтобы совместно использовать добавленные пакеты между системной установкой и установленной пользователем копией той же версии. (Изменено Ronald Oussoren; bpo-4865.)Изменено в версии 2.7.13: Начиная с версии 2.7.13, это изменение было удалено.
/Library/Python/2.7/site-packages, каталог site-packages, используемый системным Python 2.7 от Apple, больше не добавляется кsys.pathдля Python, установленных пользователем (например, из установщиков python.org). Начиная с macOS 10.12, Apple изменила способ настройки системного каталога site-packages, что могло привести к сбоям установки компонентов pip, таких как setuptools. Пакеты, установленные для системного Python, больше не будут совместно использоваться с Python, установленными пользователем. (bpo-28440)
Изменения для конкретных платформ: FreeBSD¶Port-Specific Changes: FreeBSD
Другие изменения и исправления¶Other Changes and Fixes
Два скрипта для бенчмарков,
iobenchиccbench, были добавлены в каталогTools.iobenchизмеряет скорость встроенных объектов ввода-вывода файлов, возвращаемыхopen(), при выполнении различных операций, аccbench– это бенчмарк конкурентности, который пытается измерить вычислительную пропускную способность, задержку переключения потоков и пропускную способность обработки ввода-вывода при выполнении нескольких задач с использованием различного количества потоков.Скрипт
Tools/i18n/msgfmt.pyтеперь понимает формы множественного числа в файлах.po. (Исправлено Martin von Löwis; bpo-5464.)При импорте модуля из файла
.pycили.pyoс существующим аналогом.pyатрибутыco_filenameрезультирующих объектов кода перезаписываются, когда исходное имя файла устарело. Это может произойти, если файл был переименован, перемещён или доступен по разным путям. (Патч от Ziga Seilnacht и Jean-Paul Calderone; bpo-1180193.)Скрипт
regrtest.pyтеперь принимает флаг--randseed=, который принимает целое число, используемое в качестве зерна генератора случайных чисел для опции-r, выполняющей тесты в случайном порядке. Опция-rтакже сообщает использованное зерно. (Добавлено Collin Winter.)Ещё один флаг
regrtest.py– это-j, который принимает целое число, указывающее, сколько тестов выполнять параллельно. Это позволяет сократить общее время выполнения на многоядерных машинах. Эта опция совместима с несколькими другими опциями, включая флаг-R, который, как известно, приводит к длительному времени выполнения. (Добавлено Antoine Pitrou, bpo-6152.) Его также можно использовать с новым флагом-F, который запускает выбранные тесты в цикле до тех пор, пока они не упадут. (Добавлено Antoine Pitrou; bpo-7312.)При выполнении как скрипт модуль
py_compile.pyтеперь принимает'-'в качестве аргумента, который будет читать из стандартного ввода список имён файлов для компиляции. (Предложено Piotr Ożarowski; bpo-8233.)
Перенос на Python 2.7¶Porting to Python 2.7
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:
Функция
range()обрабатывает свои аргументы более последовательно; теперь она будет вызывать__int__()для переданных ей аргументов, не являющихся числами с плавающей точкой или целыми числами. (Исправлено Alexander Belopolsky; bpo-1533.)Метод
format()изменил точность по умолчанию для чисел с плавающей точкой и комплексных чисел с 6 до 12 десятичных знаков, что соответствует точности, используемой вstr(). (Изменение внесено Eric Smith; bpo-5920.)Из-за оптимизации для инструкции
withспециальные методы__enter__()и__exit__()должны быть определены на уровне типа объекта и не могут быть привязаны непосредственно к его экземпляру. Это относится к классам нового стиля (наследующим отobject) и типам C-расширений. (bpo-6101.)Из-за ошибки в Python 2.6 параметр exc_value для методов
__exit__()часто был строковым представлением исключения, а не экземпляром. В Python 2.7 это исправлено, поэтому exc_value теперь будет экземпляром, как и ожидается. (Исправлено Florent Xicluna; bpo-7853.)Когда ограниченный набор атрибутов задавался с помощью
__slots__, удаление незаданного атрибута не вызывалоAttributeError, как можно было бы ожидать. Исправлено Benjamin Peterson; bpo-7604.)
В стандартной библиотеке:
Операции с экземплярами
datetime, приводящие к году, выходящему за пределы поддерживаемого диапазона, не всегда вызывалиOverflowError. Теперь такие ошибки проверяются более тщательно и будут вызывать исключение. (Сообщено Mark Leander, патч от Anand B. Pillai и Alexander Belopolsky; bpo-7150.)При использовании экземпляров
Decimalс методомformat()строки по умолчанию использовалось выравнивание по левому краю. Оно было изменено на выравнивание по правому краю, что может изменить вывод программ. (Изменено Mark Dickinson; bpo-6857.)Сравнения с участием сигнального NaN (или
sNAN) теперь сигнализируютInvalidOperationвместо того, чтобы молча возвращать истинное или ложное значение в зависимости от оператора сравнения. Тихие NaN (илиNaN) теперь являются хешируемыми. (Исправлено Mark Dickinson; bpo-7279.)Библиотека ElementTree,
xml.etree, больше не экранирует амперсанды и угловые скобки при выводе инструкции по обработке XML (которая выглядит как <?xml-stylesheet href=”#style1”?>) или комментария (который выглядит как <!– comment –>). (Патч от Нила Мюллера; bpo-2746.)Метод
readline()объектовStringIOтеперь ничего не делает при запросе отрицательной длины, как и другие файлоподобные объекты. (bpo-7348).Модуль
syslogтеперь будет использовать значениеsys.argv[0]в качестве идентификатора вместо предыдущего значения по умолчанию'python'. (Изменено Sean Reifschneider; bpo-8451.)Обработка ошибок по умолчанию в модуле
tarfileизменилась: теперь она не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был 0, что означало, что ошибки только записывались в отладочный журнал, но, поскольку отладочный журнал не активирован по умолчанию, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию – 1, что вызывает исключение при любой ошибке. (Изменено Lars Gustäbel; bpo-7357.)Метод
urlsplit()модуляurlparseтеперь обрабатывает неизвестные URL-схемы в соответствии с RFC 3986: если URL имеет форму"<something>://...", текст перед://рассматривается как схема, даже если это вымышленная схема, неизвестная модулю. Это изменение может нарушить код, который обходил старое поведение. Например, Python 2.6.4 или 2.5 вернёт следующее:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (и Python 2.6.5) вернёт:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 на самом деле выдаёт немного другой вывод, поскольку он возвращает именованный кортеж вместо стандартного кортежа.)
Для C-расширений:
C-расширения, использующие коды целочисленных форматов с семейством функций
PyArg_Parse*, теперь будут вызывать исключениеTypeErrorвместоDeprecationWarning(bpo-5080).Используйте новую функцию
PyOS_string_to_double()вместо старых функцийPyOS_ascii_strtod()иPyOS_ascii_atof(), которые теперь устарели.
Для приложений, которые встраивают Python:
Была добавлена функция
PySys_SetArgvEx(), позволяющая приложениям закрыть уязвимость, когда использовалась существующая функцияPySys_SetArgv(). Проверьте, не вызываете ли выPySys_SetArgv(), и тщательно обдумайте, должно ли приложение использоватьPySys_SetArgvEx()с updatepath, установленным в false.
Новые возможности, добавленные в релизы поддержки Python 2.7¶New Features Added to Python 2.7 Maintenance Releases
Новые возможности могут добавляться в релизы поддержки Python 2.7, если для этого действительно есть основания. Любые подобные дополнения должны проходить процесс Python Enhancement Proposal и убедительно обосновывать, почему их нельзя адекватно реализовать, либо добавив новую возможность только в Python 3, либо опубликовав её в Python Package Index.
В дополнение к конкретным предложениям, перечисленным ниже, существует общее исключение, разрешающее добавлять новые предупреждения -3 в любом релизе поддержки Python 2.7.
Две новые переменные окружения для режима отладки¶Two new environment variables for debug mode
В режиме отладки статистика [xxx refs] по умолчанию не записывается, теперь также должна быть установлена переменная окружения PYTHONSHOWREFCOUNT. (Предложено Victor Stinner; bpo-31733.)
Когда Python скомпилирован с определённым COUNT_ALLOC, счётчики выделения больше не выводятся по умолчанию: теперь также должна быть установлена переменная окружения PYTHONSHOWALLOCCOUNT. Более того, счётчики выделения теперь выводятся в stderr, а не в stdout. (Предложено Victor Stinner; bpo-31692.)
Новое в версии 2.7.15.
PEP 434: Исключение по улучшению IDLE для всех веток¶PEP 434: IDLE Enhancement Exception for All Branches
PEP 434 описывает общее исключение для изменений, вносимых в среду разработки IDLE, поставляемую вместе с Python. Это исключение позволяет разработчикам IDLE обеспечить более согласованный пользовательский опыт во всех поддерживаемых версиях Python 2 и 3.
За подробностями об изменениях IDLE обратитесь к файлу NEWS для конкретного релиза.
PEP 466: Улучшения сетевой безопасности для Python 2.7¶PEP 466: Network Security Enhancements for Python 2.7
PEP 466 описывает ряд предложений по усилению сетевой безопасности, которые были одобрены для включения в релизы поддержки Python 2.7, причём первые из этих изменений появились в релизе Python 2.7.7.
Функции, связанные с PEP 466, добавленные в Python 2.7.7:
hmac.compare_digest()был перенесён из Python 3, чтобы предоставить операцию сравнения, устойчивую к атакам по времени, для приложений Python 2. (Автор: Alex Gaynor; bpo-21306.)OpenSSL 1.0.1g был обновлён в официальных установщиках Windows, опубликованных на python.org. (Автор: Zachary Ware; bpo-21462.)
Функции, связанные с PEP 466, добавленные в Python 2.7.8:
hashlib.pbkdf2_hmac()был перенесён из Python 3, чтобы сделать алгоритм хеширования, подходящий для безопасного хранения паролей, широко доступным для приложений Python 2. (Автор: Alex Gaynor; bpo-21304.)OpenSSL 1.0.1h был обновлён для официальных установщиков Windows, опубликованных на python.org. (Автор: Закари Уэр в bpo-21671 для CVE-2014-0224)
Функции, связанные с PEP 466, добавленные в Python 2.7.9:
Большая часть модуля
sslиз Python 3.4 была перенесена. Это означает, чтоsslтеперь поддерживает Server Name Indication, настройки TLS1.x, доступ к хранилищу сертификатов платформы, классSSLContextи другие возможности. (Авторы: Alex Gaynor и David Reid; bpo-21308.)Конкретные детали приведены в примечаниях «Версия добавлена: 2.7.9» в документации модуля.
os.urandom()был изменён для кэширования файлового дескриптора для/dev/urandomвместо повторного открытия/dev/urandomпри каждом вызове. (Автор: Alex Gaynor; bpo-21305.)hashlib.algorithms_guaranteedиhashlib.algorithms_availableбыли перенесены из Python 3, чтобы упростить для приложений Python 2 выбор наиболее надёжного доступного алгоритма хеширования. (Автор: Alex Gaynor в bpo-21307)
PEP 477: Перенос ensurepip (PEP 453) в Python 2.7¶PEP 477: Backport ensurepip (PEP 453) to Python 2.7
PEP 477 одобряет включение модуля ensurepip PEP 453 и улучшенную документацию, ставшую возможной благодаря ему в выпусках поддержки Python 2.7, впервые появившуюся в версии Python 2.7.9.
Автоматическая установка pip по умолчанию¶Bootstrapping pip By Default
Новый модуль ensurepip (определённый в PEP 453) предоставляет стандартный
кроссплатформенный механизм для автоматической установки pip в дистрибутивы Python.
Версия pip, включённая в Python 2.7.9 – pip
1.5.6, и будущие выпуски поддержки 2.7.x будут обновлять встроенную версию до
последней версии pip, доступной на момент создания кандидата в релизы.
По умолчанию команды pip, pipX и pipX.Y будут установлены на
всех платформах (где X.Y обозначает версию установки Python),
вместе с пакетом pip Python и его зависимостями.
Для сборок CPython из исходных кодов в системах POSIX
команды make install и make altinstall не выполняют автоматическую установку pip
по умолчанию. Это поведение можно настроить через параметры configure и
переопределить через параметры Makefile.
В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают
pip вместе с самим CPython (пользователи могут отказаться от его установки
в процессе установки). Пользователям Windows потребуется согласиться на автоматическое
изменение PATH, чтобы pip был доступен из командной строки
по умолчанию; в противном случае его можно запустить через Python launcher для Windows как py -m pip.
Как обсуждается в PEP, разработчики дистрибутивов могут принять решение не устанавливать эти команды по умолчанию, при условии, что при их вызове они предоставляют четкие и простые инструкции по их установке на этой платформе (обычно с помощью системного менеджера пакетов).
Изменения в документации¶Documentation Changes
В рамках этого изменения разделы Установка модулей Python и Распространение модулей Python документации были полностью переработаны в короткие вводные руководства и FAQ. Большая часть документации по упаковке теперь перенесена в Руководство пользователя по упаковке Python, поддерживаемое Python Packaging Authority, и в документацию отдельных проектов.
Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как Installing Python Modules (Legacy version) и Distributing Python Modules (Legacy version).
См. также
- PEP 453 – Явная автоматическая установка pip в дистрибутивах Python
PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.
PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотеки¶PEP 476: Enabling certificate verification by default for stdlib http clients
PEP 476 обновил httplib и модули, которые его используют, такие как urllib2 и xmlrpclib, чтобы теперь проверять, что сервер предоставляет сертификат, подписанный центром сертификации из хранилища доверия платформы, и имя хоста которого по умолчанию совпадает с запрашиваемым именем хоста, что значительно повышает безопасность многих приложений. Это изменение было сделано в релизе Python 2.7.9.
Для приложений, которым требуется старое поведение, можно передать альтернативный контекст:
import urllib2
import ssl
# Это отключает все проверки
context = ssl._create_unverified_context()
# Это позволяет использовать конкретный сертификат для хоста, которому не нужно
# находиться в хранилище доверенных сертификатов
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493: Инструменты миграции проверки HTTPS для Python 2.7¶PEP 493: HTTPS verification migration tools for Python 2.7
PEP 493 предоставляет дополнительные инструменты миграции для поддержки более поэтапного процесса обновления инфраструктуры в средах, содержащих приложения и сервисы, полагающиеся на исторически допускающую обработку серверных сертификатов при установлении клиентских HTTPS-соединений. Эти дополнения были внесены в выпуске Python 2.7.12.
Эти инструменты предназначены для случаев, когда затронутые приложения и сервисы не могут быть изменены для явной передачи более допускающего SSL-контекста при установлении соединения.
Для приложений и сервисов, которые вообще не могут быть изменены, новая
переменная окружения PYTHONHTTPSVERIFY может быть установлена в 0, чтобы вернуть
весь процесс Python к поведению по умолчанию, допускающему всё, как в Python 2.7.8
и более ранних версиях.
Для случаев, когда код установления соединения не может быть изменён, но
приложение в целом может, новая функция ssl._https_verify_certificates()
может быть использована для настройки поведения по умолчанию во время выполнения.
Новая make regen-all цель сборки¶New make regen-all build target
Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\nсобрать без необходимости уже иметь установленную версию Python,\nсистема сборки на основе autotools больше не пытается неявно\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.
Вместо этого была добавлена новая команда make regen-all для принудительной\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\nбыла собрана на основе предварительно сгенерированных версий).
Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.
(Предложено Victor Stinner в bpo-23404.)
Новое в версии 2.7.14.
Удаление make touch цели сборки¶Removal of make touch build target
Цель сборки make touch, ранее использовавшаяся для запроса неявной перегенерации\nсгенерированных файлов путем обновления времени их изменения, была удалена.
Она заменена новой целью make regen-all.
(Предложено Victor Stinner в bpo-23404.)
Изменено в версии 2.7.14.
Благодарности¶Acknowledgements
Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Ник Коглан, Филип Дженви, Райан Ловетт, Р. Дэвид Мюррей, Хью Секер-Уокер.