Что нового в Python 2.7

Автор:

А. М. Кюхлинг (amk at amk.ca)

В этой статье рассказывается о новых функциях Python 2.7. Версия Python 2.7 была выпущена 3 июля 2010 года.

Обработка чисел была улучшена во многих отношениях, как для чисел с плавающей запятой, так и для класса Decimal. В стандартную библиотеку добавлено несколько полезных дополнений, таких как значительно улучшенный модуль unittest, модуль argparse для анализа параметров командной строки, удобные классы OrderedDict и Counter в <модуль collections и многие другие улучшения.

Планируется, что версия Python 2.7 станет последней из версий 2.x, поэтому мы работали над тем, чтобы сделать ее хорошей на долгосрочную перспективу. Чтобы облегчить переход на Python3, в версию 2.7 было включено несколько новых функций из серии Python 3.x.

В этой статье не делается попытка предоставить полную спецификацию новых функций, а вместо этого предлагается удобный обзор. Для получения более подробной информации вам следует обратиться к документации по Python 2.7 по адресу https://docs.python.org. Если вы хотите понять обоснование разработки и реализации, обратитесь к PEP для получения информации о конкретной новой функции или к выпуску на сайте https://bugs.python.org, в котором обсуждалось изменение. По возможности, в разделе «Что нового в Python» содержатся ссылки на ошибки/исправления для каждого изменения.

Будущее за 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 (либо напрямую, либо через распространителя) становится все более важным для пользователей Python 2. В дополнение к широкому спектру сторонних пакетов для различных задач, доступные пакеты включают в себя резервные копии новых модулей и функций из стандартной библиотеки Python 3, совместимых с Python 2, а также различные инструменты и библиотеки, которые могут упростить переход на Python 3. В Python Packaging User Guide приведены инструкции по загрузке и установке программного обеспечения из индекса пакетов Python.

  • Хотя в настоящее время предпочтительным подходом к улучшению Python 2 является публикация новых пакетов в Python Package Index, этот подход не обязательно работает во всех случаях, особенно в тех, которые связаны с сетевой безопасностью. В исключительных случаях, которые не могут быть решены надлежащим образом путем публикации новых или обновленных пакетов в PyPI, процесс предложения по улучшению Python может быть использован для обоснования необходимости добавления новых функций непосредственно в стандартную библиотеку Python 2. Любые такие дополнения и версии технического обслуживания, в которые они были добавлены, будут указаны в разделе В обновленные версии Python 2.7 добавлены новые функции ниже.

Для проектов, желающих перейти с Python 2 на Python 3, или для разработчиков библиотек и фреймворков, желающих поддерживать пользователей как на Python 2, так и на Python 3, существует множество инструментов и руководств, которые помогут выбрать подходящий подход и разобраться с некоторыми техническими деталями. Рекомендуемой отправной точкой является руководство Как перенести код Python 2 в Python 3.

Изменения в обработке предупреждений об устаревании

В версии 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 2.6 включал в себя функции Python 3.0, версия 2.7 включает в себя некоторые новые функции Python 3.1. Серия 2.x продолжает предоставлять инструменты для перехода на серию 3.x.

Неполный список функций версии 3.1, которые были перенесены в версию 2.7:

  • Синтаксис для литералов set ({1,2,3} - это изменяемый набор).

  • Понимание словаря и набора слов ({i: i*2 for i in range(3)}).

  • Несколько контекстных менеджеров в одном операторе with.

  • Новая версия библиотеки io, написанная на C для повышения производительности.

  • Тип упорядоченного словаря, описанный в PEP 372: Добавление упорядоченного словаря в коллекции.

  • Новый спецификатор формата ",", описанный в разделе PEP 378: Спецификатор формата для разделителя тысяч.

  • Объект memoryview.

  • Небольшое подмножество модуля importlib, described below.

  • Значение repr() для числа с плавающей запятой x во многих случаях короче: теперь оно основано на самой короткой десятичной строке, которая гарантированно округляется обратно до x. Как и в предыдущих версиях Python, гарантируется, что float(repr(x)) восстановит x.

  • Значения преобразований с плавающей точкой в строку и из строки в значение с плавающей точкой округлены правильно. Функция round() теперь также округлена правильно.

  • Тип PyCapsule, используемый для предоставления C API для модулей расширения.

  • Функция PyLong_AsLongAndOverflow() C API.

Другие новые предупреждения в режиме Python3 включают:

  • operator.isCallable() и operator.sequenceIncludes(), которые не поддерживаются в 3.x, теперь вызывают предупреждения.

  • Переключатель -3 теперь автоматически включает переключатель -Qwarn, который вызывает предупреждения об использовании классического деления с целыми числами и длинных целых чисел.

PEP 372: Добавление упорядоченного словаря в коллекции

Обычные словари 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
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True

Сравнение OrderedDict с обычным словарем игнорирует порядок вставки и просто сравнивает ключи и значения.

Как работает OrderedDict? Он поддерживает двусвязный список ключей, добавляя новые ключи к списку по мере их добавления. Дополнительный словарь сопоставляет ключи с соответствующим им узлом списка, поэтому удаление не должно проходить по всему связанному списку и, следовательно, остается O(1).

Стандартная библиотека теперь поддерживает использование упорядоченных словарей в нескольких модулях.

  • Модуль ConfigParser использует их по умолчанию, что означает, что файлы конфигурации теперь можно считывать, изменять, а затем записывать обратно в их первоначальном порядке.

  • Метод _asdict() для collections.namedtuple() теперь возвращает ordereddictionary со значениями, расположенными в том же порядке, что и базовые индексы кортежей.

  • Конструктор класса json модуля JSONDecoder был расширен параметром object_pairs_hook, чтобы позволить декодеру создавать экземпляры OrderedDict. Также была добавлена поддержка сторонних инструментов, таких как PyYAML.

См.также

PEP 372 - Добавление упорядоченного словаря в коллекции

PEP написан Армином Роначером и Рэймондом Хеттингером; реализован Рэймондом Хеттингером.

PEP 378: Спецификатор формата для разделителя тысяч

Чтобы сделать вывод программы более читабельным, может быть полезно добавлять разделители к большим числам, отображая их как 18 446 744 073 709 551 616 вместо 184 467 4407 370 955 1616.

Наиболее распространенным решением для этого является модуль 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 для синтаксического анализа командных строк

Модуль argparse для анализа аргументов командной строки был добавлен в качестве более мощной замены модулю optparse.

Это означает, что Python теперь поддерживает три разных модуля для анализа аргументов командной строки: getopt, optparse, и argparse. Модуль getopt очень похож на функцию библиотеки C getopt(), поэтому он остается полезным, если вы пишете прототип Python, который в конечном итоге будет переписан на C. optparse становится излишним, но в планах нет удалите его, потому что многие скрипты все еще используют его, и нет автоматического способа обновить эти скрипты. (Обсуждалось приведение API argparse в соответствие с интерфейсом optparse, но было отклонено как слишком запутанное и сложное.)

Короче говоря, если вы пишете новый скрипт и вам не нужно беспокоиться о совместимости с более ранними версиями Python, используйте argparse вместо optparse.

Вот пример:

import argparse

parser = argparse.ArgumentParser(description='Command-line example.')

# Add optional switches
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')

# Allow any number of additional arguments.
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: Настройка ведения Журнала на основе Словаря

Модуль logging очень гибкий; приложения могут определять дерево подсистем ведения журнала, и каждый регистратор в этом дереве может отфильтровывать определенные сообщения, форматировать их по-разному и направлять сообщения различному числу обработчиков.

Вся эта гибкость может потребовать большой настройки. Вы можете написать инструкции на Python для создания объектов и настройки их свойств, но для сложной настройки требуется подробный, но скучный код. logging также поддерживает функцию fileConfig(), которая анализирует файл, но формат файла не поддерживает настройку фильтров, и программно генерировать его сложнее.

В Python 2.7 добавлена функция dictConfig(), которая использует словарь для настройки ведения журнала. Существует множество способов создания словаря из разных источников: создайте словарь с помощью кода; проанализируйте файл, содержащий JSON; или используйте библиотеку синтаксического анализа YAML, если она установлена. Для получения дополнительной информации смотрите Функции настройки.

В следующем примере настраиваются два регистратора: корневой и сетевой. Сообщения, отправленные в корневой регистратор, будут отправлены в системный журнал с использованием протокола syslog, а сообщения в «сетевой» регистратор будут записаны в файл network.log, который будет изменен, как только размер журнала достигнет 1 МБ.

import logging
import logging.config

configdict = {
 'version': 1,    # Configuration schema in use; must be 1 for now
 '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'}},

 # Specify all the subordinate loggers
 'loggers': {
             'network': {
                         'handlers': ['netlog']
             }
 },
 # Specify properties of the root logger
 'root': {
          'handlers': ['syslog']
 },
}

# Set up configuration
logging.config.dictConfig(configdict)

# As an example, log two error messages
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(), который принимает значение level и возвращает, будет ли базовый регистратор обрабатывать сообщение такого уровня важности.

См.также

PEP 391 - Настройка Ведения Журнала На Основе Словаря

PEP, написанный и реализованный Винаем Саджипом.

PEP 3106: Просмотр словаря

