Документация Python неофициальный перевод
Содержание страницы

Что нового в Python 2.7What’s New in Python 2.7

Автор

A.M. Kuchling (amk at amk.ca)

Эта статья описывает новые возможности в Python 2.7. Python 2.7 был выпущен 3 июля 2010 года.

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

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

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

Будущее Python 2.xThe Future for Python 2.x

Python 2.7 – последний крупный выпуск в серии 2.x, поскольку разработчики Python переключили усилия по разработке новых возможностей на серию Python 3.x. Это означает, что хотя Python 2 продолжает получать исправления ошибок и обновляться для корректной сборки на новом оборудовании и новых версиях поддерживаемых операционных систем, не будет новых полноценных релизов языка или стандартной библиотеки.

Однако, хотя между Python 2.7 и Python 3 существует большое общее подмножество, и многие изменения, связанные с миграцией на это общее подмножество или непосредственно на Python 3, можно безопасно автоматизировать, некоторые другие изменения (особенно связанные с обработкой Unicode) могут потребовать тщательного рассмотрения и, желательно, надежных автоматизированных наборов регрессионных тестов для эффективной миграции.

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

Некоторые ключевые следствия долгосрочного значения 2.7:

  • Как отмечено выше, выпуск 2.7 имеет гораздо более длительный период поддержки по сравнению с более ранними версиями 2.x. Ожидается, что Python 2.7 будет поддерживаться основной командой разработчиков (получать обновления безопасности и другие исправления ошибок) как минимум до 2020 года (10 лет после первоначального выпуска, по сравнению с более типичным периодом поддержки 18–24 месяца).

  • По мере старения стандартной библиотеки Python 2.7 эффективное использование Python Package Index (напрямую или через редистрибьютора) становится более важным для пользователей Python 2. В дополнение к широкому спектру сторонних пакетов для различных задач, доступные пакеты включают бэкпорты новых модулей и функций из стандартной библиотеки Python 3, совместимые с Python 2, а также различные инструменты и библиотеки, которые могут облегчить миграцию на Python 3. Python Packaging User Guide содержит рекомендации по загрузке и установке программного обеспечения из Python Package Index.

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

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

Изменения в обработке предупреждений об устареванииChanges to the Handling of Deprecation Warnings

Для Python 2.7 было принято решение по умолчанию подавлять предупреждения, представляющие интерес только для разработчиков. DeprecationWarning и его потомки теперь игнорируются, если не запрошено иное, что предотвращает появление у пользователей предупреждений, вызванных приложением. Это изменение также было сделано в ветке, ставшей Python 3.2. (Обсуждалось в stdlib-sig и реализовано в bpo-7319.)

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

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

Можно повторно включить отображение сообщений DeprecationWarning, запустив Python с ключом -Wdefault (короткая форма: -Wd) или установив переменную окружения PYTHONWARNINGS в значение "default" (или "d") перед запуском Python. Код Python также может снова включить их, вызвав warnings.simplefilter('default').

Модуль unittest также автоматически включает предупреждения об устаревании при запуске тестов.

Возможности Python 3.1Python 3.1 Features

Подобно тому, как Python 2.6 включал возможности из Python 3.0, версия 2.7 включает некоторые новые возможности из Python 3.1. Серия 2.x продолжает предоставлять инструменты для миграции на серию 3.x.

Частичный список возможностей 3.1, которые были перенесены в 2.7:

  • Синтаксис литералов множеств ({1,2,3} – изменяемое множество).

  • Словарные включения и включения множеств ({i: i*2 for i in range(3)}).

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

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

  • Тип упорядоченного словаря, описанный в PEP 372: Adding an Ordered Dictionary to collections.

  • Новый спецификатор формата ",", описанный в PEP 378: Format Specifier for Thousands Separator.

  • Объект memoryview.

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

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

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

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

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

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

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

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

PEP 372: Добавление упорядоченного словаря в collectionsPEP 372: Adding an Ordered Dictionary to collections

Обычные словари Python перебирают пары ключ/значение в произвольном порядке. За эти годы многие авторы написали альтернативные реализации, которые запоминают порядок, в котором ключи были изначально вставлены. Основываясь на опыте этих реализаций, версия 2.7 вводит новый класс OrderedDict в модуль collections.

API OrderedDict предоставляет тот же интерфейс, что и обычные словари, но перебирает ключи и значения в гарантированном порядке, зависящем от того, когда ключ был вставлен первым:

>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]

Если новая запись перезаписывает существующую, исходное положение вставки остаётся без изменений:

>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]

Удаление записи и повторная вставка переместит её в конец:

>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]

Метод popitem() имеет необязательный аргумент last, который по умолчанию равен True. Если last равен true, возвращается и удаляется самый недавно добавленный ключ; если он равен false, выбирается самый старый ключ:

>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)

Сравнение двух упорядоченных словарей проверяет как ключи, так и значения, и требует, чтобы порядок вставки был одинаковым:

>>> od1 = OrderedDict([('first', 1),
...                    ('second', 2),
...                    ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
...                    ('first', 1),
...                    ('second', 2)])
>>> od1 == od2
False
>>> # Переместить ключ 'third' в конец
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True

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

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

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

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

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

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

См. также

PEP 372 – Добавление упорядоченного словаря в collections

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

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

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

Полностью общее решение для этого – модуль locale, который может использовать разные разделители (“,” в Северной Америке, “.” в Европе) и разные размеры групп, но locale сложен в использовании и непригоден для многопоточных приложений, где разные потоки создают вывод для разных локалей.

Поэтому в мини-язык, используемый методом str.format(), был добавлен простой механизм группировки запятыми. При форматировании числа с плавающей запятой просто укажите запятую между шириной и точностью:

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

При форматировании целого числа укажите запятую после ширины:

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

Этот механизм совершенно не настраивается; запятые всегда используются в качестве разделителя, а группировка всегда по три цифры. Механизм форматирования запятыми не так универсален, как модуль locale, но проще в использовании.

См. также

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

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

PEP 389: Модуль argparse для разбора командной строкиPEP 389: The argparse Module for Parsing Command Lines

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

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

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

Вот пример:

import argparse

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

# Добавить необязательные переключатели
parser.add_argument('-v', action='store_true', dest='is_verbose',
                    help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
                    metavar='FILE',
                    help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
                    metavar='NUM', default=0,
                    help='display NUM lines of added context')

# Разрешить любое количество дополнительных аргументов.
parser.add_argument(nargs='*', action='store', dest='inputs',
                    help='input filenames (default is stdin)')

args = parser.parse_args()
print args.__dict__

Если не переопределить их, ключи -h и --help добавляются автоматически и формируют аккуратно отформатированный вывод:

-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context

Как и в optparse, ключи и аргументы командной строки возвращаются как объект с атрибутами, названными в соответствии с параметрами dest:

-> ./python.exe argparse-example.py -v
{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']}

argparse обладает гораздо более мощной проверкой, чем optparse; можно указать точное количество аргументов целым числом, 0 или более аргументов, передав '*', 1 или более – передав '+', или необязательный аргумент с '?'. Родительский парсер может содержать подпарсеры для определения подкоманд с разными наборами ключей, как в svn commit, svn checkout и т.д. Тип аргумента можно указать как FileType, который автоматически откроет файлы и понимает, что '-' означает стандартный ввод или вывод.

См. также

Документация argparse

Страница документации модуля argparse.

Обновление кода optparse

Часть документации Python, описывающая, как преобразовать код, использующий optparse.

PEP 389 - argparse - Новый модуль разбора командной строки

PEP написан и реализован Стивеном Бетардом.

PEP 391: Конфигурация логирования на основе словарейPEP 391: Dictionary-Based Configuration For Logging

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

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

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

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

import logging
import logging.config

configdict = {
 'version': 1,    # Используемая схема конфигурации; пока должна быть равна 1
 'formatters': {
     'standard': {
         'format': ('%(asctime)s %(name)-15s '
                    '%(levelname)-8s %(message)s')}},

 'handlers': {'netlog': {'backupCount': 10,
                     'class': 'logging.handlers.RotatingFileHandler',
                     'filename': '/logs/network.log',
                     'formatter': 'standard',
                     'level': 'INFO',
                     'maxBytes': 1000000},
              'syslog': {'class': 'logging.handlers.SysLogHandler',
                         'formatter': 'standard',
                         'level': 'ERROR'}},

 # Указать все подчинённые логгеры
 'loggers': {
             'network': {
                         'handlers': ['netlog']
             }
 },
 # Указать свойства корневого логгера
 'root': {
          'handlers': ['syslog']
 },
}

# Настроить конфигурацию
logging.config.dictConfig(configdict)

# В качестве примера записать два сообщения об ошибках
logger = logging.getLogger('/')
logger.error('Database not found')

netlogger = logging.getLogger('network')
netlogger.error('Connection failed')

Три менее значительных улучшения модуля logging, все реализованные Винаем Саджипом:

  • Класс SysLogHandler теперь поддерживает системное журналирование через TCP. Конструктор имеет параметр socktype, указывающий тип используемого сокета: socket.SOCK_DGRAM для UDP или socket.SOCK_STREAM для TCP. Протокол по умолчанию остаётся UDP.

  • Экземпляры Logger получили метод getChild(), который получает дочерний регистратор по относительному пути. Например, получив регистратор с помощью log = getLogger('app'), вызов log.getChild('network.listen') эквивалентен getLogger('app.network.listen').

  • Класс LoggerAdapter получил метод isEnabledFor(), который принимает уровень и возвращает, будет ли соответствующий регистратор обрабатывать сообщение этого уровня важности.

См. также

PEP 391 - Конфигурация логирования на основе словарей

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

PEP 3106: Представления словарейPEP 3106: Dictionary Views

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

Невозможно изменить возвращаемые значения keys(), values() и items() в Python 2.7, потому что слишком много кода сломается. Вместо этого версии 3.x были добавлены под новыми именами viewkeys(), viewvalues() и viewitems().

>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])

Представления можно перебирать, но представления ключей и элементов также ведут себя как множества. Оператор & выполняет пересечение, а | – объединение:

>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])

Представление отслеживает словарь, и его содержимое изменяется по мере изменения словаря:

>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])

Однако обратите внимание, что нельзя добавлять или удалять ключи во время итерации по представлению:

>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

Методы представлений можно использовать в коде Python 2.x, и конвертер 2to3 заменит их на стандартные методы keys(), values() и items().

См. также

PEP 3106 - Обновление dict.keys(), .values() и .items()

PEP написан Гвидо ван Россумом. Портирован в 2.7 Александром Вассалотти; bpo-1967.

PEP 3137: Объект memoryviewPEP 3137: The memoryview Object

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

>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # Возвращает длину базового объекта
52
>>> m[0], m[25], m[26]   # Индексация возвращает один байт
('a', 'z', 'A')
>>> m2 = m[0:26]         # Срез возвращает другой memoryview
>>> m2
<memory at 0x37f080>

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

>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>

Объекты memoryview позволяют изменять базовый объект, если он является изменяемым.

>>> m2[0] = 75
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters)  # Создание изменяемого объекта
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # Присвоить значение представлению, изменив bytearray.
>>> b[0:5]              # Bytearray был изменён.
bytearray(b'*bcde')
>>>

См. также

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

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

Прочие изменения языка Other Language Changes