Методы dictionary keys(), values(), и items() в Python 3.x отличаются друг от друга. Они возвращают объект с именем view вместо полностью материализованного списка.

Невозможно изменить возвращаемые значения 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 3106 - Обновление dict.keys(), .values() и .items()

ВДОХНОВЛЯЮЩИЙ текст написан Гвидо ван Россумом. Обновлено до версии 2.7 Александром Вассалотти; bpo-1967.

PEP 3137: Объект memoryview

Объект memoryview предоставляет представление содержимого памяти другого объекта, которое соответствует интерфейсу типа bytes.

>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # Returns length of underlying object
52
>>> m[0], m[25], m[26]   # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26]         # Slicing returns another 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)  # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # Assign to view, changing the bytearray.
>>> b[0:5]              # The bytearray has been changed.
bytearray(b'*bcde')
>>>

См.также

PEP 3137 - Неизменяемые байты и изменяемый буфер

PEP, написанный Гвидо ван Россумом. Реализован Трэвисом Олифантом, Антуаном Питру и другими. Обновлен до версии 2.7 Антуаном Питру; bpo-2396.

Другие языковые изменения

Вот некоторые небольшие изменения, внесенные в основной язык Python:

  • Синтаксис для литералов set был перенесен из Python 3.x. Фигурные скобки используются для заключения содержимого результирующего изменяемого набора; литералы set отличаются от словарей тем, что не содержат двоеточий и значений. {} продолжает представлять пустой словарь; используйте set() для пустого набора.

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # empty set
    set([])
    >>> {}    # empty dict
    {}
    

    Автор: Александр Вассалотти; 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; синтаксический анализ float и мнимых литералов в коде Python; и преобразование Decimal в float.

    В связи с этим 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, которые работали только случайно. (Исправлено Меадором Инге; bpo-7902.)

  • Теперь подкласс встроенного типа unicode может переопределять метод __unicode__(). (Реализовано Виктором Стиннером; bpo-1583863.)

  • Метод bytearray типа translate() теперь принимает None в качестве первого аргумента. (Исправлено Георгом Брандлом; bpo-4759.)

  • При использовании @classmethod и @staticmethod для обертывания методов как методов класса или статических методов объект-оболочка теперь предоставляет обернутую функцию в качестве их атрибута __func__. (Автор: Амор Форжо д’Арк, по предложению Джорджа Саккиса; bpo-5982.)

  • Когда ограниченный набор атрибутов был задан с помощью __slots__, удаление неустановленного атрибута не приводило к появлению AttributeError, как можно было бы ожидать. Исправлено Бенджамином Питерсоном; bpo-7604.)

  • Теперь поддерживаются две новые кодировки: «cp720», используемая в основном для арабского текста; и «cp858», вариант CP850, в который добавлен символ евро. (СР720 подготовлен Александром Бельченко и Амором Форжо д’Арком в bpo-1616979; СР858 подготовлен Тимом Хэтчем в bpo-8016.)

  • Объект file теперь будет устанавливать атрибут filename для исключения IOError при попытке открыть каталог на платформах POSIX (отмечено Яном Калишевски; bpo-4764), и теперь явно проверяет наличие и запрещает запись в файловые объекты, доступные только для чтения, вместо того, чтобы доверять библиотеке C отлавливать ошибку и сообщать о ней (исправлено Стефаном Крахом; bpo-5677).

  • Токенизатор Python теперь сам переводит окончания строк, поэтому встроенная функция compile() теперь принимает код, используя любое соглашение о завершении строки. Кроме того, больше не требуется, чтобы код отображался в новой строке.

  • Дополнительные круглые скобки в определениях функций недопустимы в Python 3.x, что означает, что вы получите синтаксическую ошибку с def f((x)): pass. В режиме предупреждения Python3 Python 2.7 теперь будет предупреждать об этом странном использовании. (Отмечено Джеймсом Лингардом; bpo-7362.)

  • Теперь можно создавать слабые ссылки на объекты класса старого образца. Классы нового образца всегда имели слабые ссылки. (Исправлено Антуаном Питру; bpo-8268.)

  • Когда объект модуля очищается от мусора, словарь модуля теперь очищается только в том случае, если ни у кого другого нет ссылки на этот словарь (bpo-7140).

Изменения в интерпретаторе

Новая переменная среды, PYTHONWARNINGS, позволяет управлять предупреждениями. Она должна быть установлена в строку, содержащую параметры предупреждения, эквивалентные тем, которые используются с параметром -W, разделенные запятыми. (Автор: Брайан Кертин; bpo-7301.)

Например, следующая настройка будет выводить предупреждения при каждом их появлении, но превратит предупреждения из модуля Cookie в ошибку. (Точный синтаксис для установки переменной среды различается в разных операционных системах и оболочках).

export PYTHONWARNINGS=all,error:::Cookie:0

Оптимизация

Было добавлено несколько улучшений производительности:

  • Был добавлен новый код операции для выполнения начальной настройки для операторов with с поиском методов __enter__() и __exit__(). (Автор - Бенджамин Петерсон).

  • Сборщик мусора теперь работает лучше для одной распространенной схемы использования: когда выделяется много объектов без освобождения какого-либо из них. Раньше для сбора мусора требовалось квадратичное время, но теперь количество полных сборок мусора уменьшается по мере роста количества объектов в куче. Новая логика выполняет полную сборку мусора только тогда, когда среднее поколение было собрано 10 раз и когда количество уцелевших объектов среднего поколения превышает 10% от количества объектов самого старого поколения. (Предложено Мартином фон Левисом и реализовано Антуаном Питру; bpo-4074.)

  • Сборщик мусора пытается избежать отслеживания простых контейнеров, которые не могут быть частью цикла. В Python 2.7 это теперь верно для кортежей и dicts, содержащих атомарные типы (такие как целые числа, строки и т.д.). Транзитивно dict, содержащий кортежи атомарных типов, также не будет отслеживаться. Это помогает снизить стоимость каждой сборки мусора за счет уменьшения количества объектов, которые должны быть рассмотрены и пройдены сборщиком. (Автор: Антуан Питру; bpo-4688.)

  • Длинные целые числа теперь хранятся внутри системы либо в базе 2**15, либо в базе 2**30, причем база определяется во время сборки. Ранее они всегда хранились в базе 2**15. Использование базовой версии 2**30 значительно повышает производительность на 64-разрядных компьютерах, но результаты тестирования на 32-разрядных компьютерах были неоднозначными. Таким образом, по умолчанию используется base 2**30 на 64-разрядных компьютерах и base 2**15 на 32-разрядных компьютерах; в Unix есть новый параметр configure --enable-big-digits, который можно использовать для переопределения этого параметра по умолчанию.

    Помимо улучшения производительности, это изменение должно быть незаметным для конечных пользователей, за одним исключением: для целей тестирования и отладки добавлен новый structseq sys.long_info, который предоставляет информацию о внутреннем формате, указывая количество бит на цифру и размер в байтах используемого типа C для сохранения каждой цифры:

    >>> import sys
    >>> sys.long_info
    sys.long_info(bits_per_digit=30, sizeof_digit=4)
    

    (Автор: Марк Дикинсон; bpo-4258.)

    В результате других изменений размер длинных объектов уменьшился на несколько байт: на 2 байта в 32-разрядных системах и на 6 байт в 64-разрядных. (Автор: Марк Дикинсон; bpo-5260.)

  • Алгоритм деления длинных целых чисел был ускорен за счет сокращения внутреннего цикла, выполнения сдвигов вместо умножения и устранения ненужных дополнительных итераций. Различные тесты показывают, что при делении длинных целых чисел и операциях по модулю ускорение составляет от 50% до 150%. (Автор: Марк Дикинсон; bpo-5512.) Побитовые операции также значительно ускоряются (первоначальный патч от Грегори Смита; bpo-1087418).

  • Реализация % проверяет, является ли левый операнд строкой Python, и использует его в особых случаях; это приводит к увеличению производительности на 1-3% для приложений, которые часто используют % со строками, таких как библиотеки шаблонов. (Реализовано Коллином Уинтером; bpo-5176.)

  • Значения списка с условием if компилируются в более быстрый байт-код. (Патч от Antoine Pitrou, перенесенный на версию 2.7 Джеффри Ясскином; bpo-4715.)

  • Преобразование целого или длинного целого числа в десятичную строку было ускорено с помощью специальной базы данных 10 вместо использования обобщенной функции преобразования, поддерживающей произвольные базы данных. (Исправление от Гавейна Болтона; bpo-6713.)

  • Методы split(), replace(), rindex(), rpartition(), и rsplit() для типов, подобных string (строки, строки в Юникоде и bytearray объекты), теперь используют алгоритм быстрого обратного поиска вместо посимвольного сканирования. Иногда это происходит быстрее в 10 раз. (Добавлено Флораном Шиклуной; bpo-7462 и bpo-7622.)

  • Модули pickle и cPickle теперь автоматически вставляют строки, используемые для имен атрибутов, что сокращает использование памяти объектами, полученными в результате распаковки. (Автор: Джейк Макгуайр; bpo-5084.)

  • В модуле cPickle добавлены словари для особых случаев, что почти вдвое сокращает время, необходимое для их обработки. (Автор: Коллин Винтер; bpo-5670.)