Некоторые небольшие изменения, внесённые в ядро языка Python:

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

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # пустое множество
    set([])
    >>> {}    # пустой словарь
    {}
    

    Портирован Александром Вассалотти; bpo-2335.

  • Генераторы словарей и множеств – ещё одна возможность, портированная из 3.x, обобщающая генераторы списков/выражения-генераторы для использования синтаксиса литералов множеств и словарей.

    >>> {x: x*x for x in range(6)}
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    >>> {('a'*x) for x in range(6)}
    set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
    

    Портирован Александром Вассалотти; bpo-2333.

  • Оператор with теперь может использовать несколько менеджеров контекста в одном операторе. Менеджеры контекста обрабатываются слева направо, и каждый из них рассматривается как начало нового оператора with. Это означает, что:

    with A() as a, B() as b:
        ... suite of statements ...
    

    эквивалентно:

    with A() as a:
        with B() as b:
            ... suite of statements ...
    

    Функция contextlib.nested() предоставляет очень похожую функциональность, поэтому она больше не нужна и объявлена устаревшей.

    (Предложено в https://codereview.appspot.com/53094; реализовано Георгом Брандлем.)

  • Преобразования между числами с плавающей запятой и строками теперь правильно округляются на большинстве платформ. Эти преобразования происходят во многих местах: str() для чисел с плавающей запятой и комплексных чисел; конструкторы float и complex; форматирование чисел; сериализация и десериализация чисел с плавающей запятой и комплексных чисел с использованием модулей marshal, pickle и json; разбор литералов чисел с плавающей запятой и мнимых чисел в коде Python; и преобразование Decimal в число с плавающей запятой.

    В связи с этим, repr() числа с плавающей запятой x теперь возвращает результат на основе кратчайшей десятичной строки, которая гарантированно округляется обратно к x при правильном округлении (с режимом округления «банковское округление»). Ранее возвращалась строка, основанная на округлении x до 17 десятичных цифр.

    Библиотека округления, отвечающая за это улучшение, работает на Windows и Unix-платформах с компиляторами gcc, icc или suncc. Может быть небольшое количество платформ, на которых корректная работа этого кода не гарантируется, поэтому код не используется на таких системах. Узнать, какой код используется, можно, проверив sys.float_repr_style, – он будет равен short, если используется новый код, и legacy, если нет.

    Реализовано Эриком Смитом и Марком Дикинсоном с использованием библиотеки dtoa.c Дэвида Гея; bpo-7117.

  • Преобразования длинных целых и обычных целых чисел в числа с плавающей запятой теперь округляются иначе, возвращая число с плавающей запятой, ближайшее к числу. Это несущественно для маленьких целых чисел, которые могут быть преобразованы точно, но для больших чисел, которые неизбежно теряют точность, Python 2.7 теперь аппроксимирует более точно. Например, Python 2.6 вычислял следующее:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935283e+20
    >>> n - long(float(n))
    65535L
    

    Результат с плавающей запятой в Python 2.7 больше, но гораздо ближе к истинному значению:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935289e+20
    >>> n - long(float(n))
    -1L
    

    (Реализовано Марком Дикинсоном; bpo-3166.)

    Целочисленное деление также стало более точным в своём поведении округления. (Также реализовано Марком Дикинсоном; bpo-1811.)

  • Неявное приведение для комплексных чисел было удалено; интерпретатор больше никогда не будет пытаться вызывать метод __coerce__() для комплексных объектов. (Удалено Мидором Инге и Марком Дикинсоном; bpo-5211.)

  • Метод str.format() теперь поддерживает автоматическую нумерацию полей замены. Это делает использование str.format() более похожим на использование форматирования %s:

    >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
    '2009:4:Sunday'
    >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
    '2009:4:Sunday'
    

    Автонумерация берёт поля слева направо, поэтому первый спецификатор {...} будет использовать первый аргумент для str.format(), следующий спецификатор – следующий аргумент и так далее. Нельзя смешивать автонумерацию и явную нумерацию – либо нумеруйте все поля спецификаторов, либо ни одного, – но можно смешивать автонумерацию и именованные поля, как во втором примере выше. (Добавлено Эриком Смитом; bpo-5237.)

    Комплексные числа теперь правильно поддерживают использование с format() и по умолчанию выравниваются вправо. Указание точности или разделения запятыми применяется как к действительной, так и к мнимой части числа, но указанная ширина поля и выравнивание применяются ко всему результирующему выводу 1.5+3j. (Добавлено Эриком Смитом; bpo-1588 и bpo-7988.)

    Код форматирования ‘F’ теперь всегда форматирует вывод заглавными символами, поэтому теперь он будет выдавать ‘INF’ и ‘NAN’. (Добавлено Эриком Смитом; bpo-3382.)

    Низкоуровневое изменение: метод object.__format__() теперь вызывает PendingDeprecationWarning, если ему передаётся строка формата, потому что метод __format__() для object преобразует объект в строковое представление и форматирует его. Ранее метод молча применял строку формата к строковому представлению, но это могло скрывать ошибки в коде Python. Если вы передаёте информацию о форматировании, например выравнивание или точность, то, вероятно, ожидаете, что форматирование будет применено специфичным для объекта способом. (Исправлено Эриком Смитом; bpo-7994.)

  • Типы int() и long() получили метод bit_length, который возвращает количество битов, необходимое для представления своего аргумента в двоичном виде:

    >>> n = 37
    >>> bin(n)
    '0b100101'
    >>> n.bit_length()
    6
    >>> n = 2**123-1
    >>> n.bit_length()
    123
    >>> (n+1).bit_length()
    124
    

    (Добавлено Фредриком Юханссоном и Виктором Стиннером; bpo-3439.)

  • Оператор import больше не будет пытаться выполнить абсолютный импорт, если относительный импорт (например, from .os import sep) завершится неудачей. Это исправляет ошибку, но может нарушить работу некоторых операторов import, которые работали только случайно. (Исправлено Meador Inge; bpo-7902.)

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

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

  • При использовании @classmethod и @staticmethod для оборачивания методов как методов класса или статических методов, объект-обёртка теперь предоставляет обёрнутую функцию в своём атрибуте __func__. (Предложено Amaury Forgeot d’Arc после предложения George Sakkis; bpo-5982.)

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

  • Теперь поддерживаются две новые кодировки: «cp720», используемая в основном для арабского текста; и «cp858», вариант CP 850, добавляющий символ евро. (CP720 добавлена Alexander Belchenko и Amaury Forgeot d’Arc в bpo-1616979; CP858 добавлена Tim Hatch в bpo-8016.)

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

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

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

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

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

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

Новая переменная окружения PYTHONWARNINGS позволяет управлять предупреждениями. Её следует установить в строку, содержащую настройки предупреждений, эквивалентные тем, что используются с ключом -W, разделённые запятыми. (Предложено Brian Curtin; bpo-7301.)

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

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

ОптимизацииOptimizations

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

  • Добавлен новый опкод для выполнения начальной настройки операторов with, выполняющий поиск методов __enter__() и __exit__(). (Предложено Benjamin Peterson.)

  • Сборщик мусора теперь работает лучше для одного распространённого шаблона использования: когда много объектов выделяется без освобождения каких-либо из них. Раньше это приводило к квадратичному времени сборки мусора, но теперь количество полных сборок мусора уменьшается по мере роста числа объектов в куче. Новая логика выполняет полный проход сборки мусора только тогда, когда среднее поколение было собрано 10 раз и когда количество выживших объектов из среднего поколения превышает 10% от количества объектов в старейшем поколении. (Предложено Martin von Löwis и реализовано Antoine Pitrou; bpo-4074.)

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

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

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

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

    (Автор: Mark Dickinson; bpo-4258.)

    Ещё один набор изменений сделал длинные объекты на несколько байт меньше: на 2 байта меньше на 32-битных системах и на 6 байт на 64-битных. (Предложено Mark Dickinson; bpo-5260.)

  • Алгоритм деления для длинных целых чисел был ускорен за счёт оптимизации внутреннего цикла, использования сдвигов вместо умножений и исправления лишней итерации. Различные тесты показывают ускорение от 50% до 150% для операций деления и взятия остатка от длинных целых чисел. (Предложено Mark Dickinson; bpo-5512.) Побитовые операции также стали значительно быстрее (начальный патч от Gregory Smith; bpo-1087418).

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

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

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

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

  • Модули pickle и cPickle теперь автоматически интернируют строки, используемые для имён атрибутов, уменьшая использование памяти объектами, полученными в результате распаковки (unpickling). (Предложено Jake McGuire; bpo-5084.)

  • Модуль cPickle теперь обрабатывает словари отдельно, сокращая почти вдвое время, необходимое для их сериализации (pickle). (Предложено Collin Winter; bpo-5670.)

Новые и улучшенные модулиNew and Improved Modules

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

  • Базовый отладочный класс Bdb модуля bdb получил возможность пропускать модули. Теперь конструктор принимает итерируемый объект, содержащий glob-шаблоны, например django.*; отладчик не будет заходить в стековые кадры модуля, соответствующего одному из таких шаблонов. (Предложено Maru Newby по идее Senthil Kumaran; bpo-5142.)

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

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

  • Метод BZ2File модуля bz2 теперь поддерживает протокол управления контекстом, так что можно писать with bz2.BZ2File(...) as f:. (Предложено Hagen Fürstenau; bpo-3860.)

  • Новый класс: класс Counter в модуле collections полезен для подсчёта данных. Экземпляры Counter ведут себя в основном как словари, но возвращают ноль для отсутствующих ключей вместо возбуждения исключения KeyError:

    >>> from collections import Counter
    >>> c = Counter()
    >>> for letter in 'here is a sample of english text':
    ...   c[letter] += 1
    ...
    >>> c 
    Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
    'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
    'p': 1, 'r': 1, 'x': 1})
    >>> c['e']
    5
    >>> c['z']
    0
    

    Есть три дополнительных метода Counter. most_common() возвращает N наиболее часто встречающихся элементов и их количество. elements() возвращает итератор по содержащимся элементам, повторяя каждый элемент столько раз, каково его количество. subtract() принимает итерируемый объект и вычитает единицу для каждого элемента вместо добавления; если аргумент – словарь или другой объект Counter, количества вычитаются.

    >>> c.most_common(5)
    [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
    >>> c.elements() ->
       'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
       'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
       'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
       's', 's', 'r', 't', 't', 'x'
    >>> c['e']
    5
    >>> c.subtract('very heavy on the letter e')
    >>> c['e']    # Счётчик теперь меньше
    -1
    

    Предложено Raymond Hettinger; bpo-1696199.

    Новый класс: OrderedDict описан в предыдущем разделе PEP 372: Adding an Ordered Dictionary to collections.

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

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

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

    (Добавлено Raymond Hettinger; bpo-1818.)

    Наконец, абстрактный базовый класс Mapping теперь возвращает NotImplemented, если отображение сравнивается с другим типом, не являющимся Mapping. (Исправлено Daniel Stutzbach; bpo-8729.)

  • Конструкторы классов разбора в модуле ConfigParser теперь принимают параметр allow_no_value, по умолчанию false; если true, опции без значений будут разрешены. Например:

    >>> import ConfigParser, StringIO
    >>> sample_config = """
    ... [mysqld]
    ... user = mysql
    ... pid-file = /var/run/mysqld/mysqld.pid
    ... skip-bdb
    ... """
    >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
    >>> config.readfp(StringIO.StringIO(sample_config))
    >>> config.get('mysqld', 'user')
    'mysql'
    >>> print config.get('mysqld', 'skip-bdb')
    None
    >>> print config.get('mysqld', 'unknown')
    Traceback (most recent call last):
      ...
    NoOptionError: No option 'unknown' in section: 'mysqld'
    

    (Предложено Mats Kindahl; bpo-7005.)

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

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

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

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

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

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

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

    Конструктор Decimal теперь принимает числа с плавающей запятой (добавлено Raymond Hettinger; bpo-8257) и неевропейские символы Unicode, такие как арабо-индийские цифры (предложено Mark Dickinson; bpo-6595).

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

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

    Сравнения с участием сигнального NaN (или sNAN) теперь сигнализируют InvalidOperation вместо того, чтобы молча возвращать истинное или ложное значение в зависимости от оператора сравнения. Тихие NaN (или NaN) теперь являются хешируемыми. (Исправлено Mark Dickinson; bpo-7279.)

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

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

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

  • Класс Message модуля email теперь принимает полезную нагрузку в виде Unicode, автоматически преобразуя её в кодировку, указанную output_charset. (Добавлено R. David Murray; bpo-1368247.)

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

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

  • Новый класс: FTP_TLS в модуле ftplib обеспечивает безопасные FTP-соединения с использованием TLS-инкапсуляции как для аутентификации, так и для последующих передач управления и данных. (Предложено Giampaolo Rodola; bpo-2054.)

    Метод storbinary() для двоичной загрузки теперь может перезапускать загрузки благодаря добавленному параметру rest (исправление Пабло Моусо; bpo-6845.)

  • Новый декоратор класса: total_ordering() в модуле functools принимает класс, определяющий метод __eq__() и один из __lt__(), __le__(), __gt__() или __ge__(), и генерирует недостающие методы сравнения. Поскольку метод __cmp__() помечен как устаревший в Python 3.x, этот декоратор упрощает определение упорядоченных классов. (Добавлено Рэймондом Хеттинджером; bpo-5479.)

    Новая функция: cmp_to_key() принимает старую функцию сравнения, ожидающую два аргумента, и возвращает новый вызываемый объект, который можно использовать как параметр key для таких функций, как sorted(), min() и max() и т. д. Основное предназначение – упростить адаптацию кода для совместимости с Python 3.x. (Добавлено Рэймондом Хеттинджером.)

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

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

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

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

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

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

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

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

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

    >>> from inspect import getcallargs
    >>> def f(a, b=1, *pos, **named):
    ...     pass
    >>> getcallargs(f, 1, 2, 3)
    {'a': 1, 'b': 2, 'pos': (3,), 'named': {}}
    >>> getcallargs(f, a=2, x=4)
    {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}}
    >>> getcallargs(f)
    Traceback (most recent call last):
    ...
    TypeError: f() takes at least 1 argument (0 given)
    

    Предложено Джорджем Саккисом; bpo-3135.

  • Обновлённый модуль: библиотека io обновлена до версии, поставляемой с Python 3.1. Для 3.1 библиотека ввода-вывода была полностью переписана на C и работает в 2–20 раз быстрее в зависимости от выполняемой задачи. Исходная версия на Python переименована в модуль _pyio.

    Одно небольшое изменение: класс io.TextIOBase теперь имеет атрибут errors, задающий режим обработки ошибок кодирования и декодирования (одно из значений: 'strict', 'replace', 'ignore').

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Функция-конструктор ssl.wrap_socket() теперь принимает аргумент ciphers – строку с перечнем разрешённых алгоритмов шифрования; формат строки описан в документации OpenSSL. (Добавлено Антуаном Питру; bpo-8322.)

    Ещё одно изменение заставляет расширение загружать все шифры и алгоритмы дайджестов OpenSSL, так что все они становятся доступны. Ранее некоторые SSL-сертификаты не удавалось проверить, выдавалась ошибка «неизвестный алгоритм». (Сообщено Бедой Косатой, исправлено Антуаном Питру; bpo-8484.)

    Версия используемого OpenSSL теперь доступна в виде атрибутов модуля: ssl.OPENSSL_VERSION (строка), ssl.OPENSSL_VERSION_INFO (кортеж из 5 элементов) и ssl.OPENSSL_VERSION_NUMBER (целое число). (Добавлено Антуаном Питру; bpo-8321.)

  • Модуль struct больше не будет молча игнорировать ошибки переполнения, когда значение слишком велико для определённого кода целочисленного формата (один из bBhHiIlLqQ); теперь он всегда возбуждает исключение struct.error. (Изменено Марком Дикинсоном; bpo-1523.) Функция pack() также будет пытаться использовать __index__() для преобразования и упаковки нецелых чисел перед тем, как пробовать метод __int__() или сообщать об ошибке. (Изменено Марком Дикинсоном; bpo-8300.)

  • Новая функция: check_output() модуля subprocess запускает команду с указанным набором аргументов и возвращает вывод команды в виде строки, если команда завершилась без ошибки; в противном случае возбуждает исключение CalledProcessError.

    >>> subprocess.check_output(['df', '-h', '.'])
    'Filesystem     Size   Used  Avail Capacity  Mounted on\n
    /dev/disk0s2    52G    49G   3.0G    94%    /\n'
    
    >>> subprocess.check_output(['df', '-h', '/bogus'])
      ...
    subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
    

    (Автор: Грегори П. Смит.)

    Модуль subprocess теперь будет повторять свои внутренние системные вызовы при получении сигнала EINTR. (Сообщено несколькими людьми; окончательный патч от Грегори П. Смита в bpo-1068268.)

  • Новая функция: is_declared_global() в модуле symtable возвращает true для переменных, явно объявленных глобальными, и false для неявно глобальных. (Автор: Джереми Хилтон.)

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

  • Значение sys.version_info теперь является именованным кортежем с атрибутами major, minor, micro, releaselevel и serial. (Автор: Росс Лайт; bpo-4285.)

    sys.getwindowsversion() также возвращает именованный кортеж с атрибутами major, minor, build, platform, service_pack, service_pack_major, service_pack_minor, suite_mask и product_type. (Автор: Брайан Кёртин; bpo-7766.)

  • Обработка ошибок по умолчанию в модуле tarfile изменилась: теперь она не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был 0, что означало, что ошибки только записывались в отладочный журнал, но, поскольку отладочный журнал не активирован по умолчанию, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию – 1, что вызывает исключение при любой ошибке. (Изменено Lars Gustäbel; bpo-7357.)

    tarfile теперь поддерживает фильтрацию объектов TarInfo, добавляемых в tar-файл. При вызове add() можно указать необязательный аргумент filter – вызываемый объект. Этот вызываемый объект filter будет получать TarInfo для каждого добавляемого файла и может модифицировать его и вернуть. Если вызываемый объект возвращает None, файл будет исключён из результирующего архива. Это более мощный механизм, чем существующий аргумент exclude, который поэтому считается устаревшим. (Добавлено Ларсом Густабелем; bpo-6856.) Класс TarFile также теперь поддерживает протокол менеджера контекста. (Добавлено Ларсом Густабелем; bpo-7232.)

  • Метод wait() класса threading.Event теперь по выходу возвращает внутренний флаг. Это означает, что метод обычно возвращает true, так как wait() должен блокироваться, пока внутренний флаг не станет true. Возвращаемое значение будет false только если был указан тайм-аут и операция превысила его. (Автор: Тим Лешер; bpo-1674032.)

  • База данных Unicode, предоставляемая модулем unicodedata, теперь используется внутри для определения, какие символы являются цифрами, пробельными или обозначают разрывы строк. База данных также включает информацию из файла данных Unihan.txt (патч Андерса Кригстрёма и Амори Форжо д’Арка; bpo-1571184) и обновлена до версии 5.2.0 (обновлено Флораном Ксиклуна; bpo-8024).

  • Метод urlsplit() модуля urlparse теперь обрабатывает неизвестные URL-схемы в соответствии с RFC 3986: если URL имеет форму "<something>://...", текст перед :// рассматривается как схема, даже если это вымышленная схема, неизвестная модулю. Это изменение может нарушить код, который обходил старое поведение. Например, Python 2.6.4 или 2.5 вернёт следующее:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (и Python 2.6.5) вернёт:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (Python 2.7 на самом деле выдаёт немного другой вывод, поскольку он возвращает именованный кортеж вместо стандартного кортежа.)

    Модуль urlparse также поддерживает буквенные IPv6-адреса, определённые в RFC 2732 (автор: Сентил Кумаран; bpo-2987).

    >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
    ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
                path='/foo', params='', query='', fragment='')
    
  • Новый класс: класс WeakSet в модуле weakref представляет собой множество, которое хранит только слабые ссылки на свои элементы; элементы удаляются, когда на них не остаётся ссылок. (Изначально реализован в Python 3.x Рэймондом Хеттингером, портирован в 2.7 Майклом Фордом.)

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

  • Клиент и сервер XML-RPC, предоставляемые модулями xmlrpclib и SimpleXMLRPCServer, повысили производительность за счёт поддержки HTTP/1.1 keep-alive и опционального использования gzip-сжатия для сжимания передаваемого XML. Сжатие gzip управляется атрибутом encode_threshold объекта SimpleXMLRPCRequestHandler, который содержит размер в байтах; ответы больше этого размера будут сжаты. (Предоставлено Kristján Valur Jónsson; bpo-6267.)

  • ZipFile модуля zipfile теперь поддерживает протокол управления контекстом, поэтому можно писать with zipfile.ZipFile(...) as f:. (Предоставлено Brian Curtin; bpo-5511.)

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

    Функция is_zipfile() теперь принимает файловый объект, помимо путей, которые принимались в более ранних версиях. (Предоставлено Gabriel Genellina; bpo-4756.)

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

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

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

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

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