Новые и улучшенные модули

Как и в каждом выпуске, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот неполный список наиболее заметных изменений, отсортированных в алфавитном порядке по названию модуля. Обратитесь к файлу Misc/NEWS в дереве исходного кода для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.

  • Базовый класс отладки модуля bdb Bdb получил возможность пропускать модули. Конструктор теперь принимает iterable, содержащий шаблоны в стиле glob, такие как django.*; отладчик не будет переходить во фреймы стека из модуля, который соответствует одному из этих шаблонов. (Подготовлено Мару Ньюби по предложению Сентила Кумарана; bpo-5142.)

  • Модуль binascii теперь поддерживает API-интерфейс buffer, поэтому его можно использовать с экземплярами memoryview и другими подобными объектами buffer. (Перенесено из 3.x автором является Florent Xicluna; bpo-7703.)

  • Обновленный модуль: модуль bsddb был обновлен с версии 4.7.2devel9 до версии 4.8.4 версии the pybsddb package. В новой версии улучшена совместимость с Python 3.x, исправлены различные ошибки и добавлены несколько новых флагов и методов BerkeleyDB. ((Обновлено Хесусом Сеа Авионом; bpo-8156. Список изменений pybsddb можно прочитать по адресу https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)

  • Модуль bz2 BZ2File теперь поддерживает протокол управления контекстом, поэтому вы можете написать with bz2.BZ2File(...) as f:. (Автор: Хаген Фюрстенау; 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']    # Count is now lower
    -1
    

    Автор: Раймонд Хеттингер; bpo-1696199.

    Новый класс: OrderedDict описан в предыдущем разделе PEP 372: Добавление упорядоченного словаря в коллекции.

    Новый метод: Тип данных deque теперь имеет метод count(), который возвращает количество содержащихся в нем элементов, равное указанному аргументу x, и метод reverse(), который изменяет элементы deque на противоположные. deque также указывает его максимальную длину как атрибут, доступный только для чтения maxlen. (Обе функции добавлены Раймондом Хеттингером).

    Класс namedtuple теперь имеет необязательный параметр rename. Если значение rename равно true, имена полей, которые являются недопустимыми, поскольку они повторялись, или не являются допустимыми идентификаторами Python, будут переименованы в допустимые имена, которые являются производными от позиции поля в списке полей:

    >>> from collections import namedtuple
    >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
    >>> T._fields
    ('field1', '_1', '_2', 'field2')
    

    (Добавлено Раймондом Хеттингером; bpo-1818.)

    Наконец, абстрактный базовый класс Mapping теперь возвращает NotImplemented, если сопоставление сравнивается с другим типом, который не является Mapping. (Исправлено Даниэлем Штутцбахом; 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'
    

    (Автор: Матс Киндал; bpo-7005.)

  • Устаревшая функция: contextlib.nested(), которая позволяет управлять несколькими контекстными менеджерами с помощью одного оператора with, была признана устаревшей, поскольку оператор with теперь поддерживает несколько контекстных менеджеров.

  • Модуль cookielib теперь игнорирует файлы cookie, содержащие недопустимое поле версии, которое не содержит целого значения. (Исправлено Джоном Дж. Ли; bpo-3924.)

  • Функция copy модуля deepcopy() теперь будет корректно копировать связанные методы экземпляра. (Реализовано Робертом Коллинзом; bpo-1515.)

  • Модуль ctypes теперь всегда преобразует None в указатель переменного тока NULL для аргументов, объявленных как указатели. (Изменено Томасом Хеллером; bpo-4606.) Базовый libffi library был обновлен до версии 3.0.9, содержащей различные исправления для различных платформ. (Обновлено Маттиасом Клозе; bpo-8142.)

  • Новый метод: класс datetime модуля timedelta получил метод total_seconds(), который возвращает количество секунд в продолжительности. (Автор: Брайан Квинлан; bpo-5788.)

  • Новый метод: класс Decimal получил метод класса from_float(), который выполняет точное преобразование числа с плавающей запятой в Decimal. Это точное преобразование стремится к максимально близкому десятичному приближению к значению представления с плавающей запятой; поэтому результирующее десятичное значение все равно будет содержать неточность, если таковая имеется. Например, Decimal.from_float(0.1) возвращает Decimal('0.1000000000000000055511151231257827021181583404541015625'). (Реализовано Раймондом Хеттингером; bpo-4796.)

    Сравнение экземпляров Decimal с числами с плавающей запятой теперь дает разумные результаты, основанные на числовых значениях операндов. Ранее такие сравнения основывались на правилах Python по умолчанию для сравнения объектов, которые давали произвольные результаты в зависимости от их типа. Обратите внимание, что вы по-прежнему не можете комбинировать Decimal и числа с плавающей запятой в других операциях, таких как сложение, поскольку вы должны явно выбирать способ преобразования между числами с плавающей запятой и Decimal. (Исправлено Марком Дикинсоном; bpo-2531.)

    Конструктор для Decimal теперь поддерживает числа с плавающей запятой (добавлены Раймондом Хеттингером; bpo-8257) и неевропейские символы Юникода, такие как арабско-индийские цифры (добавлены Марком Дикинсоном; bpo-6595).

    Большинство методов класса Context теперь принимают целые числа, а также экземпляры Decimal; единственными исключениями являются методы canonical() и is_canonical(). (Патч от Хуана Хосе Конти; bpo-7633.)

    При использовании экземпляров Decimal со строковым методом format() выравнивание по умолчанию ранее выполнялось по левому краю. Теперь оно изменено на выравнивание по правому краю, что более удобно для числовых типов. (Изменено Марком Дикинсоном; bpo-6857.)

    Сравнения, включающие сигнальное значение NaN (или sNAN), теперь сигнализируют о значении InvalidOperation вместо того, чтобы автоматически возвращать значение true или false в зависимости от оператора сравнения. Значения NaN (или NaN) теперь доступны для хэширования. (Исправлено Марком Дикинсоном; bpo-7279.)

  • Модуль difflib теперь выдает выходные данные, более совместимые с современными инструментами diff/patch благодаря одному небольшому изменению: вместо пробелов в качестве разделителя в заголовке, указывающем имя файла, используется символ табуляции. (Исправлено Анатолием Тектоником; bpo-7585.)

  • Команда Distutils sdist теперь всегда восстанавливает файл MANIFEST, поскольку, даже если файлы MANIFEST.in или setup.py не были изменены, пользователь, возможно, создал несколько новых файлов, которые следует включить. (Исправлено Тареком Зиаде; bpo-8688.)

  • Флаг doctest модуля IGNORE_EXCEPTION_DETAIL теперь будет игнорировать имя модуля, содержащего тестируемое исключение. (Исправление от Леннарта Регебро; bpo-7490.)

  • Класс email модуля Message теперь будет принимать полезную нагрузку, выраженную в Юникоде, автоматически преобразуя полезную нагрузку в кодировку, указанную в output_charset. (Добавлено Р. Дэвидом Мюрреем; bpo-1368247.)

  • Класс Fraction теперь принимает один экземпляр с плавающей точкой или Decimal или два рациональных числа в качестве аргументов своего конструктора. (Реализовано Марком Дикинсоном; в bpo-5812 добавлены рациональные числа, а в bpo-8294 - число с плавающей запятой/десятичное число.)

    Упорядочивание сравнений (<, <=, >, >=) между дробями и комплексными числами теперь возникает TypeError. Это исправляет оплошность, из-за которой Fraction соответствует другим числовым типам.

  • Новый класс: FTP_TLS в модуле ftplib обеспечивает безопасные FTP-соединения с использованием TLS-инкапсуляции для аутентификации, а также последующего управления и передачи данных. (Автор: Джампаоло Родола; 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. (Добавлено Раймондом Хеттингером).

  • Новая функция: gc модуля is_tracked() возвращает значение true, если данный экземпляр отслеживается сборщиком мусора, в противном случае - значение false. (Автор: Антуан Питру; bpo-4688.)

  • Модуль gzip GzipFile теперь поддерживает протокол управления контекстом, так что вы можете написать with gzip.GzipFile(...) as f: (добавлено Хагеном Фюрстенау; bpo-3860), и теперь он реализует io.BufferedIOBase ABC, чтобы вы могли дополнить его io.BufferedReader для более быстрой обработки (предоставлено помощниками Nir; bpo-7471). Также теперь можно переопределить время модификации, записанное в сжатом файле, предоставив конструктору необязательную временную метку. (Автор - Жак Фреше; bpo-4272.)

    Файлы в формате gzip могут быть дополнены конечными нулевыми байтами; модуль gzip теперь будет использовать эти конечные байты. (Исправлено Тадеком Пьетрашеком и Брайаном Кертином; bpo-2846.)

  • Новый атрибут: модуль hashlib теперь имеет атрибут algorithms, содержащий кортеж с именами поддерживаемых алгоритмов. В Python 2.7 hashlib.algorithms содержит ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Автор: Карл Шене; bpo-7418.)

  • Класс HTTPResponse, используемый модулем httplib по умолчанию, теперь поддерживает буферизацию, что значительно ускоряет чтение HTTP-ответов. (Автор: Кристьян Валюр Йонссон; bpo-4879.)

    Классы HTTPConnection и HTTPSConnection теперь поддерживают параметр source_address, состоящий из 2-х кортежей (host, port), указывающих адрес источника, который будет использоваться для подключения. (Автор: Элдон Зиглер; bpo-3972.)

  • Модуль ihooks теперь поддерживает относительный импорт. Обратите внимание, что ihooks - это более старый модуль для настройки импорта, замененный модулем imputil, добавленным в Python 2.0. (Относительная поддержка импорта добавлена Нилом Шеменауэром).

  • Модуль imaplib теперь поддерживает IPv6-адреса. (Автор: Дерек Морр; bpo-1655.)

  • Новая функция: модуль inspect getcallargs() принимает вызываемый объект и его позиционные аргументы и аргументы ключевого слова и вычисляет, какие из параметров вызываемого объекта получат каждый аргумент, возвращая словарь, сопоставляющий имена аргументов с их значениями. Например:

    >>> 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, указывающий параметр error, используемый для ошибок кодирования и декодирования (один из 'strict', 'replace', 'ignore').

    Класс io.FileIO теперь выдает значение OSError при передаче недопустимого файлового дескриптора. (Реализовано Бенджамином Питерсоном; bpo-4991.) Метод truncate() теперь сохраняет положение файла; ранее он изменял положение файла на конец нового файла. (Исправлено Паскалем Шамбоном; bpo-6939.)

  • Новая функция: itertools.compress(data, selectors) выполняет два итератора. Элементы data возвращаются, если соответствующее значение в selectors равно true:

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F
    

    Новая функция: itertools.combinations_with_replacement(iter, r) возвращает все возможные комбинации элементов длиной r из повторяемого iter. В отличие от combinations(), отдельные элементы могут повторяться в сгенерированных комбинациях:

    itertools.combinations_with_replacement('abc', 2) =>
      ('a', 'a'), ('a', 'b'), ('a', 'c'),
      ('b', 'b'), ('b', 'c'), ('c', 'c')
    

    Обратите внимание, что элементы считаются уникальными в зависимости от их положения во входных данных, а не от их фактических значений.

    Функция itertools.count() теперь имеет аргумент step, который позволяет увеличивать значение на значения, отличные от 1. count() также теперь допускает аргументы с ключевыми словами и использование нецелочисленных значений, таких как числа с плавающей запятой или экземпляры Decimal. (Реализовано Раймондом Хеттингером; bpo-5032.)

    itertools.combinations() и itertools.product() ранее вызывались ValueError для значений r, превышающих входную итерацию. Это было сочтено ошибкой спецификации, поэтому теперь они возвращают пустой итератор. (Исправлено Раймондом Хеттингером; bpo-4816.)

  • Обновленный модуль: Модуль json был обновлен до версии 2.0.9 пакета simplejson, который включает расширение C, ускоряющее кодирование и декодирование. (Автор Боб Ипполито; bpo-4136.)

    Для поддержки нового типа collections.OrderedDict в json.load() теперь добавлен необязательный параметр object_pairs_hook, который будет вызываться с любым объектным литералом, который декодируется в список пар. (Автор: Раймонд Хеттингер; bpo-5381.)

  • Класс mailbox модуля Maildir теперь записывает временную метку для каталогов, которые он считывает, и перечитывает их только в том случае, если время изменения впоследствии изменилось. Это повышает производительность, позволяя избежать ненужных проверок каталогов. (Исправлено А. М. Кухлингом и Антуаном Питру; bpo-1607951, bpo-6896.)

  • Новые функции: модуль math получил erf() и erfc() для функции ошибки и дополнительной функции ошибки, expm1() которая вычисляет e**x - 1 с большей точностью, чем при использовании exp() и вычитаем 1, gamma() для гамма-функции и lgamma() для натурального логарифма Гамма-функции. (Авторы: Марк Дикинсон и Нирина Раселиарисон; bpo-3366.)

  • Классам multiprocessing модуля Manager* теперь можно передавать вызываемый объект, который будет вызываться всякий раз, когда запускается подпроцесс, вместе с набором аргументов, которые будут передаваться вызываемому объекту. ((Предоставлено лекмой; bpo-5585.)

    Класс Pool, который управляет пулом рабочих процессов, теперь имеет необязательный параметр maxtasksperchild. Рабочие процессы выполнят указанное количество задач, а затем завершат работу, в результате чего Pool запустит новый рабочий процесс. Это полезно, если при выполнении задач может возникнуть утечка памяти или других ресурсов, или если из-за некоторых задач рабочий ресурс становится очень большим. (Автор Чарльз Казабон; bpo-6963.)

  • Модуль nntplib теперь поддерживает IPv6-адреса. (Автор: Дерек Морр; bpo-1664.)

  • Новые функции: модуль os обрабатывает следующие системные вызовы POSIX: getresgid() и getresuid(), которые возвращают реальные, эффективные и сохраненные идентификаторы GID и UID; setresgid() и setresuid(), которые устанавливают реальные, эффективные и сохраненные идентификаторы GID и UIDS на новые значения; initgroups(), которые инициализируют список группового доступа для текущего процесса. (Функции GID/UID предоставлены Трэвисом Х.; bpo-6508. Поддержка групп инициализации добавлена Жан-Полем Кальдероне; bpo-7333.)

    Функция os.fork() теперь повторно инициализирует блокировку импорта в дочернем процессе; это устраняет проблемы в Solaris, когда fork() вызывается из потока. (Исправлено Zsolt Cserna; bpo-7242.)

  • В модуле os.path функции normpath() и abspath() теперь сохраняют Юникод; если их входной путь представляет собой строку в Юникоде, возвращаемое значение также является строкой в Юникоде. (normpath() исправлено с помощью Мэтт Джука в фильме bpo-5827; abspath() исправлено Эцио Мелотти в bpo-3426.)

  • В модуле pydoc теперь есть справка по различным символам, используемым в Python. Теперь вы можете использовать, например, help('<<') или help('@'). (Автор Дэвид Лабан; bpo-4739.)

  • Модули re split(), sub(), и subn() теперь принимают необязательный аргумент flags для согласованности с другими функциями модуля. (Добавлено Грегори П. Смитом.)

  • Новая функция: run_path() в модуле runpy выполнит код при указанном аргументе path. path может быть путем к исходному файлу Python (example.py), файлу с скомпилированным байт-кодом (example.pyc), каталогу (./package/), или zip-архиву (example.zip). Если указан каталог или zip-путь, он будет добавлен в начало sys.path и модуль __main__ будет импортирован. Ожидается, что каталог или zip-файл содержат __main__.py; если это не так, то какой-либо другой __main__.py может быть импортирован из местоположения позже в sys.path. Это делает более доступным механизм runpy для сценариев, которые хотят имитировать то, как командная строка Python обрабатывает явное имя пути. (Добавлено Ником Когланом; bpo-6816.)

  • Новая функция: в модуле shutil make_archive() принимает имя файла, тип архива (формат zip или tar) и путь к каталогу и создает архив, содержащий содержимое каталога. ((Добавлено Тареком Зиаде.)

    Функции shutil’s copyfile() и copytree() теперь генерируют исключение SpecialFileError при запросе скопировать именованный канал. Ранее код обрабатывал именованные каналы как обычный файл, открывая их для чтения, и это блокировало бы их на неопределенный срок. (Исправлено Антуаном Питру; bpo-3002.)

  • Модуль signal больше не переустанавливает обработчик сигналов, если это действительно не является необходимым, что устраняет ошибку, из-за которой было невозможно надежно перехватить сигнал EINTR. (Исправлено Шарлем-Франсуа Натали; bpo-8354.)

  • Новые функции: в модуле site три новые функции возвращают различные пути, зависящие от сайта и пользователя. getsitepackages() возвращает список, содержащий все глобальные каталоги пакетов сайта, getusersitepackages() возвращает путь к каталогу пакетов сайта пользователя, а getuserbase() возвращает значение переменной окружения USER_BASE, указывает путь к каталогу, который может быть использован для хранения данных. (Автор: Тарек Зиаде; bpo-6693.)

    Модуль site теперь сообщает об исключениях, возникающих при импорте модуля sitecustomize, и больше не будет перехватывать и проглатывать исключение KeyboardInterrupt. (Исправлено Виктором Стиннером; bpo-3137.)

  • Функция create_connection() получила параметр source_address, представляющий собой (host, port) 2-й кортеж, указывающий адрес источника, который будет использоваться для подключения. (Автор: Элдон Зиглер; bpo-3972.)

    Методы recv_into() и recvfrom_into() теперь будут записываться в объекты, поддерживающие buffer API, наиболее эффективно в объекты bytearray и memoryview. (Реализовано Антуаном Питру; bpo-8104.)

  • Класс SocketServer модуля TCPServer теперь поддерживает тайм-ауты сокетов и отключение алгоритма Nagle. Атрибут disable_nagle_algorithm по умолчанию имеет значение False; если переопределить значение true, для новых соединений с запросами будет установлен параметр TCP_NODELAY, чтобы предотвратить буферизацию множества небольших отправлений в одном TCP-пакете. Атрибут класса timeout может содержать время ожидания в секундах, которое будет применено к сокету запроса; если в течение этого времени запрос не будет получен, будет вызван handle_timeout() и будет возвращен handle_request(). (Автор: Кристьян Валюр Йонссон; bpo-6192 и bpo-6267.)

  • Обновленный модуль: модуль sqlite3 был обновлен до версии 2.6.0 версии pysqlite package. Версия 2.6.0 содержит ряд исправлений и добавляет возможность загружать расширения SQLite из общих библиотек. Вызовите метод enable_load_extension(True), чтобы включить расширения, а затем вызовите метод load_extension() для загрузки определенной разделяемой библиотеки. (Обновлено Герхардом Херингом).

  • Объекты модуля ssl SSLSocket теперь поддерживают buffer API, который исправил ошибку набора тестов (исправлено Антуаном Питру; bpo-7133) и автоматически установил OpenSSL SSL_MODE_AUTO_RETRY, который предотвратит возврат кода ошибки из recv() операций, которые запускают повторное согласование SSL (исправлено Антуаном Питру; bpo-8222).

    Функция-конструктор wrap_socket() теперь принимает аргумент ciphers, представляющий собой строку со списком разрешенных алгоритмов шифрования; формат строки описан как in the OpenSSL documentation. (Добавлено Антуаном Питру; 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.)

  • Новая функция: модуль subprocess check_output() запускает команду с указанным набором аргументов и возвращает выходные данные команды в виде строки, когда команда выполняется без ошибок, или вызывает исключение 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'. (Изменено Шоном Райфшнайдером; 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, что приводит к возникновению исключения при наличии ошибки. (Изменено Ларсом Густабелем; bpo-7357.)

    tarfile теперь поддерживается фильтрация объектов TarInfo, добавляемых в tar-файл. При вызове add() вы можете указать необязательный аргумент 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).

  • Модуль urlparse urlsplit() теперь обрабатывает неизвестные схемы 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 Майклом Фордом.)

  • Библиотека xml.etree.ElementTree больше не экранирует амперсанды и угловые скобки при выводе команды обработки XML (которая выглядит как <?xml-stylesheet href="#style1"?>) или комментария (который выглядит как <!-- comment -->). (Патч от Нила Мюллера; bpo-2746.)

  • Клиент и сервер XML-RPC, предоставляемые модулями xmlrpclib и SimpleXMLRPCServer, улучшили производительность благодаря поддержке HTTP/1.1 keep-alive и дополнительному использованию кодировки gzip для сжатия передаваемого XML-файла. Сжатие в формате gzip контролируется атрибутом encode_threshold в SimpleXMLRPCRequestHandler, который содержит размер в байтах; ответы, превышающие этот размер, будут сжаты. (Автор: Кристиан Валюр Йонссон; bpo-6267.)

  • Модуль zipfile ZipFile теперь поддерживает протокол управления контекстом, поэтому вы можете написать with zipfile.ZipFile(...) as f:. (Автор Брайан Кертин; bpo-5511.)

    zipfile теперь также поддерживается архивирование пустых каталогов и их корректное извлечение. (Исправлено Kuba Wieczorek; bpo-4710.) Чтение файлов из архива стало быстрее, а чередование read() и readline() теперь работает корректно. (Предоставлено Nir Aides; bpo-7610.)

    Функция is_zipfile() теперь принимает файловый объект в дополнение к именам путей, принятым в более ранних версиях. (Автор: Габриэль Дженеллина; bpo-4756.)

    Метод writestr() теперь имеет необязательный параметр compress_type, который позволяет переопределить метод сжатия по умолчанию, указанный в конструкторе ZipFile. (Автор: Рональд Оуссорен; bpo-6003.)

Новый модуль: importlib

Python 3.1 включает в себя пакет importlib, представляющий собой повторную реализацию логики, лежащей в основе инструкции Python import. importlib полезен разработчикам интерпретаторов Python и пользователям, которые хотят написать новые импортеры, которые могут участвовать в разработке. процесс импорта. Python 2.7 не содержит полного пакета importlib, но вместо этого имеет крошечное подмножество, содержащее одну функцию, import_module().

import_module(name, package=None) импортирует модуль. name - это строка, содержащая название модуля или пакета. Можно выполнить относительный импорт, указав строку, которая начинается с символа ., например ..utils.errors. Для относительного импорта должен быть указан аргумент package, который является именем пакета, который будет использоваться в качестве привязки для относительного импорта. import_module() одновременно вставляет импортированный модуль в sys.modules и возвращает объект module.

Вот несколько примеров:

>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

importlib был реализован Бреттом Кэнноном и представлен в Python 3.1.

Новый модуль: 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 не поддерживаются Тареком Зиаде, который также запустил пакет Distutils2 (репозиторий исходных текстов по адресу https://hg.python.org/distutils2/) для разработки версии Distutils следующего поколения.

ttk: Тематические виджеты для Tk

Tcl/Tk 8.5 включает в себя набор тематических виджетов, которые повторяют базовые виджеты Tk, но имеют более настраиваемый внешний вид и, следовательно, могут больше походить на виджеты родной платформы. Этот набор виджетов изначально назывался Tile, но был переименован в Ttk (что означает «тематическое Тз») после добавления в Tcl/Tk версии 8.5.

Чтобы узнать больше, ознакомьтесь с документацией по модулю ttk. Возможно, вы также захотите ознакомиться со страницей руководства по Tcl/Tk, описывающей движок тем Ttk, доступной по адресу https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Некоторые скриншоты используемого кода на Python/Ttk приведены по адресу https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.

Модуль tkinter.ttk был написан Гильерме Поло и добавлен в bpo-2983. Альтернативная версия под названием Tile.py, написанная Мартином Франклином и поддерживаемая Кевином Уолцером, была предложена для включения в bpo-2618, но авторы утверждали, что работа Гильерме Поло была более всеобъемлющей.

Обновленный модуль: 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 немедленно останавливает выполнение теста при сбое, вместо того чтобы продолжать выполнение дальнейших тестов. (Предложено Клиффом Дайером и реализовано Майклом Фордом; bpo-8074.)

В сообщениях о ходе выполнения теперь отображается «x» для ожидаемых сбоев и «u» для неожиданных успехов при запуске в подробном режиме. (Автор: Бенджамин Питерсон).

Тестовые примеры могут вызывать исключение SkipTest для пропуска теста (bpo-1034053).

Сообщения об ошибках при сбоях assertEqual(), assertTrue(), и assertFalse() теперь содержат больше информации. Если вы установите для атрибута longMessage ваших классов TestCase значение true, то при сбоях будут выводиться как стандартные сообщения об ошибках, так и любые дополнительные сообщения, которые вы предоставите. (Добавлено Майклом Фордом; bpo-5663.)

Метод assertRaises() теперь возвращает обработчик контекста при вызове, не предоставляя вызываемый объект для запуска. Например, вы можете написать это:

with self.assertRaises(KeyError):
    {}['foo']

(Реализовано Антуаном Питру; bpo-4444.)

Теперь поддерживается настройка и демонтаж на уровне модуля и класса. Модули могут содержать функции setUpModule() и tearDownModule(). Классы могут иметь setUpClass() и tearDownClass() методы, которые должны быть определены как методы класса (с использованием @classmethod или эквивалентных методов). Эти функции и методы вызываются, когда тестировщик переключается на тестовый набор в другом модуле или классе.

Добавлены методы addCleanup() и doCleanups(). addCleanup() позволяет добавлять функции очистки, которые будут вызываться безоговорочно (после setUp(), если setUp() завершается ошибкой, в противном случае после tearDown()). Это позволяет значительно упростить распределение и высвобождение ресурсов во время тестов (bpo-5679).

Был добавлен ряд новых методов, которые предоставляют более специализированные тесты. Многие из этих методов были написаны инженерами Google для использования в их наборах тестов; Грегори П. Смит, Майкл Фоорд и GvR работали над их объединением с версией Python unittest.

  • assertIsNone() и assertIsNotNone() берут одно выражение и проверяют, является ли результат None или нет.

  • assertIs() и assertIsNot() принимают два значения и проверяют, относятся ли эти два значения к одному и тому же объекту или нет. (Добавлено Майклом Фордом; bpo-2578.)

  • assertIsInstance() и assertNotIsInstance() проверяют, является ли результирующий объект экземпляром определенного класса или одного из множества классов. (Добавлено Георгом Брандлом; bpo-7031.)

  • assertGreater(), assertGreaterEqual(), assertLess(), и assertLessEqual() сравните две величины.

  • assertMultiLineEqual() сравнивает две строки и, если они не равны, отображает полезное сравнение, которое подчеркивает различия в двух строках. Это сравнение теперь используется по умолчанию при сравнении строк в Юникоде с assertEqual().

  • assertRegexpMatches() и assertNotRegexpMatches() проверяют, является ли первый аргумент строкой, соответствующей или не соответствующей регулярному выражению, указанному в качестве второго аргумента (bpo-8038).

  • assertRaisesRegexp() проверяет, вызвано ли конкретное исключение, а затем также проверяет, соответствует ли строковое представление исключения предоставленному регулярному выражению.

  • assertIn() и assertNotIn() проверяют, находится ли первый во втором или нет.

  • assertItemsEqual() проверяет, содержат ли две предоставленные последовательности одинаковые элементы.

  • assertSetEqual() сравнивает, равны ли два набора, и сообщает о различиях между наборами только в случае ошибки.

  • Аналогично, assertListEqual() и assertTupleEqual() сравнивают указанные типы и объясняют любые различия, не обязательно выводя их полные значения; эти методы теперь используются по умолчанию при сравнении списков и кортежей с использованием assertEqual(). В более общем плане, assertSequenceEqual() сравнивает две последовательности и может дополнительно проверить, относятся ли обе последовательности к определенному типу.

  • assertDictEqual() сравнивает два словаря и сообщает о различиях; теперь он используется по умолчанию при сравнении двух словарей с помощью assertEqual(). assertDictContainsSubset() проверяет, все ли пары ключ/значение в первом найдены в втором.

  • assertAlmostEqual() и assertNotAlmostEqual() проверяют, являются ли первый и второй приблизительно равными. Этот метод может либо округлить их разницу до произвольно указанного количества мест (по умолчанию - 7) и сравнить ее с нулем, либо потребовать, чтобы разница была меньше указанного значения дельта.

  • loadTestsFromName() должным образом соответствует suiteClass атрибуту TestLoader. (Исправлено Марком Родди; bpo-6866.)

  • Новый хук позволяет расширить метод assertEqual() для обработки новых типов данных. Метод addTypeEqualityFunc() принимает тип object и функцию. Функция будет использоваться, когда оба сравниваемых объекта относятся к указанному типу. Эта функция должна сравнивать два объекта и вызывать исключение, если они не совпадают; было бы неплохо, чтобы функция предоставляла дополнительную информацию о том, почему эти два объекта не совпадают, во многом так же, как это делают новые методы сравнения последовательностей.

unittest.main() теперь принимает необязательный аргумент exit. Если значение равно false, то main() не вызывает sys.exit(), позволяя использовать main() из интерактивного интерпретатора. (Автор: Х. Пабло Фернандес; bpo-3379.)

TestResult содержит новые методы startTestRun() и stopTestRun(), которые вызываются непосредственно перед тестовым запуском и после него. (Автор Роберт Коллинз; bpo-5728.)

Со всеми этими изменениями unittest.py стал слишком большим, поэтому модуль был преобразован в пакет, а код разделен на несколько файлов (автор Бенджамин Петерсон). Это не влияет на то, как модуль импортируется или используется.

См.также

https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml

Описывает новые функции, способы их использования и обоснование различных дизайнерских решений. (Автор Майкл Фурд).

Обновленный модуль: ElementTree 1.3

Версия библиотеки ElementTree, входящей в состав Python, была обновлена до версии 1.3. Некоторые из новых функций включают:

  • Различные функции синтаксического анализа теперь принимают аргумент ключевого слова parser, в котором указывается XMLParser, который будет использоваться. Это позволяет переопределить внутреннюю кодировку файла:

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)
    

    Ошибки при синтаксическом анализе XML теперь вызывают исключение ParseError, экземпляры которого имеют атрибут position, содержащий кортеж (строка, столбец), указывающий местоположение проблемы.

  • Код Elementtree для преобразования деревьев в строку был значительно переработан, что во многих случаях делает его примерно в два раза быстрее. Методы ElementTree.write() и Element.write() теперь имеют параметр method, который может быть «xml» (по умолчанию), «html» или «text». Режим HTML будет выводить пустые элементы как <empty></empty> вместо <empty/>, а текстовый режим будет пропускать элементы и выводить только фрагменты текста. Если вы установите для атрибута tag значение None, но оставите его дочерние элементы на месте, элемент будет опущен при записи дерева, поэтому вам не нужно выполнять более обширную перестановку, чтобы удалить один элемент.

    Также улучшена обработка пространства имен. Все объявления xmlns:<whatever> теперь выводятся в корневом элементе, а не разбросаны по всему результирующему XML-файлу. Вы можете задать пространство имен по умолчанию для дерева, установив атрибут default_namespace, и зарегистрировать новые префиксы с помощью register_namespace(). В режиме XML вы можете использовать параметр true/false 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)
    
    # Outputs <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>""")
    
    # Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
    print list(t.itertext())
    
  • Устаревший: using an element as a Boolean (i.e., if elem:) would return true if the element had any children, or false if there were no children. This behaviour is confusing – None is false, but so is a childless element? – so it will now trigger a FutureWarning. In your code, you should be explicit: write len(элемент) != 0 if you’re interested in the number of children, or `` элемент - это не None`.

Фредрик Лунд разрабатывает ElementTree и выпустил версию 1.3; вы можете прочитать его статью с описанием версии 1.3 по адресу https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Флорент Сиклуна обновил версию, входящую в состав Python, после обсуждения на python-dev и в bpo-6472.)

Изменения в сборке и C API

Изменения в процессе сборки Python и в C API включают:

  • Последней версией отладчика GNU, GDB 7, может быть scripted using Python. Когда вы начинаете отладку исполняемой программы P, GDB будет искать файл с именем P-gdb.py и автоматически считывать его. Дэйв Малкольм внес свой вклад в python-gdb.py, который добавляет ряд команд, полезных при отладке самого Python. Например, py-up и py-down поднимают или опускают один фрейм стека Python, который обычно соответствует нескольким фреймам стека C. py-print выводит значение переменной Python, а py-bt выводит трассировку стека Python. (Добавлено в результате bpo-8032.)

  • Если вы используете файл .gdbinit, поставляемый с Python, макрос «pyo» в версии 2.7 теперь работает корректно, когда отлаживаемый поток не содержит GIL; теперь макрос получает его перед печатью. (Автор: Виктор Стиннер; bpo-3632.)

  • : c:func:Py_AddPendingCall теперь потокобезопасен, позволяя любому рабочему потоку отправлять уведомления в основной поток Python. Это особенно полезно для асинхронных операций ввода-вывода. (Автор: Кристьян Валюр Йонссон; bpo-4293.)

  • Новая функция: PyCode_NewEmpty() создает пустой объект кода; требуются только имя файла, название функции и номер первой строки. Это полезно для модулей расширения, которые пытаются создать более полезный стек обратной трассировки. Ранее для таких расширений требовалось вызывать PyCode_New(), у которого было намного больше аргументов. (Добавлено Джеффри Яськиным.)

  • Новая функция: PyErr_NewExceptionWithDoc() создает новый класс исключений, точно так же, как это делает существующий PyErr_NewException(), но принимает дополнительный аргумент char *, содержащий строку документации для нового класса исключений. ((Добавлено „lekma“ в систему отслеживания ошибок Python; bpo-7033.)

  • Новая функция: PyFrame_GetLineNumber() принимает объект frame и возвращает номер строки, которую в данный момент выполняет фрейм. Ранее в коде требовалось получить индекс выполняемой в данный момент команды байт-кода, а затем найти номер строки, соответствующий этому адресу. (Добавлено Джеффри Яськиным.)

  • Новые функции: PyLong_AsLongAndOverflow() и PyLong_AsLongLongAndOverflow() приближают длинное целое число Python к C long или long long. Если число слишком велико, чтобы соответствовать типу вывода, устанавливается флаг переполнения, который возвращается вызывающей стороне. (Добавлено Кейсом Ван Хорсеном; 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 должен анализировать символы независимым от языкового стандарта способом. (Добавлено Эриком Смитом; bpo-5793.)

  • Удаленная функция: PyEval_CallObject() теперь доступна только в виде макроса. Для сохранения совместимости с ABI-компоновками сохранялась версия функции, но это было в 1997 году; к настоящему времени ее, безусловно, можно удалить. (Снято Антуаном Питру; bpo-8276.)

  • Новые коды формата: функции PyString_FromFormat(), PyString_FromFormatV() и PyErr_Format() теперь принимают коды формата %lld и %llu для отображения символов C long long типов. (Автор: Марк Дикинсон; bpo-7228.)

  • Изменено сложное взаимодействие между потоками и разветвление процессов. Ранее дочерний процесс, созданный с помощью os.fork(), мог завершиться ошибкой, поскольку дочерний процесс создается только с одним запущенным потоком, выполняющим os.fork(). Если бы другие потоки удерживали блокировку, такую как блокировка импорта в Python, при выполнении форка блокировка все равно была бы помечена как «удерживаемая» в новом процессе. Но в дочернем процессе ничто никогда не снимало блокировку, поскольку другие потоки не реплицировались, и дочерний процесс больше не мог выполнять импорт.

    Python 2.7 получает блокировку импорта перед выполнением os.fork(), а также удаляет все блокировки, созданные с помощью модуля threading. Модули расширения C, которые имеют внутренние блокировки или которые сами вызывают fork(), не выиграют от этой очистки.

    (Исправлено Томасом Ваутерсом; bpo-1590864.)

  • Функция Py_Finalize() теперь вызывает внутреннюю функцию threading._shutdown(); это предотвращает возникновение некоторых исключений при завершении работы интерпретатора. (Исправление от Адама Олсена; bpo-1722344.)

  • При использовании структуры PyMemberDef для определения атрибутов типа, Python больше не позволит вам пытаться удалить или установить атрибут T_STRING_INPLACE.

  • Глобальные символы, определенные модулем ctypes, теперь имеют префикс Py или _ctypes. (Реализовано Томасом Хеллером; bpo-3102.)

  • Новая опция настройки: параметр --with-system-expat позволяет создавать модуль pyexpat для использования системной библиотеки Expat. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-7609.)

  • Новая опция настройки: опция --with-valgrind теперь отключает распределитель pymalloc, что затрудняет корректный анализ детектором ошибок памяти Valgrind. Таким образом, Valgrind будет лучше обнаруживать утечки и перерасход памяти. (Автор: Джеймс Хенстридж; bpo-2422.)

  • Новая опция настройки: теперь вы можете ввести пустую строку в поле --with-dbmliborder=, чтобы отключить все различные модули СУБД. (Добавлено пользователем Frehtes Taifersar Arahesis; bpo-6491.)

  • Скрипт configure теперь проверяет ошибки округления с плавающей запятой в некоторых 32-разрядных процессорах Intel и определяет определение препроцессора X87_DOUBLE_ROUNDING. В настоящее время это определение не используется в коде, но оно доступно, если кто-то захочет его использовать. (Добавлено Марком Дикинсоном; bpo-2937.)

    configure также теперь задает переменную LDCXXSHARED Makefile для поддержки компоновки на C++. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)

  • В процессе сборки теперь создаются необходимые файлы для поддержки pkg-config. (Автор: Клинтон Рой; bpo-3585.)

  • Процесс сборки теперь поддерживает Subversion 1.7. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-6094.)

Капсулы

Python 3.1 добавляет новый тип данных C, PyCapsule, для предоставления Capitol модуля расширения. Капсула, по сути, является носителем указателя C void * и доступна как атрибут модуля; например, API модуля socket отображается как socket.CAPI и unicodedata раскрывает ucnhash_CAPI. Другие расширения могут импортировать модуль, обращаться к его словарю, чтобы получить объект capsule, а затем получить указатель void *, который обычно указывает на массив указателей на различные функции API модуля.

Для этого уже используется существующий тип данных PyCObject, но он не обеспечивает безопасность типов. Вредоносный код, написанный на чистом Python, может вызвать ошибку сегментации, если взять : c:type:!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. Обратитесь к Предоставление API на языке C для модуля расширения для получения дополнительной информации об использовании этих объектов.

Python 2.7 теперь использует capsules для предоставления различных API-интерфейсов модулей расширения, но PyCObject_AsVoidPtr() был изменен для работы с capsules, сохраняя совместимость во время компиляции с интерфейсом PyCObject. Использование PyCObject_AsVoidPtr() будет сигнализировать о PendingDeprecationWarning, который по умолчанию отключен.

Реализован на Python 3.1 и перенесен в версию 2.7 Ларри Гастингсом; обсуждался в bpo-5630.

Изменения, относящиеся к конкретному порту: Windows

  • Модуль msvcrt теперь содержит некоторые константы из заголовочного файла crtassem.h: CRT_ASSEMBLY_VERSION, VC_ASSEMBLY_PUBLICKEYTOKEN, и LIBRARIES_ASSEMBLY_NAME_PREFIX. (Автор: Дэвид Курнапо; bpo-4365.)

  • Модуль _winreg для доступа к реестру теперь реализует функции CreateKeyEx() и DeleteKeyEx() - расширенные версии ранее поддерживаемых функций, которые принимают несколько дополнительных аргументов. Методы DisableReflectionKey(), EnableReflectionKey(), и QueryReflectionKey() также были протестированы и задокументированы. (Реализован Брайаном Кертином: bpo-7347.)

  • _beginthreadex`Для запуска потоков используется новый: c < < < 0>>> API, и теперь используются собственные функции локального хранилища потоков. (Автор: Кристьян Валюр Йонссон; :issue:`3582().)

  • Функция os.kill() теперь работает в Windows. Значением сигнала могут быть константы CTRL_C_EVENT, CTRL_BREAK_EVENT, или любое целое число. Первые две константы будут отправлять Control-C и Control-Break события нажатия клавиши в подпроцессы; любое другое значение будет использовать TerminateProcess() API. (Автор: Мики Тебека; bpo-1220212.)

  • Функция os.listdir() теперь корректно завершается ошибкой для пустого пути. (Исправлено Хирокадзу Ямамото; bpo-5913.)

  • Модуль mimetypes теперь будет считывать базу данных MIME из реестра Windows при инициализации. (Исправление от Gabriel Genellina; bpo-4969.)

Изменения, связанные с конкретными портами: Mac OS X

  • Путь /Library/Python/2.7/site-packages теперь добавлен к sys.path, чтобы совместно использовать добавленные пакеты при установке системы и копии той же версии, установленной пользователем. (Изменено Рональдом Оуссореном; bpo-4865.)

    Изменено в версии 2.7.13: Начиная с версии 2.7.13, это изменение было удалено. /Library/Python/2.7/site-packages, каталог site-packages, используемый поставляемой Apple системой Python 2.7, больше не добавляется к sys.path для установленных пользователем Pythons, например, из установщиков python.org. Начиная с macOS 10.12, Apple изменила настройку системного каталога site-packages, что может привести к сбою установки компонентов pip, таких как setuptools. Пакеты, установленные для системного Python, больше не будут использоваться совместно с установленными пользователями Pythons. (bpo-28440)

Изменения, касающиеся конкретных портов: FreeBSD

  • Константа SO_SETFIB во FreeBSD 7.1, используемая с помощью методов socket() getsockopt()/setsockopt() для выбора альтернативной таблицы маршрутизации, теперь доступна в модуле socket. (Добавлено Кайлом Вандербиком; bpo-8235.)

Другие изменения и исправления

  • В каталог Tools были добавлены два тестовых сценария, iobench и ccbench. iobench измеряет скорость встроенных файловых объектов ввода-вывода, возвращаемых open() при выполнении различных операций, а ccbench - это тест параллелизма, который пытается измерить пропускную способность вычислений, задержку переключения потоков и обработку ввода-вывода пропускная способность при выполнении нескольких задач с использованием различного количества потоков.

  • Сценарий Tools/i18n/msgfmt.py теперь понимает формы множественного числа в файлах .po. (Исправлено Мартином фон Левисом; bpo-5464.)

  • При импорте модуля из файла .pyc или .pyo с существующим аналогом .py атрибуты co_filename результирующих объектов кода перезаписываются, когда исходное имя файла становится устаревшим. Это может произойти, если файл был переименован, перемещен или доступ к нему осуществляется по разным путям. (Пластырь Зиги Зайлнахта и Жан-Поля Кальдероне; bpo-1180193.)

  • Сценарий regrtest.py теперь использует переключатель --randseed=, который принимает целое число, которое будет использоваться в качестве случайного начального значения для параметра -r, который выполняет тесты в случайном порядке. Параметр -r также указывает количество использованных семян (добавлено Collin Winter).

  • Другим параметром regrtest.py является -j, который принимает целое число, указывающее, сколько тестов выполняется параллельно. Это позволяет сократить общее время выполнения на многоядерных компьютерах. Этот параметр совместим с несколькими другими параметрами, включая переключатель -R, который, как известно, обеспечивает длительное время работы. (Добавлено Антуаном Питру, bpo-6152.) Это также можно использовать с новым переключателем -F, который запускает выбранные тесты в цикле до тех пор, пока они не завершатся неудачей. (Добавлено Антуаном Питру; bpo-7312.)

  • При выполнении в виде скрипта модуль py_compile.py теперь принимает '-' в качестве аргумента, который будет считывать стандартный ввод для списка имен файлов, подлежащих компиляции. (Автор: Петр Ожаровский; bpo-8233.)

Перенос на Python 2.7

В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код:

  • Функция range() обрабатывает свои аргументы более последовательно; теперь она будет вызывать __int__() для передаваемых ей аргументов, не являющихся числами с плавающей точкой, нецелыми числами. (Исправлено Александром Белопольским; bpo-1533.)

  • Метод string format() изменил точность по умолчанию, используемую для чисел с плавающей запятой и комплексных чисел, с 6 знаков после запятой на 12, что соответствует точности, используемой в str(). (Изменено Эриком Смитом; bpo-5920.)

  • Из-за оптимизации для оператора with специальные методы __enter__() и __exit__() должны принадлежать типу объекта и не могут быть напрямую привязаны к экземпляру объекта. Это влияет на классы нового стиля (производные от object) и типы расширений C. (bpo-6101.)

  • Из-за ошибки в Python 2.6 параметр exc_value для методов __exit__() часто был строковым представлением исключения, а не экземпляром. Это было исправлено в версии 2.7, поэтому exc_value будет экземпляром, как и ожидалось. (Исправлено Florent Xicluna; bpo-7853.)

  • Когда ограниченный набор атрибутов был задан с помощью __slots__, удаление неустановленного атрибута не приводило к появлению AttributeError, как можно было бы ожидать. Исправлено Бенджамином Питерсоном; bpo-7604.)

В стандартной библиотеке:

  • Операции с экземплярами datetime, в результате которых значение года выходило за пределы поддерживаемого диапазона, не всегда приводили к возникновению OverflowError. Такие ошибки теперь проверяются более тщательно и теперь будут вызывать исключение. (Репортаж Марка Лиандера, патч Ананда Б. Пиллаи и Александра Белопольского; bpo-7150.)

  • При использовании экземпляров Decimal со строковым методом format() выравнивание по умолчанию ранее выполнялось по левому краю. Это значение было изменено на выравнивание по правому краю, что может привести к изменению выходных данных ваших программ. (Изменено Марком Дикинсоном; bpo-6857.)

    Сравнения, включающие сигнальное значение NaN (или sNAN), теперь сигнализируют о значении InvalidOperation вместо того, чтобы автоматически возвращать значение true или false в зависимости от оператора сравнения. Значения NaN (или NaN) теперь доступны для хэширования. (Исправлено Марком Дикинсоном; bpo-7279.)

  • Библиотека xml.etree.ElementTree больше не экранирует амперсанды и угловые скобки при выводе команды обработки XML (которая выглядит как <?xml-stylesheet href="#style1"?>) или комментария (который выглядит как <!-- comment -->). (Патч от Нила Мюллера; bpo-2746.)

  • Метод readline() объектов StringIO теперь ничего не делает при запросе отрицательной длины, как это делают другие файловые объекты. (bpo-7348).

  • Модуль syslog теперь будет использовать значение sys.argv[0] в качестве идентификатора вместо предыдущего значения по умолчанию 'python'. (Изменено Шоном Райфшнайдером; bpo-8451.)

  • В модуле tarfile изменена обработка ошибок по умолчанию, чтобы больше не подавлять фатальные ошибки. Уровень ошибок по умолчанию ранее был равен 0, что означало, что ошибки приводили только к записи сообщения в журнал отладки, но поскольку журнал отладки по умолчанию не активирован, эти ошибки остаются незамеченными. Уровень ошибок по умолчанию теперь равен 1, что приводит к возникновению исключения при наличии ошибки. (Изменено Ларсом Густабелем; bpo-7357.)

  • Модуль urlparse urlsplit() теперь обрабатывает неизвестные схемы 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, использующие коды целочисленного формата с семейством функций PyArg_Parse*, теперь будут вызывать исключение TypeError вместо запуска DeprecationWarning (bpo-5080).

  • Используйте новую функцию PyOS_string_to_double() вместо старых функций PyOS_ascii_strtod() и PyOS_ascii_atof(), которые в настоящее время являются устаревшими.

Для приложений, использующих Python:

  • Была добавлена функция PySys_SetArgvEx(), позволяющая приложениям закрывать брешь в системе безопасности при использовании существующей функции PySys_SetArgv(). Проверьте, вызываете ли вы:c:func:PySys_SetArgv и тщательно обдумайте, должно ли приложение использовать PySys_SetArgvEx() с параметром updatepath, равным false.

В обновленные версии Python 2.7 добавлены новые функции

В обновленные версии Python 2.7 могут быть добавлены новые функции, когда этого действительно потребует ситуация. Любые подобные дополнения должны пройти процедуру рассмотрения предложения по улучшению Python и убедительно обосновать, почему они не могут быть должным образом устранены либо путем добавления новой функции исключительно в Python 3, либо путем публикации ее в индексе пакетов Python.

В дополнение к конкретным предложениям, перечисленным ниже, существует общее исключение, позволяющее добавлять новые предупреждения -3 в любой технический выпуск Python 2.7.

Две новые переменные среды для режима отладки

В режиме отладки статистика [xxx refs] по умолчанию не записывается, теперь также должна быть установлена переменная окружения PYTHONSHOWREFCOUNT. (Автор: Виктор Стиннер; bpo-31733.)

Когда Python компилируется с заданным значением COUNT_ALLOC, количество выделений больше не выводится по умолчанию: теперь также должна быть установлена переменная окружения PYTHONSHOWALLOCCOUNT. Более того, количество выделений теперь выводится в stderr, а не в стандартный вывод. (Автор: Виктор Стиннер; bpo-31692.)

Добавлено в версии 2.7.15.

PEP 434: Исключение для улучшения простоя для всех филиалов

PEP 434 описывает общее исключение для изменений, внесенных в среду разработки IDLE, поставляемую вместе с Python. Это исключение позволяет разработчикам IDLE обеспечить более согласованное взаимодействие с пользователями во всех поддерживаемых версиях Python 2 и 3.

Для получения подробной информации о любых изменениях в режиме ОЖИДАНИЯ обратитесь к файлу НОВОСТЕЙ для конкретного выпуска.

PEP 466: Улучшения сетевой безопасности для 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. (Автор: Алекс Гейнор; bpo-21306.)

  • Версия OpenSSL 1.0.1g была обновлена в официальных установщиках Windows, опубликованных на python.org. (Автор - Захари Уэр; bpo-21462.)

PEP 466 соответствующие функции добавлены в Python 2.7.8:

  • hashlib.pbkdf2_hmac() был перенесен с Python 3, чтобы сделать алгоритм хэширования, подходящий для безопасного хранения паролей, широко доступным для приложений на Python 2. (Автор: Алекс Гейнор; 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 теперь поддерживает указание имени сервера, настройки TLS 1.x, доступ к хранилищу сертификатов платформы, класс SSLContext и другие функции. (Авторы: Алекс Гейнор и Дэвид Рид; bpo-21308.)

    Для получения более подробной информации обратитесь к примечаниям «Добавлена версия: 2.7.9» в документации к модулю.

  • Было изменено значение os.urandom() для кэширования файлового дескриптора на /dev/urandom вместо повторного открытия /dev/urandom при каждом вызове. (Автор: Алекс Гейнор; bpo-21305.)

  • hashlib.algorithms_guaranteed и hashlib.algorithms_available были перенесены из Python 3, чтобы упростить для приложений на Python 2 выбор наиболее надежного доступного алгоритма хэширования. (Автор Алекс Гейнор в bpo-21307)

PEP 477: Обратный перенос ensurepip (PEP 453) на Python 2.7

PEP 477 одобряет включение модуля PEP 453 ensurepip и улучшенной документации, которая была включена с его помощью в выпуски поддержки Python 2.7, впервые появившиеся в выпуске Python 2.7.9.

Начальная загрузка pip по умолчанию

Новый модуль 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 source builds on POSIX systems команды make install и make altinstall по умолчанию не запускают pip. Этим поведением можно управлять с помощью параметров configure и переопределять с помощью параметров Makefile.

В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают pip вместе с самим CPython (пользователи могут отказаться от его установки в процессе установки). Пользователям Windows необходимо будет выбрать автоматические изменения PATH, чтобы по умолчанию из командной строки было доступно pip, в противном случае к нему все еще можно получить доступ через программу запуска Python для Windows как к py -m pip.

Поскольку discussed in the PEP, разработчики пакетов для платформы могут отказаться от установки этих команд по умолчанию, при условии, что при вызове они предоставляют четкие и простые инструкции о том, как установить их на эту платформу (обычно с помощью системного менеджера пакетов).

Изменения в документации

В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в виде краткого руководства по началу работы и часто задаваемых вопросов. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide, а также в документацию по отдельным проектам.

Однако, поскольку эта миграция в настоящее время все еще не завершена, устаревшие версии этих руководств остаются доступными как Установка модулей Python (устаревшая версия) и Распространение модулей Python (устаревшая версия).

См.также

PEP 453 – Явная загрузка pip в установках Python

PEP написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Левисом и Недом Дейли.

PEP 476: Включение проверки сертификата по умолчанию для http-клиентов stdlib

PEP 476 обновлен httplib и модули, которые его используют, такие как urllib2 и xmlrpclib, чтобы теперь проверять, что сервер предоставляет сертификат, подписанный Центром сертификации в хранилище доверия платформы и имя хоста которого совпадает с именем хоста, запрашиваемым по умолчанию, что значительно повышает безопасность многих приложений. Это изменение было внесено в версию Python 2.7.9.

Для приложений, которым требуется прежнее поведение, они могут передавать альтернативный контекст:

import urllib2
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib2.urlopen("https://invalid-cert", context=context)

PEP 493: Инструменты миграции проверки HTTPS для 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

Чтобы упростить перекрестную компиляцию и обеспечить надежную компиляцию CPython без необходимости наличия существующей версии Python, система сборки на основе autotools больше не пытается неявно перекомпилировать сгенерированные файлы в зависимости от времени изменения файла.

Вместо этого была добавлена новая команда make regen-all для принудительной регенерации этих файлов по желанию (например, после того, как начальная версия Python уже была собрана на основе предварительно сгенерированных версий).

Также определены более избирательные цели регенерации - подробнее смотрите в разделе Makefile.pre.in.

(Автор: Виктор Стиннер в bpo-23404.)

Добавлено в версии 2.7.14.

Удаление make touch целевого объекта сборки

Цель сборки make touch, ранее использовавшаяся для запроса неявной регенерации сгенерированных файлов путем обновления времени их модификации, была удалена.

Он был заменен новой целью make regen-all.

(Автор: Виктор Стиннер в bpo-23404.)

Изменено в версии 2.7.14.

Признание

Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь в работе над различными вариантами этой статьи: Ника Коглана, Филипа Дженви, Райана Ловетта, Р. Дэвида Мюррея, Хью Секер-Уокера.

Вернуться на верх