>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # Стандартный абсолютный импорт
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Относительный импорт
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>

importlib был реализован Brett Cannon и представлен в Python 3.1.

Новый модуль: sysconfigNew module: sysconfig

Модуль sysconfig был выделен из пакета Distutils и стал новым самостоятельным модулем верхнего уровня. sysconfig предоставляет функции для получения информации о процессе сборки Python: параметры компилятора, пути установки, имя платформы и то, запущен ли Python из его исходного каталога.

Некоторые функции модуля:

  • get_config_var() возвращает переменные из Makefile Python и файла pyconfig.h.

  • get_config_vars() возвращает словарь, содержащий все переменные конфигурации.

  • get_path() возвращает настроенный путь для определённого типа модулей: стандартная библиотека, сайт-специфичные модули, платформо-специфичные модули и т.д.

  • is_python_build() возвращает true, если исполняемый файл запущен из дерева исходных кодов Python, и false в противном случае.

Обратитесь к документации sysconfig за более подробной информацией и полным списком функций.

Пакет Distutils и sysconfig теперь поддерживаются Tarek Ziadé, который также начал работу над пакетом Distutils2 (хранилище исходного кода: https://hg.python.org/distutils2/) для разработки следующего поколения Distutils.

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

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

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

Модуль ttk был написан Guilherme Polo и добавлен в bpo-2983. Альтернативная версия под названием Tile.py, написанная Martin Franklin и поддерживаемая Kevin Walzer, предлагалась для включения в bpo-2618, но авторы утверждали, что работа Guilherme Polo была более полной.

Обновлённый модуль: unittestUpdated module: unittest

Модуль unittest был значительно улучшен; многие новые возможности были добавлены. Большинство этих функций было реализовано Майклом Фордом, если не указано иное. Улучшенная версия модуля доступна для отдельной загрузки для использования с Python 2.4–2.6, упакованная как пакет unittest2, по адресу https://pypi.org/project/unittest2.

При использовании из командной строки модуль может автоматически обнаруживать тесты. Он не такой навороченный, как py.test или nose, но предоставляет простой способ запуска тестов, хранящихся в наборе каталогов пакетов. Например, следующая команда будет искать в подкаталоге test/ любые импортируемые тестовые файлы с именем test*.py:

python -m unittest discover -s test

Обратитесь к документации модуля unittest за более подробной информацией. (Разработано в bpo-6001.)

Функция main() поддерживает некоторые другие новые параметры:

  • -b или --buffer будет буферизовать потоки стандартного вывода и стандартной ошибки во время каждого теста. Если тест пройден, любой результирующий вывод будет отброшен; при неудаче буферизованный вывод будет отображён.

  • -c или --catch приведёт к тому, что прерывание по Control-C будет обрабатываться более корректно. Вместо немедленного прерывания процесса тестирования, текущий выполняющийся тест будет завершён, а затем будут сообщены частичные результаты до момента прерывания. Если вы нетерпеливы, повторное нажатие Control-C вызовет немедленное прерывание.

    Этот обработчик Control-C пытается избежать проблем, когда тестируемый код или запускаемые тесты определили собственный обработчик сигнала: он замечает, что обработчик уже установлен, и вызывает его. Если это не подходит, существует декоратор removeHandler(), который можно использовать для пометки тестов, для которых обработка Control-C должна быть отключена.

  • -f или --failfast заставляет выполнение тестов немедленно остановиться при сбое теста, вместо продолжения выполнения следующих тестов. (Предложено Cliff Dyer, реализовано Michael Foord; bpo-8074.)

Сообщения о ходе выполнения теперь показывают ‘x’ для ожидаемых сбоев и ‘u’ для неожиданных успехов при запуске в подробном режиме. (Предложено Бенджамином Петерсоном.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

http://www.voidspace.org.uk/python/articles/unittest2.shtml

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

Обновлённый модуль: ElementTree 1.3Updated module: ElementTree 1.3

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

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

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

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

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

    Обработка пространств имен также была улучшена. Все объявления xmlns:<whatever> теперь выводятся на корневом элементе, а не разбросаны по всему результирующему XML. Можно задать пространство имен по умолчанию для дерева, установив атрибут default_namespace, и зарегистрировать новые префиксы с помощью register_namespace(). В режиме XML можно использовать логический параметр xml_declaration для подавления объявления XML.

  • Новый метод Element: extend() добавляет элементы из последовательности в дочерние элементы элемента. Сами элементы ведут себя как последовательности, поэтому легко перемещать дочерние элементы из одного элемента в другой:

    from xml.etree import ElementTree as ET
    
    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    new = ET.XML('<root/>')
    new.extend(t)
    
    # Выводит <root><item>1</item>...</root>
    print ET.tostring(new)
    
  • Новый метод Element: iter() возвращает дочерние элементы элемента в виде генератора. Также можно написать for child in elem: для перебора дочерних элементов элемента. Существующий метод getiterator() теперь устарел, как и getchildren(), который создает и возвращает список дочерних элементов.

  • Новый метод Element: itertext() возвращает все текстовые фрагменты, являющиеся потомками элемента. Например:

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    
    # Выводит ['\n  ', '1', ' ', '2', '  ', '3', '\n']
    print list(t.itertext())
    
  • Устарело: использование элемента в качестве логического значения (т.е. if elem:) возвращало true, если у элемента были дочерние элементы, и false, если их не было. Это поведение сбивает с толку – None равно false, но и элемент без детей тоже? – поэтому теперь это будет вызывать FutureWarning. В своем коде следует быть явным: пишите len(elem) != 0, если вас интересует количество дочерних элементов, или elem is not None.

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

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

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

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

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

  • Py_AddPendingCall() теперь потокобезопасен, позволяя любому рабочему потоку отправлять уведомления главному потоку Python. Это особенно полезно для асинхронных операций ввода-вывода. (Предложено Kristján Valur Jónsson; bpo-4293.)

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

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

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

  • Новые функции: PyLong_AsLongAndOverflow() и PyLong_AsLongLongAndOverflow() аппроксимируют длинное целое Python как C long или long long. Если число слишком велико для размещения в выходном типе, устанавливается флаг переполнения и возвращается вызывающей стороне. (Предложено Case Van Horsen; bpo-7528 и bpo-7767.)

  • Новая функция: в результате переработки преобразования строки в число с плавающей точкой была добавлена новая функция PyOS_string_to_double(). Старые функции PyOS_ascii_strtod() и PyOS_ascii_atof() теперь устарели.

  • Новая функция: PySys_SetArgvEx() устанавливает значение sys.argv и может опционально обновлять sys.path, чтобы включить каталог, содержащий скрипт, указанный в sys.argv[0], в зависимости от значения параметра updatepath.

    Эта функция была добавлена для закрытия уязвимости безопасности в приложениях, встраивающих Python. Старая функция PySys_SetArgv() всегда обновляла sys.path, и иногда добавляла текущий каталог. Это означало, что если вы запускали приложение, встраивающее Python, в каталоге, контролируемом кем-то другим, злоумышленники могли поместить в этот каталог троянский модуль (например, файл с именем os.py), который ваше приложение затем импортировало и запускало.

    Если вы поддерживаете C/C++ приложение, встраивающее Python, проверьте, вызываете ли вы PySys_SetArgv(), и тщательно обдумайте, должно ли приложение использовать PySys_SetArgvEx() с updatepath, установленным в false.

    Проблема безопасности, о которой сообщалось как о CVE-2008-5983; обсуждалась в bpo-5753 и была исправлена Антуаном Питру.

  • Новые макросы: заголовочные файлы Python теперь определяют следующие макросы: Py_ISALNUM, Py_ISALPHA, Py_ISDIGIT, Py_ISLOWER, Py_ISSPACE, Py_ISUPPER, Py_ISXDIGIT, Py_TOLOWER и Py_TOUPPER. Все эти функции аналогичны стандартным макросам C для классификации символов, но игнорируют текущую локаль, поскольку в нескольких местах Python нужно анализировать символы независимо от локали. (Добавлено Eric Smith; bpo-5793.)

  • Удаленная функция: PyEval_CallObject теперь доступна только как макрос. Версия функции сохранялась для сохранения совместимости ABI, но это было в 1997; теперь ее можно смело удалить. (Удалено Antoine Pitrou; bpo-8276.)

  • Новые коды формата: функции PyFormat_FromString(), PyFormat_FromStringV() и PyErr_Format() теперь принимают коды формата %lld и %llu для отображения типов long long в C. (Предложено Mark Dickinson; bpo-7228.)

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

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

    (Исправлено Thomas Wouters; bpo-1590864.)

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

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

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

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

  • Новая опция configure: опция --with-valgrind теперь отключает аллокатор pymalloc, который трудно корректно анализировать детектору ошибок памяти Valgrind. Поэтому Valgrind будет лучше обнаруживать утечки памяти и переполнения. (Предложено James Henstridge; bpo-2422.)

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

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

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

  • Процесс сборки теперь создаёт необходимые файлы для поддержки pkg-config. (Предложено Clinton Roy; bpo-3585.)

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

КапсулыCapsules

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

Существует уже используемый для этого тип данных PyCObject, но он не обеспечивает типобезопасность. Злонамеренный код на чистом Python может вызвать ошибку сегментации, взяв PyCObject из модуля A и каким-то образом подставив его вместо PyCObject в модуле B. Капсулы знают своё собственное имя, и для получения указателя необходимо указать имя:

void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

Можно быть уверенным, что vtable указывает на то, что ожидается. Если была передана другая капсула, PyCapsule_IsValid() обнаружит несовпадение имени и вернёт false. Дополнительную информацию об использовании этих объектов см. в Providing a C API for an Extension Module.

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

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

Изменения для конкретных платформ: WindowsPort-Specific Changes: Windows

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

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

  • Новый API _beginthreadex() используется для запуска потоков, и теперь используются нативные функции потокового локального хранилища. (Предложено Kristján Valur Jónsson; bpo-3582.)

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

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

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

Изменения для конкретных платформ: Mac OS XPort-Specific Changes: Mac OS X

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

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

Изменения для конкретных платформ: FreeBSDPort-Specific Changes: FreeBSD

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

Другие изменения и исправленияOther Changes and Fixes

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

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

  • При импорте модуля из файла .pyc или .pyo с существующим аналогом .py атрибуты co_filename результирующих объектов кода перезаписываются, когда исходное имя файла устарело. Это может произойти, если файл был переименован, перемещён или доступен по разным путям. (Патч от Ziga Seilnacht и Jean-Paul Calderone; bpo-1180193.)

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

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

  • При выполнении как скрипт модуль py_compile.py теперь принимает '-' в качестве аргумента, который будет читать из стандартного ввода список имён файлов для компиляции. (Предложено Piotr Ożarowski; bpo-8233.)

Перенос на Python 2.7Porting to Python 2.7

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

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

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

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

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

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

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

  • Операции с экземплярами datetime, приводящие к году, выходящему за пределы поддерживаемого диапазона, не всегда вызывали OverflowError. Теперь такие ошибки проверяются более тщательно и будут вызывать исключение. (Сообщено Mark Leander, патч от Anand B. Pillai и Alexander Belopolsky; bpo-7150.)

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

    Сравнения с участием сигнального NaN (или sNAN) теперь сигнализируют InvalidOperation вместо того, чтобы молча возвращать истинное или ложное значение в зависимости от оператора сравнения. Тихие NaN (или NaN) теперь являются хешируемыми. (Исправлено Mark Dickinson; bpo-7279.)

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

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

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

  • Обработка ошибок по умолчанию в модуле tarfile изменилась: теперь она не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был 0, что означало, что ошибки только записывались в отладочный журнал, но, поскольку отладочный журнал не активирован по умолчанию, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию – 1, что вызывает исключение при любой ошибке. (Изменено Lars Gustäbel; bpo-7357.)

  • Метод urlsplit() модуля urlparse теперь обрабатывает неизвестные URL-схемы в соответствии с RFC 3986: если URL имеет форму "<something>://...", текст перед :// рассматривается как схема, даже если это вымышленная схема, неизвестная модулю. Это изменение может нарушить код, который обходил старое поведение. Например, Python 2.6.4 или 2.5 вернёт следующее:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (и Python 2.6.5) вернёт:

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (Python 2.7 на самом деле выдаёт немного другой вывод, поскольку он возвращает именованный кортеж вместо стандартного кортежа.)

Для C-расширений:

  • C-расширения, использующие коды целочисленных форматов с семейством функций PyArg_Parse*, теперь будут вызывать исключение TypeError вместо DeprecationWarning (bpo-5080).

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

Для приложений, которые встраивают Python:

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

Новые возможности, добавленные в релизы поддержки Python 2.7New Features Added to Python 2.7 Maintenance Releases

Новые возможности могут добавляться в релизы поддержки Python 2.7, если для этого действительно есть основания. Любые подобные дополнения должны проходить процесс Python Enhancement Proposal и убедительно обосновывать, почему их нельзя адекватно реализовать, либо добавив новую возможность только в Python 3, либо опубликовав её в Python Package Index.

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

Две новые переменные окружения для режима отладкиTwo new environment variables for debug mode

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

Когда Python скомпилирован с определённым COUNT_ALLOC, счётчики выделения больше не выводятся по умолчанию: теперь также должна быть установлена переменная окружения PYTHONSHOWALLOCCOUNT. Более того, счётчики выделения теперь выводятся в stderr, а не в stdout. (Предложено Victor Stinner; bpo-31692.)

Новое в версии 2.7.15.

PEP 434: Исключение по улучшению IDLE для всех ветокPEP 434: IDLE Enhancement Exception for All Branches

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

За подробностями об изменениях IDLE обратитесь к файлу NEWS для конкретного релиза.

PEP 466: Улучшения сетевой безопасности для Python 2.7PEP 466: Network Security Enhancements for Python 2.7

PEP 466 описывает ряд предложений по усилению сетевой безопасности, которые были одобрены для включения в релизы поддержки Python 2.7, причём первые из этих изменений появились в релизе Python 2.7.7.

Функции, связанные с PEP 466, добавленные в Python 2.7.7:

  • hmac.compare_digest() был перенесён из Python 3, чтобы предоставить операцию сравнения, устойчивую к атакам по времени, для приложений Python 2. (Автор: Alex Gaynor; bpo-21306.)

  • OpenSSL 1.0.1g был обновлён в официальных установщиках Windows, опубликованных на python.org. (Автор: Zachary Ware; bpo-21462.)

Функции, связанные с PEP 466, добавленные в Python 2.7.8:

  • hashlib.pbkdf2_hmac() был перенесён из Python 3, чтобы сделать алгоритм хеширования, подходящий для безопасного хранения паролей, широко доступным для приложений Python 2. (Автор: Alex Gaynor; bpo-21304.)

  • OpenSSL 1.0.1h был обновлён для официальных установщиков Windows, опубликованных на python.org. (Автор: Закари Уэр в bpo-21671 для CVE-2014-0224)

Функции, связанные с PEP 466, добавленные в Python 2.7.9:

  • Большая часть модуля ssl из Python 3.4 была перенесена. Это означает, что ssl теперь поддерживает Server Name Indication, настройки TLS1.x, доступ к хранилищу сертификатов платформы, класс SSLContext и другие возможности. (Авторы: Alex Gaynor и David Reid; bpo-21308.)

    Конкретные детали приведены в примечаниях «Версия добавлена: 2.7.9» в документации модуля.

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

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

PEP 477: Перенос ensurepip (PEP 453) в Python 2.7PEP 477: Backport ensurepip (PEP 453) to Python 2.7

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

Автоматическая установка pip по умолчаниюBootstrapping pip By Default

Новый модуль ensurepip (определённый в PEP 453) предоставляет стандартный кроссплатформенный механизм для автоматической установки pip в дистрибутивы Python. Версия pip, включённая в Python 2.7.9 – pip 1.5.6, и будущие выпуски поддержки 2.7.x будут обновлять встроенную версию до последней версии pip, доступной на момент создания кандидата в релизы.

По умолчанию команды pip, pipX и pipX.Y будут установлены на всех платформах (где X.Y обозначает версию установки Python), вместе с пакетом pip Python и его зависимостями.

Для сборок CPython из исходных кодов в системах POSIX команды make install и make altinstall не выполняют автоматическую установку pip по умолчанию. Это поведение можно настроить через параметры configure и переопределить через параметры Makefile.

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

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

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

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

Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как Installing Python Modules (Legacy version) и Distributing Python Modules (Legacy version).

См. также

PEP 453 – Явная автоматическая установка pip в дистрибутивах Python

PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.

PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотекиPEP 476: Enabling certificate verification by default for stdlib http clients

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

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

import urllib2
import ssl

# Это отключает все проверки
context = ssl._create_unverified_context()

# Это позволяет использовать конкретный сертификат для хоста, которому не нужно
# находиться в хранилище доверенных сертификатов
context = ssl.create_default_context(cafile="/path/to/file.crt")

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

PEP 493: Инструменты миграции проверки HTTPS для Python 2.7PEP 493: HTTPS verification migration tools for Python 2.7

PEP 493 предоставляет дополнительные инструменты миграции для поддержки более поэтапного процесса обновления инфраструктуры в средах, содержащих приложения и сервисы, полагающиеся на исторически допускающую обработку серверных сертификатов при установлении клиентских HTTPS-соединений. Эти дополнения были внесены в выпуске Python 2.7.12.

Эти инструменты предназначены для случаев, когда затронутые приложения и сервисы не могут быть изменены для явной передачи более допускающего SSL-контекста при установлении соединения.

Для приложений и сервисов, которые вообще не могут быть изменены, новая переменная окружения PYTHONHTTPSVERIFY может быть установлена в 0, чтобы вернуть весь процесс Python к поведению по умолчанию, допускающему всё, как в Python 2.7.8 и более ранних версиях.

Для случаев, когда код установления соединения не может быть изменён, но приложение в целом может, новая функция ssl._https_verify_certificates() может быть использована для настройки поведения по умолчанию во время выполнения.

Новая make regen-all цель сборкиNew make regen-all build target

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

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

Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.

(Предложено Victor Stinner в bpo-23404.)

Новое в версии 2.7.14.

Удаление make touch цели сборкиRemoval of make touch build target

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

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

(Предложено Victor Stinner в bpo-23404.)

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

БлагодарностиAcknowledgements

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