Что нового в Python 2.7¶
- Автор:
А. М. Кюхлинг (amk at amk.ca)
В этой статье рассказывается о новых функциях Python 2.7. Версия Python 2.7 была выпущена 3 июля 2010 года.
Обработка чисел была улучшена во многих отношениях, как для чисел с плавающей запятой, так и для класса Decimal. В стандартную библиотеку добавлено несколько полезных дополнений, таких как значительно улучшенный модуль unittest, модуль argparse для анализа параметров командной строки, удобные классы OrderedDict и Counter в <модуль collections и многие другие улучшения.
Планируется, что версия Python 2.7 станет последней из версий 2.x, поэтому мы работали над тем, чтобы сделать ее хорошей на долгосрочную перспективу. Чтобы облегчить переход на Python3, в версию 2.7 было включено несколько новых функций из серии Python 3.x.
В этой статье не делается попытка предоставить полную спецификацию новых функций, а вместо этого предлагается удобный обзор. Для получения более подробной информации вам следует обратиться к документации по Python 2.7 по адресу https://docs.python.org. Если вы хотите понять обоснование разработки и реализации, обратитесь к PEP для получения информации о конкретной новой функции или к выпуску на сайте https://bugs.python.org, в котором обсуждалось изменение. По возможности, в разделе «Что нового в Python» содержатся ссылки на ошибки/исправления для каждого изменения.
Будущее за Python 2.x¶
Python 2.7 - это последний крупный релиз серии 2.x, поскольку разработчики Python перенесли акцент своих усилий по разработке новых функций на серию Python 3.x. Это означает, что, хотя Python 2 продолжает получать исправления ошибок и обновляться для корректной сборки на новом оборудовании и версиях поддерживаемых операционных систем, новых полнофункциональных выпусков для языка или стандартной библиотеки не будет.
Однако, хотя между Python 2.7 и Python 3 существует большое общее подмножество, и многие изменения, связанные с переходом на это общее подмножество или непосредственно на Python 3, могут быть безопасно автоматизированы, некоторые другие изменения (особенно те, которые связаны с обработкой Unicode) могут потребовать тщательного рассмотрения и предпочтительно надежной автоматизации наборы регрессионных тестов для эффективной миграции.
Это означает, что Python 2.7 останется в силе в течение длительного времени, обеспечивая стабильную и поддерживаемую базовую платформу для производственных систем, которые еще не были перенесены на Python 3. Полный ожидаемый жизненный цикл серии Python 2.7 подробно описан в PEP 373.
Некоторыми ключевыми последствиями долгосрочной значимости пункта 2.7 являются:
Как отмечалось выше, версия 2.7 имеет гораздо более длительный период обслуживания по сравнению с более ранними версиями 2.x. В настоящее время ожидается, что основная команда разработчиков будет поддерживать Python 2.7 (получая обновления для системы безопасности и другие исправления ошибок) как минимум до 2020 года (через 10 лет после его первоначального выпуска, по сравнению с более типичным периодом поддержки в 18-24 месяца).
По мере старения стандартной библиотеки Python 2.7 эффективное использование индекса пакетов Python (либо напрямую, либо через распространителя) становится все более важным для пользователей Python 2. В дополнение к широкому спектру сторонних пакетов для различных задач, доступные пакеты включают в себя резервные копии новых модулей и функций из стандартной библиотеки Python 3, совместимых с Python 2, а также различные инструменты и библиотеки, которые могут упростить переход на Python 3. В Python Packaging User Guide приведены инструкции по загрузке и установке программного обеспечения из индекса пакетов Python.
Хотя в настоящее время предпочтительным подходом к улучшению Python 2 является публикация новых пакетов в Python Package Index, этот подход не обязательно работает во всех случаях, особенно в тех, которые связаны с сетевой безопасностью. В исключительных случаях, которые не могут быть решены надлежащим образом путем публикации новых или обновленных пакетов в PyPI, процесс предложения по улучшению Python может быть использован для обоснования необходимости добавления новых функций непосредственно в стандартную библиотеку Python 2. Любые такие дополнения и версии технического обслуживания, в которые они были добавлены, будут указаны в разделе В обновленные версии Python 2.7 добавлены новые функции ниже.
Для проектов, желающих перейти с Python 2 на Python 3, или для разработчиков библиотек и фреймворков, желающих поддерживать пользователей как на Python 2, так и на Python 3, существует множество инструментов и руководств, которые помогут выбрать подходящий подход и разобраться с некоторыми техническими деталями. Рекомендуемой отправной точкой является руководство Как перенести код Python 2 в Python 3.
Изменения в обработке предупреждений об устаревании¶
В версии Python 2.7 было принято политическое решение по умолчанию отключать предупреждения, представляющие интерес только для разработчиков. DeprecationWarning и его потомки теперь игнорируются, если не запрошено иное, что не позволяет пользователям видеть предупреждения, запускаемые приложением. Это изменение также было внесено в ветку, которая стала Python 3.2. (Обсуждалось в stdlib-sig и выполнено в bpo-7319.)
В предыдущих версиях сообщения DeprecationWarning были включены по умолчанию, предоставляя разработчикам Python четкое указание на то, где их код может сломаться в будущей основной версии Python.
Однако растет число пользователей приложений на основе Python, которые непосредственно не участвуют в разработке этих приложений. DeprecationWarning сообщения не имеют отношения к таким пользователям, заставляя их беспокоиться о том, работает ли приложение на самом деле корректно, и обременяя разработчиков приложений необходимостью реагировать на эти проблемы.
Вы можете повторно включить отображение сообщений DeprecationWarning, запустив Python с переключателем -Wdefault (краткая форма: -Wd) или установив для переменной окружения PYTHONWARNINGS значение "default" (или "d") перед запуском Python. Код Python также может повторно включить их, вызвав warnings.simplefilter('default').
Модуль unittest также автоматически повторно включает предупреждения об устаревании при выполнении тестов.
Особенности Python 3.1¶
Подобно тому, как Python 2.6 включал в себя функции Python 3.0, версия 2.7 включает в себя некоторые новые функции Python 3.1. Серия 2.x продолжает предоставлять инструменты для перехода на серию 3.x.
Неполный список функций версии 3.1, которые были перенесены в версию 2.7:
Синтаксис для литералов set (
{1,2,3}- это изменяемый набор).Понимание словаря и набора слов (
{i: i*2 for i in range(3)}).Несколько контекстных менеджеров в одном операторе
with.Новая версия библиотеки
io, написанная на C для повышения производительности.Тип упорядоченного словаря, описанный в PEP 372: Добавление упорядоченного словаря в коллекции.
Новый спецификатор формата
",", описанный в разделе PEP 378: Спецификатор формата для разделителя тысяч.Объект
memoryview.Небольшое подмножество модуля
importlib, described below.Значение
repr()для числа с плавающей запятойxво многих случаях короче: теперь оно основано на самой короткой десятичной строке, которая гарантированно округляется обратно доx. Как и в предыдущих версиях Python, гарантируется, чтоfloat(repr(x))восстановитx.Значения преобразований с плавающей точкой в строку и из строки в значение с плавающей точкой округлены правильно. Функция
round()теперь также округлена правильно.Тип
PyCapsule, используемый для предоставления C API для модулей расширения.Функция
PyLong_AsLongAndOverflow()C API.
Другие новые предупреждения в режиме Python3 включают:
operator.isCallable()иoperator.sequenceIncludes(), которые не поддерживаются в 3.x, теперь вызывают предупреждения.Переключатель
-3теперь автоматически включает переключатель-Qwarn, который вызывает предупреждения об использовании классического деления с целыми числами и длинных целых чисел.
PEP 372: Добавление упорядоченного словаря в коллекции¶
Обычные словари Python перебирают пары ключ/значение в произвольном порядке. На протяжении многих лет ряд авторов писали альтернативные реализации, которые запоминают порядок, в котором ключи были первоначально вставлены. Основываясь на опыте этих реализаций, в версии 2.7 представлен новый класс OrderedDict в модуле collections.
API OrderedDict предоставляет тот же интерфейс, что и обычные словари, но выполняет итерацию по ключам и значениям в гарантированном порядке в зависимости от того, когда ключ был впервые вставлен:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Если новая запись заменяет существующую запись, исходная позиция вставки остается неизменной:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
Удаление записи и ее повторная вставка приведут к ее перемещению в конец:
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
Метод popitem() имеет необязательный аргумент last, значение которого по умолчанию равно True. Если значение last равно true, возвращается и удаляется самый последний добавленный ключ; если значение false, выбирается самый старый ключ:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
Сравнение двух упорядоченных словарей проверяет как ключи, так и значения и требует, чтобы порядок вставки был одинаковым:
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
Сравнение OrderedDict с обычным словарем игнорирует порядок вставки и просто сравнивает ключи и значения.
Как работает OrderedDict? Он поддерживает двусвязный список ключей, добавляя новые ключи к списку по мере их добавления. Дополнительный словарь сопоставляет ключи с соответствующим им узлом списка, поэтому удаление не должно проходить по всему связанному списку и, следовательно, остается O(1).
Стандартная библиотека теперь поддерживает использование упорядоченных словарей в нескольких модулях.
Модуль
ConfigParserиспользует их по умолчанию, что означает, что файлы конфигурации теперь можно считывать, изменять, а затем записывать обратно в их первоначальном порядке.Метод
_asdict()дляcollections.namedtuple()теперь возвращает ordereddictionary со значениями, расположенными в том же порядке, что и базовые индексы кортежей.Конструктор класса
jsonмодуляJSONDecoderбыл расширен параметром object_pairs_hook, чтобы позволить декодеру создавать экземплярыOrderedDict. Также была добавлена поддержка сторонних инструментов, таких как PyYAML.
См.также
- PEP 372 - Добавление упорядоченного словаря в коллекции
PEP написан Армином Роначером и Рэймондом Хеттингером; реализован Рэймондом Хеттингером.
PEP 378: Спецификатор формата для разделителя тысяч¶
Чтобы сделать вывод программы более читабельным, может быть полезно добавлять разделители к большим числам, отображая их как 18 446 744 073 709 551 616 вместо 184 467 4407 370 955 1616.
Наиболее распространенным решением для этого является модуль locale, который может использовать разные разделители («,» в Северной Америке, «.» в Европе) и разные размеры групп, но locale сложен в использовании и не подходит для многопоточной работы. приложения, в которых разные потоки создают выходные данные для разных языков.
Таким образом, в мини-язык, используемый методом str.format(), был добавлен простой механизм группировки запятых. При форматировании числа с плавающей запятой просто ставьте запятую между шириной и точностью:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
При форматировании целого числа ставьте запятую после значения ширины:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Этот механизм вообще не поддается адаптации; в качестве разделителя всегда используются запятые, а группировка всегда состоит из трехзначных групп. Механизм форматирования через запятую не такой общий, как модуль locale, но им проще пользоваться.
См.также
- PEP 378 - Спецификатор формата для разделителя тысяч
PEP, написанный Рэймондом Хеттингером; реализованный Эриком Смитом.
PEP 389: Модуль argparse для синтаксического анализа командных строк¶
Модуль argparse для анализа аргументов командной строки был добавлен в качестве более мощной замены модулю optparse.
Это означает, что Python теперь поддерживает три разных модуля для анализа аргументов командной строки: getopt, optparse, и argparse. Модуль getopt очень похож на функцию библиотеки C getopt(), поэтому он остается полезным, если вы пишете прототип Python, который в конечном итоге будет переписан на C. optparse становится излишним, но в планах нет удалите его, потому что многие скрипты все еще используют его, и нет автоматического способа обновить эти скрипты. (Обсуждалось приведение API argparse в соответствие с интерфейсом optparse, но было отклонено как слишком запутанное и сложное.)
Короче говоря, если вы пишете новый скрипт и вам не нужно беспокоиться о совместимости с более ранними версиями Python, используйте argparse вместо optparse.
Вот пример:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
Если вы не переопределите его, переключатели -h и --help добавляются автоматически и выдают аккуратно отформатированный вывод:
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
Как и в случае с optparse, ключи и аргументы командной строки возвращаются в виде объекта с атрибутами, названными параметрами dest:
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse имеет гораздо более удобную проверку, чем optparse; вы можете указать точное количество аргументов в виде целого числа, 0 или более аргументов, передав '*', 1 или более, передав '+', или необязательный аргумент с '?'. Синтаксический анализатор верхнего уровня может содержать вложенные синтаксические анализаторы для определения подкоманд, которые имеют разные наборы ключей, как в svn commit, svn checkout, и т.д. Вы можете указать тип аргумента как FileType, который автоматически откроет для вас файлы и будет понимать, что '-' означает стандартный ввод или вывод.
См.также
argparseдокументацияСтраница документации модуля argparse.
- Обновление кода optparse
Часть документации по Python, описывающая, как преобразовать код, использующий
optparse.- PEP 389 - argparse - Новый модуль синтаксического анализа командной строки
PEP, написанный и реализованный Стивеном Бетардом.
PEP 391: Настройка ведения Журнала на основе Словаря¶
Модуль logging очень гибкий; приложения могут определять дерево подсистем ведения журнала, и каждый регистратор в этом дереве может отфильтровывать определенные сообщения, форматировать их по-разному и направлять сообщения различному числу обработчиков.
Вся эта гибкость может потребовать большой настройки. Вы можете написать инструкции на Python для создания объектов и настройки их свойств, но для сложной настройки требуется подробный, но скучный код. logging также поддерживает функцию fileConfig(), которая анализирует файл, но формат файла не поддерживает настройку фильтров, и программно генерировать его сложнее.
В Python 2.7 добавлена функция dictConfig(), которая использует словарь для настройки ведения журнала. Существует множество способов создания словаря из разных источников: создайте словарь с помощью кода; проанализируйте файл, содержащий JSON; или используйте библиотеку синтаксического анализа YAML, если она установлена. Для получения дополнительной информации смотрите Функции настройки.
В следующем примере настраиваются два регистратора: корневой и сетевой. Сообщения, отправленные в корневой регистратор, будут отправлены в системный журнал с использованием протокола syslog, а сообщения в «сетевой» регистратор будут записаны в файл network.log, который будет изменен, как только размер журнала достигнет 1 МБ.
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
Три небольших усовершенствования модуля logging, реализованные Винаем Саджипом, заключаются в следующем:
Класс
SysLogHandlerтеперь поддерживает ведение системного журнала по протоколу TCP. В конструкторе есть параметр socktype, указывающий тип используемого сокета:socket.SOCK_DGRAMдля UDP илиsocket.SOCK_STREAMдля TCP. Протоколом по умолчанию остается UDP.экземпляры
Loggerполучили методgetChild(), который извлекает регистратор-потомок, используя относительный путь. Например, как только вы извлекаете логгер, выполнивlog = getLogger('app'), вызовlog.getChild('network.listen')эквивалентенgetLogger('app.network.listen').Класс
LoggerAdapterполучил методisEnabledFor(), который принимает значение level и возвращает, будет ли базовый регистратор обрабатывать сообщение такого уровня важности.
См.также
- PEP 391 - Настройка Ведения Журнала На Основе Словаря
PEP, написанный и реализованный Винаем Саджипом.
PEP 3106: Просмотр словаря¶
Методы dictionary keys(), values(), и items() в Python 3.x отличаются друг от друга. Они возвращают объект с именем view вместо полностью материализованного списка.
Невозможно изменить возвращаемые значения keys(), values(), и items() в Python 2.7, потому что слишком большой объем кода может привести к сбою. Вместо этого были добавлены версии 3.x под новыми названиями viewkeys(), viewvalues(), и viewitems().
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
Представления можно перебирать, но представления ключа и элемента также ведут себя как множества. Оператор & выполняет пересечение, а | - объединение:
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
Представление отслеживает словарь, и его содержимое изменяется по мере изменения словаря:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
Однако обратите внимание, что вы не можете добавлять или удалять ключи во время просмотра представления:
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Вы можете использовать методы просмотра в коде Python 2.x, и конвертер 2to3 изменит их на стандартные keys(), values(), и items() методы.
PEP 3137: Объект memoryview¶
Объект memoryview предоставляет представление содержимого памяти другого объекта, которое соответствует интерфейсу типа bytes.
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
Содержимое представления может быть преобразовано в строку байтов или список целых чисел:
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
memoryview объекты позволяют изменять базовый объект, если это изменяемый объект.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
Другие языковые изменения¶
Вот некоторые небольшие изменения, внесенные в основной язык Python:
Синтаксис для литералов set был перенесен из Python 3.x. Фигурные скобки используются для заключения содержимого результирующего изменяемого набора; литералы set отличаются от словарей тем, что не содержат двоеточий и значений.
{}продолжает представлять пустой словарь; используйтеset()для пустого набора.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
Автор: Александр Вассалотти; bpo-2335.
Понимание словарей и наборов - это еще одна функция, перенесенная из 3.x, обобщающая понимание списков / генераторов для использования буквального синтаксиса для наборов и словарей.
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
Автор: Александр Вассалотти; bpo-2333.
Оператор
withтеперь может использовать несколько контекстных менеджеров в одном операторе. Контекстные менеджеры обрабатываются слева направо, и каждый из них рассматривается как начало нового оператораwith. Это означает, что:with A() as a, B() as b: ... suite of statements ...
эквивалентно:
with A() as a: with B() as b: ... suite of statements ...
Функция
contextlib.nested()предоставляет очень похожую функцию, поэтому она больше не нужна и считается устаревшей.(Предложено в https://codereview.appspot.com/53094; реализовано Георгом Брандлом.)
Преобразования между числами с плавающей запятой и строками теперь корректно округляются на большинстве платформ. Эти преобразования выполняются в самых разных местах:
str()для чисел с плавающей точкой и комплексных чисел; конструкторыfloatиcomplex; числовое форматирование; сериализация и десериализация чисел с плавающей точкой и комплексных чисел с использованиемmarshal, <модулиpickleиjson; синтаксический анализ float и мнимых литералов в коде Python; и преобразованиеDecimalв float.В связи с этим
repr()числа с плавающей запятой x теперь возвращает результат, основанный на самой короткой десятичной строке, которая гарантированно округляется обратно до x при правильном округлении (в режиме округления от половины до четного). Ранее он выдавал строку, основанную на округлении x до 17 десятичных цифр.Библиотека округления, ответственная за это улучшение, работает на платформах Windows и Unix с использованием компиляторов gcc, icc или suncc. Возможно, существует небольшое количество платформ, на которых невозможно гарантировать корректную работу этого кода, поэтому код не используется в таких системах. Вы можете узнать, какой код используется, установив флажок
sys.float_repr_style, который будет равенshort, если используется новый код, иlegacy, если нет.Реализован Эриком Смитом и Марком Дикинсоном с использованием библиотеки Дэвида Гэя
dtoa.c; bpo-7117.Преобразования из длинных целых чисел и обычных целых чисел в числа с плавающей запятой теперь округляются по-другому, возвращая число с плавающей запятой, наиболее близкое к нужному числу. Это не имеет значения для небольших целых чисел, которые могут быть преобразованы в точности, но для больших чисел, которые неизбежно потеряют точность, Python 2.7 теперь выполняет более точное преобразование. Например, в Python 2.6 вычислено следующее:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Результат с плавающей запятой в Python 2.7 больше, но намного ближе к истинному значению:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(Реализовано Марком Дикинсоном; bpo-3166.)
Целочисленное деление также более точно при округлении. (Также реализовано Марком Дикинсоном; bpo-1811.)
Удалено неявное принуждение для комплексных чисел; интерпретатор больше никогда не будет пытаться вызвать метод
__coerce__()для сложных объектов. (Удалено Меадором Инге и Марком Дикинсоном; bpo-5211.)Метод
str.format()теперь поддерживает автоматическую нумерацию полей для замены. Это делает форматированиеstr.format()более похожим на форматирование%s:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
Автоматическая нумерация полей выполняется слева направо, поэтому первый спецификатор
{...}будет использовать в качестве первого аргумента значениеstr.format(), следующий спецификатор будет использовать следующий аргумент и так далее. Вы не можете смешивать автоматическую нумерацию и явную нумерацию - либо пронумеруйте все ваши поля-указатели, либо ни одно из них, - но вы можете смешивать автоматическую нумерацию и именованные поля, как во втором примере выше. (Автор: Эрик Смит; bpo-5237.)Комплексные числа теперь корректно поддерживают использование с
format()и по умолчанию выровнены по правому краю. Указание точности или разделения через запятую применяется как к действительной, так и к мнимой частям числа, но указанная ширина поля и выравнивание применяются ко всему результирующему выводу1.5+3j. (Автор: Эрик Смит; bpo-1588 и bpo-7988.)Код формата „F“ теперь всегда форматирует свои выходные данные с использованием символов верхнего регистра, поэтому теперь он будет выдавать „INF“ и „NAN“. (Автор: Эрик Смит; bpo-3382.)
Изменение низкого уровня: метод
object.__format__()теперь запускаетPendingDeprecationWarning, если ему передана строка формата, потому что метод__format__()дляobjectпреобразует объект в строковое представление и форматирует это. Ранее этот метод автоматически применял строку формата к строковому представлению, но это могло скрыть ошибки в коде Python. Если вы предоставляете информацию о форматировании, такую как выравнивание или точность, предположительно, вы ожидаете, что форматирование будет применено каким-либо специфичным для объекта способом. (Исправлено Эриком Смитом; bpo-7994.)Типы
int()иlong()получили методbit_length, который возвращает количество битов, необходимое для представления его аргумента в двоичном формате:>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(Авторы: Фредрик Йоханссон и Виктор Стиннер; bpo-3439.)
Оператор
importбольше не будет пытаться выполнить абсолютный импорт, если относительный импорт (например,from .os import sep) завершается ошибкой. Это исправляет ошибку, но, возможно, может нарушить работу некоторых операторовimport, которые работали только случайно. (Исправлено Меадором Инге; bpo-7902.)Теперь подкласс встроенного типа
unicodeможет переопределять метод__unicode__(). (Реализовано Виктором Стиннером; bpo-1583863.)Метод
bytearrayтипаtranslate()теперь принимаетNoneв качестве первого аргумента. (Исправлено Георгом Брандлом; bpo-4759.)При использовании
@classmethodи@staticmethodдля обертывания методов как методов класса или статических методов объект-оболочка теперь предоставляет обернутую функцию в качестве их атрибута__func__. (Автор: Амор Форжо д’Арк, по предложению Джорджа Саккиса; bpo-5982.)Когда ограниченный набор атрибутов был задан с помощью
__slots__, удаление неустановленного атрибута не приводило к появлениюAttributeError, как можно было бы ожидать. Исправлено Бенджамином Питерсоном; bpo-7604.)Теперь поддерживаются две новые кодировки: «cp720», используемая в основном для арабского текста; и «cp858», вариант CP850, в который добавлен символ евро. (СР720 подготовлен Александром Бельченко и Амором Форжо д’Арком в bpo-1616979; СР858 подготовлен Тимом Хэтчем в bpo-8016.)
Объект
fileтеперь будет устанавливать атрибутfilenameдля исключенияIOErrorпри попытке открыть каталог на платформах POSIX (отмечено Яном Калишевски; bpo-4764), и теперь явно проверяет наличие и запрещает запись в файловые объекты, доступные только для чтения, вместо того, чтобы доверять библиотеке C отлавливать ошибку и сообщать о ней (исправлено Стефаном Крахом; bpo-5677).Токенизатор Python теперь сам переводит окончания строк, поэтому встроенная функция
compile()теперь принимает код, используя любое соглашение о завершении строки. Кроме того, больше не требуется, чтобы код отображался в новой строке.Дополнительные круглые скобки в определениях функций недопустимы в Python 3.x, что означает, что вы получите синтаксическую ошибку с
def f((x)): pass. В режиме предупреждения Python3 Python 2.7 теперь будет предупреждать об этом странном использовании. (Отмечено Джеймсом Лингардом; bpo-7362.)Теперь можно создавать слабые ссылки на объекты класса старого образца. Классы нового образца всегда имели слабые ссылки. (Исправлено Антуаном Питру; bpo-8268.)
Когда объект модуля очищается от мусора, словарь модуля теперь очищается только в том случае, если ни у кого другого нет ссылки на этот словарь (bpo-7140).
Изменения в интерпретаторе¶
Новая переменная среды, PYTHONWARNINGS, позволяет управлять предупреждениями. Она должна быть установлена в строку, содержащую параметры предупреждения, эквивалентные тем, которые используются с параметром -W, разделенные запятыми. (Автор: Брайан Кертин; bpo-7301.)
Например, следующая настройка будет выводить предупреждения при каждом их появлении, но превратит предупреждения из модуля Cookie в ошибку. (Точный синтаксис для установки переменной среды различается в разных операционных системах и оболочках).
export PYTHONWARNINGS=all,error:::Cookie:0
Оптимизация¶
Было добавлено несколько улучшений производительности:
Был добавлен новый код операции для выполнения начальной настройки для операторов
withс поиском методов__enter__()и__exit__(). (Автор - Бенджамин Петерсон).Сборщик мусора теперь работает лучше для одной распространенной схемы использования: когда выделяется много объектов без освобождения какого-либо из них. Раньше для сбора мусора требовалось квадратичное время, но теперь количество полных сборок мусора уменьшается по мере роста количества объектов в куче. Новая логика выполняет полную сборку мусора только тогда, когда среднее поколение было собрано 10 раз и когда количество уцелевших объектов среднего поколения превышает 10% от количества объектов самого старого поколения. (Предложено Мартином фон Левисом и реализовано Антуаном Питру; bpo-4074.)
Сборщик мусора пытается избежать отслеживания простых контейнеров, которые не могут быть частью цикла. В Python 2.7 это теперь верно для кортежей и dicts, содержащих атомарные типы (такие как целые числа, строки и т.д.). Транзитивно dict, содержащий кортежи атомарных типов, также не будет отслеживаться. Это помогает снизить стоимость каждой сборки мусора за счет уменьшения количества объектов, которые должны быть рассмотрены и пройдены сборщиком. (Автор: Антуан Питру; bpo-4688.)
Длинные целые числа теперь хранятся внутри системы либо в базе
2**15, либо в базе2**30, причем база определяется во время сборки. Ранее они всегда хранились в базе2**15. Использование базовой версии2**30значительно повышает производительность на 64-разрядных компьютерах, но результаты тестирования на 32-разрядных компьютерах были неоднозначными. Таким образом, по умолчанию используется base2**30на 64-разрядных компьютерах и base2**15на 32-разрядных компьютерах; в Unix есть новый параметр configure--enable-big-digits, который можно использовать для переопределения этого параметра по умолчанию.Помимо улучшения производительности, это изменение должно быть незаметным для конечных пользователей, за одним исключением: для целей тестирования и отладки добавлен новый structseq
sys.long_info, который предоставляет информацию о внутреннем формате, указывая количество бит на цифру и размер в байтах используемого типа C для сохранения каждой цифры:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Автор: Марк Дикинсон; bpo-4258.)
В результате других изменений размер длинных объектов уменьшился на несколько байт: на 2 байта в 32-разрядных системах и на 6 байт в 64-разрядных. (Автор: Марк Дикинсон; bpo-5260.)
Алгоритм деления длинных целых чисел был ускорен за счет сокращения внутреннего цикла, выполнения сдвигов вместо умножения и устранения ненужных дополнительных итераций. Различные тесты показывают, что при делении длинных целых чисел и операциях по модулю ускорение составляет от 50% до 150%. (Автор: Марк Дикинсон; bpo-5512.) Побитовые операции также значительно ускоряются (первоначальный патч от Грегори Смита; bpo-1087418).
Реализация
%проверяет, является ли левый операнд строкой Python, и использует его в особых случаях; это приводит к увеличению производительности на 1-3% для приложений, которые часто используют%со строками, таких как библиотеки шаблонов. (Реализовано Коллином Уинтером; bpo-5176.)Значения списка с условием
ifкомпилируются в более быстрый байт-код. (Патч от Antoine Pitrou, перенесенный на версию 2.7 Джеффри Ясскином; bpo-4715.)Преобразование целого или длинного целого числа в десятичную строку было ускорено с помощью специальной базы данных 10 вместо использования обобщенной функции преобразования, поддерживающей произвольные базы данных. (Исправление от Гавейна Болтона; bpo-6713.)
Методы
split(),replace(),rindex(),rpartition(), иrsplit()для типов, подобных string (строки, строки в Юникоде иbytearrayобъекты), теперь используют алгоритм быстрого обратного поиска вместо посимвольного сканирования. Иногда это происходит быстрее в 10 раз. (Добавлено Флораном Шиклуной; bpo-7462 и bpo-7622.)Модули
pickleиcPickleтеперь автоматически вставляют строки, используемые для имен атрибутов, что сокращает использование памяти объектами, полученными в результате распаковки. (Автор: Джейк Макгуайр; bpo-5084.)В модуле
cPickleдобавлены словари для особых случаев, что почти вдвое сокращает время, необходимое для их обработки. (Автор: Коллин Винтер; bpo-5670.)
Новые и улучшенные модули¶
Как и в каждом выпуске, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот неполный список наиболее заметных изменений, отсортированных в алфавитном порядке по названию модуля. Обратитесь к файлу Misc/NEWS в дереве исходного кода для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.
Базовый класс отладки модуля
bdbBdbполучил возможность пропускать модули. Конструктор теперь принимает iterable, содержащий шаблоны в стиле glob, такие какdjango.*; отладчик не будет переходить во фреймы стека из модуля, который соответствует одному из этих шаблонов. (Подготовлено Мару Ньюби по предложению Сентила Кумарана; bpo-5142.)Модуль
binasciiтеперь поддерживает API-интерфейс buffer, поэтому его можно использовать с экземплярамиmemoryviewи другими подобными объектами buffer. (Перенесено из 3.x автором является Florent Xicluna; bpo-7703.)Обновленный модуль: модуль
bsddbбыл обновлен с версии 4.7.2devel9 до версии 4.8.4 версии the pybsddb package. В новой версии улучшена совместимость с Python 3.x, исправлены различные ошибки и добавлены несколько новых флагов и методов BerkeleyDB. ((Обновлено Хесусом Сеа Авионом; bpo-8156. Список изменений pybsddb можно прочитать по адресу https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)Модуль
bz2BZ2Fileтеперь поддерживает протокол управления контекстом, поэтому вы можете написатьwith bz2.BZ2File(...) as f:. (Автор: Хаген Фюрстенау; bpo-3860.)Новый класс: класс
Counterв модулеcollectionsполезен для подсчета данных. экземплярыCounterведут себя в основном как словари, но возвращают ноль для отсутствующих ключей вместоKeyError:>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
Существует три дополнительных метода
Counter.most_common()возвращает N наиболее распространенных элементов и их количество.elements()возвращает итератор для содержащихся в нем элементов, повторяющий каждый элемент столько раз, сколько его количество.subtract()принимает итерацию и вычитает единицу для каждого элемента вместо добавления; если аргументом является словарь или другойCounter, количество отсчетов вычитается.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
Автор: Раймонд Хеттингер; bpo-1696199.
Новый класс:
OrderedDictописан в предыдущем разделе PEP 372: Добавление упорядоченного словаря в коллекции.Новый метод: Тип данных
dequeтеперь имеет методcount(), который возвращает количество содержащихся в нем элементов, равное указанному аргументу x, и методreverse(), который изменяет элементы deque на противоположные.dequeтакже указывает его максимальную длину как атрибут, доступный только для чтенияmaxlen. (Обе функции добавлены Раймондом Хеттингером).Класс
namedtupleтеперь имеет необязательный параметр rename. Если значение rename равно true, имена полей, которые являются недопустимыми, поскольку они повторялись, или не являются допустимыми идентификаторами Python, будут переименованы в допустимые имена, которые являются производными от позиции поля в списке полей:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(Добавлено Раймондом Хеттингером; bpo-1818.)
Наконец, абстрактный базовый класс
Mappingтеперь возвращаетNotImplemented, если сопоставление сравнивается с другим типом, который не являетсяMapping. (Исправлено Даниэлем Штутцбахом; bpo-8729.)Конструкторы для классов синтаксического анализа в модуле
ConfigParserтеперь принимают параметр allow_no_value, значение которого по умолчанию равно false; если true, будут разрешены параметры без значений. Например:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(Автор: Матс Киндал; bpo-7005.)
Устаревшая функция:
contextlib.nested(), которая позволяет управлять несколькими контекстными менеджерами с помощью одного оператораwith, была признана устаревшей, поскольку операторwithтеперь поддерживает несколько контекстных менеджеров.Модуль
cookielibтеперь игнорирует файлы cookie, содержащие недопустимое поле версии, которое не содержит целого значения. (Исправлено Джоном Дж. Ли; bpo-3924.)Функция
copyмодуляdeepcopy()теперь будет корректно копировать связанные методы экземпляра. (Реализовано Робертом Коллинзом; bpo-1515.)Модуль
ctypesтеперь всегда преобразуетNoneв указатель переменного токаNULLдля аргументов, объявленных как указатели. (Изменено Томасом Хеллером; bpo-4606.) Базовый libffi library был обновлен до версии 3.0.9, содержащей различные исправления для различных платформ. (Обновлено Маттиасом Клозе; bpo-8142.)Новый метод: класс
datetimeмодуляtimedeltaполучил методtotal_seconds(), который возвращает количество секунд в продолжительности. (Автор: Брайан Квинлан; bpo-5788.)Новый метод: класс
Decimalполучил метод классаfrom_float(), который выполняет точное преобразование числа с плавающей запятой вDecimal. Это точное преобразование стремится к максимально близкому десятичному приближению к значению представления с плавающей запятой; поэтому результирующее десятичное значение все равно будет содержать неточность, если таковая имеется. Например,Decimal.from_float(0.1)возвращаетDecimal('0.1000000000000000055511151231257827021181583404541015625'). (Реализовано Раймондом Хеттингером; bpo-4796.)Сравнение экземпляров
Decimalс числами с плавающей запятой теперь дает разумные результаты, основанные на числовых значениях операндов. Ранее такие сравнения основывались на правилах Python по умолчанию для сравнения объектов, которые давали произвольные результаты в зависимости от их типа. Обратите внимание, что вы по-прежнему не можете комбинироватьDecimalи числа с плавающей запятой в других операциях, таких как сложение, поскольку вы должны явно выбирать способ преобразования между числами с плавающей запятой иDecimal. (Исправлено Марком Дикинсоном; bpo-2531.)Конструктор для
Decimalтеперь поддерживает числа с плавающей запятой (добавлены Раймондом Хеттингером; bpo-8257) и неевропейские символы Юникода, такие как арабско-индийские цифры (добавлены Марком Дикинсоном; bpo-6595).Большинство методов класса
Contextтеперь принимают целые числа, а также экземплярыDecimal; единственными исключениями являются методыcanonical()иis_canonical(). (Патч от Хуана Хосе Конти; bpo-7633.)При использовании экземпляров
Decimalсо строковым методомformat()выравнивание по умолчанию ранее выполнялось по левому краю. Теперь оно изменено на выравнивание по правому краю, что более удобно для числовых типов. (Изменено Марком Дикинсоном; bpo-6857.)Сравнения, включающие сигнальное значение NaN (или
sNAN), теперь сигнализируют о значенииInvalidOperationвместо того, чтобы автоматически возвращать значение true или false в зависимости от оператора сравнения. Значения NaN (илиNaN) теперь доступны для хэширования. (Исправлено Марком Дикинсоном; bpo-7279.)Модуль
difflibтеперь выдает выходные данные, более совместимые с современными инструментами diff/patch благодаря одному небольшому изменению: вместо пробелов в качестве разделителя в заголовке, указывающем имя файла, используется символ табуляции. (Исправлено Анатолием Тектоником; bpo-7585.)Команда Distutils
sdistтеперь всегда восстанавливает файлMANIFEST, поскольку, даже если файлыMANIFEST.inилиsetup.pyне были изменены, пользователь, возможно, создал несколько новых файлов, которые следует включить. (Исправлено Тареком Зиаде; bpo-8688.)Флаг
doctestмодуляIGNORE_EXCEPTION_DETAILтеперь будет игнорировать имя модуля, содержащего тестируемое исключение. (Исправление от Леннарта Регебро; bpo-7490.)Класс
emailмодуляMessageтеперь будет принимать полезную нагрузку, выраженную в Юникоде, автоматически преобразуя полезную нагрузку в кодировку, указанную вoutput_charset. (Добавлено Р. Дэвидом Мюрреем; bpo-1368247.)Класс
Fractionтеперь принимает один экземпляр с плавающей точкой илиDecimalили два рациональных числа в качестве аргументов своего конструктора. (Реализовано Марком Дикинсоном; в bpo-5812 добавлены рациональные числа, а в bpo-8294 - число с плавающей запятой/десятичное число.)Упорядочивание сравнений (
<,<=,>,>=) между дробями и комплексными числами теперь возникаетTypeError. Это исправляет оплошность, из-за которойFractionсоответствует другим числовым типам.Новый класс:
FTP_TLSв модулеftplibобеспечивает безопасные FTP-соединения с использованием TLS-инкапсуляции для аутентификации, а также последующего управления и передачи данных. (Автор: Джампаоло Родола; bpo-2054.)Метод
storbinary()для бинарных загрузок теперь может перезапускать загрузку благодаря добавленному параметру rest (исправление Пабло Музо; bpo-6845.)Новый декоратор класса:
total_ordering()в модулеfunctoolsберется класс, который определяет метод__eq__()и один из__lt__(),__le__(),__gt__()или__ge__(), и генерирует недостающие методы сравнения. Поскольку метод__cmp__()в Python 3.x признан устаревшим, этот декоратор упрощает определение упорядоченных классов. (Добавлено Раймондом Хеттингером; bpo-5479.)Новая функция:
cmp_to_key()будет принимать функцию сравнения старого образца, которая ожидает два аргумента, и возвращать новый вызываемый объект, который можно использовать в качестве параметра key для таких функций, какsorted(),min()иmax()и т.д. Основное предназначение - помочь сделать код совместимым с Python 3.x. (Добавлено Раймондом Хеттингером).Новая функция:
gcмодуляis_tracked()возвращает значение true, если данный экземпляр отслеживается сборщиком мусора, в противном случае - значение false. (Автор: Антуан Питру; bpo-4688.)Модуль
gzipGzipFileтеперь поддерживает протокол управления контекстом, так что вы можете написатьwith gzip.GzipFile(...) as f:(добавлено Хагеном Фюрстенау; bpo-3860), и теперь он реализуетio.BufferedIOBaseABC, чтобы вы могли дополнить егоio.BufferedReaderдля более быстрой обработки (предоставлено помощниками Nir; bpo-7471). Также теперь можно переопределить время модификации, записанное в сжатом файле, предоставив конструктору необязательную временную метку. (Автор - Жак Фреше; bpo-4272.)Файлы в формате gzip могут быть дополнены конечными нулевыми байтами; модуль
gzipтеперь будет использовать эти конечные байты. (Исправлено Тадеком Пьетрашеком и Брайаном Кертином; bpo-2846.)Новый атрибут: модуль
hashlibтеперь имеет атрибутalgorithms, содержащий кортеж с именами поддерживаемых алгоритмов. В Python 2.7hashlib.algorithmsсодержит('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Автор: Карл Шене; bpo-7418.)Класс
HTTPResponse, используемый модулемhttplibпо умолчанию, теперь поддерживает буферизацию, что значительно ускоряет чтение HTTP-ответов. (Автор: Кристьян Валюр Йонссон; bpo-4879.)Классы
HTTPConnectionиHTTPSConnectionтеперь поддерживают параметр source_address, состоящий из 2-х кортежей(host, port), указывающих адрес источника, который будет использоваться для подключения. (Автор: Элдон Зиглер; bpo-3972.)Модуль
ihooksтеперь поддерживает относительный импорт. Обратите внимание, чтоihooks- это более старый модуль для настройки импорта, замененный модулемimputil, добавленным в Python 2.0. (Относительная поддержка импорта добавлена Нилом Шеменауэром).Модуль
imaplibтеперь поддерживает IPv6-адреса. (Автор: Дерек Морр; bpo-1655.)Новая функция: модуль
inspectgetcallargs()принимает вызываемый объект и его позиционные аргументы и аргументы ключевого слова и вычисляет, какие из параметров вызываемого объекта получат каждый аргумент, возвращая словарь, сопоставляющий имена аргументов с их значениями. Например:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Автор: Джордж Саккис; bpo-3135.
Обновленный модуль: Библиотека
ioобновлена до версии, поставляемой с Python 3.1. В версии 3.1 библиотека ввода-вывода была полностью переписана на C и работает в 2-20 раз быстрее в зависимости от выполняемой задачи. Первоначальная версия Python была переименована в модуль_pyio.Одно незначительное изменение в результате: класс
io.TextIOBaseтеперь имеет атрибутerrors, указывающий параметр error, используемый для ошибок кодирования и декодирования (один из'strict','replace','ignore').Класс
io.FileIOтеперь выдает значениеOSErrorпри передаче недопустимого файлового дескриптора. (Реализовано Бенджамином Питерсоном; bpo-4991.) Методtruncate()теперь сохраняет положение файла; ранее он изменял положение файла на конец нового файла. (Исправлено Паскалем Шамбоном; bpo-6939.)Новая функция:
itertools.compress(data, selectors)выполняет два итератора. Элементы data возвращаются, если соответствующее значение в selectors равно true:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
Новая функция:
itertools.combinations_with_replacement(iter, r)возвращает все возможные комбинации элементов длиной r из повторяемого iter. В отличие отcombinations(), отдельные элементы могут повторяться в сгенерированных комбинациях:itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
Обратите внимание, что элементы считаются уникальными в зависимости от их положения во входных данных, а не от их фактических значений.
Функция
itertools.count()теперь имеет аргумент step, который позволяет увеличивать значение на значения, отличные от 1.count()также теперь допускает аргументы с ключевыми словами и использование нецелочисленных значений, таких как числа с плавающей запятой или экземплярыDecimal. (Реализовано Раймондом Хеттингером; bpo-5032.)itertools.combinations()иitertools.product()ранее вызывалисьValueErrorдля значений r, превышающих входную итерацию. Это было сочтено ошибкой спецификации, поэтому теперь они возвращают пустой итератор. (Исправлено Раймондом Хеттингером; bpo-4816.)Обновленный модуль: Модуль
jsonбыл обновлен до версии 2.0.9 пакета simplejson, который включает расширение C, ускоряющее кодирование и декодирование. (Автор Боб Ипполито; bpo-4136.)Для поддержки нового типа
collections.OrderedDictвjson.load()теперь добавлен необязательный параметр object_pairs_hook, который будет вызываться с любым объектным литералом, который декодируется в список пар. (Автор: Раймонд Хеттингер; bpo-5381.)Класс
mailboxмодуляMaildirтеперь записывает временную метку для каталогов, которые он считывает, и перечитывает их только в том случае, если время изменения впоследствии изменилось. Это повышает производительность, позволяя избежать ненужных проверок каталогов. (Исправлено А. М. Кухлингом и Антуаном Питру; bpo-1607951, bpo-6896.)Новые функции: модуль
mathполучилerf()иerfc()для функции ошибки и дополнительной функции ошибки,expm1()которая вычисляетe**x - 1с большей точностью, чем при использованииexp()и вычитаем 1,gamma()для гамма-функции иlgamma()для натурального логарифма Гамма-функции. (Авторы: Марк Дикинсон и Нирина Раселиарисон; bpo-3366.)Классам
multiprocessingмодуляManager*теперь можно передавать вызываемый объект, который будет вызываться всякий раз, когда запускается подпроцесс, вместе с набором аргументов, которые будут передаваться вызываемому объекту. ((Предоставлено лекмой; bpo-5585.)Класс
Pool, который управляет пулом рабочих процессов, теперь имеет необязательный параметр maxtasksperchild. Рабочие процессы выполнят указанное количество задач, а затем завершат работу, в результате чегоPoolзапустит новый рабочий процесс. Это полезно, если при выполнении задач может возникнуть утечка памяти или других ресурсов, или если из-за некоторых задач рабочий ресурс становится очень большим. (Автор Чарльз Казабон; bpo-6963.)Модуль
nntplibтеперь поддерживает IPv6-адреса. (Автор: Дерек Морр; bpo-1664.)Новые функции: модуль
osобрабатывает следующие системные вызовы POSIX:getresgid()иgetresuid(), которые возвращают реальные, эффективные и сохраненные идентификаторы GID и UID;setresgid()иsetresuid(), которые устанавливают реальные, эффективные и сохраненные идентификаторы GID и UIDS на новые значения;initgroups(), которые инициализируют список группового доступа для текущего процесса. (Функции GID/UID предоставлены Трэвисом Х.; bpo-6508. Поддержка групп инициализации добавлена Жан-Полем Кальдероне; bpo-7333.)Функция
os.fork()теперь повторно инициализирует блокировку импорта в дочернем процессе; это устраняет проблемы в Solaris, когдаfork()вызывается из потока. (Исправлено Zsolt Cserna; bpo-7242.)В модуле
os.pathфункцииnormpath()иabspath()теперь сохраняют Юникод; если их входной путь представляет собой строку в Юникоде, возвращаемое значение также является строкой в Юникоде. (normpath()исправлено с помощью Мэтт Джука в фильме bpo-5827;abspath()исправлено Эцио Мелотти в bpo-3426.)В модуле
pydocтеперь есть справка по различным символам, используемым в Python. Теперь вы можете использовать, например,help('<<')илиhelp('@'). (Автор Дэвид Лабан; bpo-4739.)Модули
resplit(),sub(), иsubn()теперь принимают необязательный аргумент flags для согласованности с другими функциями модуля. (Добавлено Грегори П. Смитом.)Новая функция:
run_path()в модулеrunpyвыполнит код при указанном аргументе path. path может быть путем к исходному файлу Python (example.py), файлу с скомпилированным байт-кодом (example.pyc), каталогу (./package/), или zip-архиву (example.zip). Если указан каталог или zip-путь, он будет добавлен в началоsys.pathи модуль__main__будет импортирован. Ожидается, что каталог или zip-файл содержат__main__.py; если это не так, то какой-либо другой__main__.pyможет быть импортирован из местоположения позже вsys.path. Это делает более доступным механизмrunpyдля сценариев, которые хотят имитировать то, как командная строка Python обрабатывает явное имя пути. (Добавлено Ником Когланом; bpo-6816.)Новая функция: в модуле
shutilmake_archive()принимает имя файла, тип архива (формат zip или tar) и путь к каталогу и создает архив, содержащий содержимое каталога. ((Добавлено Тареком Зиаде.)Функции
shutil’scopyfile()иcopytree()теперь генерируют исключениеSpecialFileErrorпри запросе скопировать именованный канал. Ранее код обрабатывал именованные каналы как обычный файл, открывая их для чтения, и это блокировало бы их на неопределенный срок. (Исправлено Антуаном Питру; bpo-3002.)Модуль
signalбольше не переустанавливает обработчик сигналов, если это действительно не является необходимым, что устраняет ошибку, из-за которой было невозможно надежно перехватить сигнал EINTR. (Исправлено Шарлем-Франсуа Натали; bpo-8354.)Новые функции: в модуле
siteтри новые функции возвращают различные пути, зависящие от сайта и пользователя.getsitepackages()возвращает список, содержащий все глобальные каталоги пакетов сайта,getusersitepackages()возвращает путь к каталогу пакетов сайта пользователя, аgetuserbase()возвращает значение переменной окруженияUSER_BASE, указывает путь к каталогу, который может быть использован для хранения данных. (Автор: Тарек Зиаде; bpo-6693.)Модуль
siteтеперь сообщает об исключениях, возникающих при импорте модуляsitecustomize, и больше не будет перехватывать и проглатывать исключениеKeyboardInterrupt. (Исправлено Виктором Стиннером; bpo-3137.)Функция
create_connection()получила параметр source_address, представляющий собой(host, port)2-й кортеж, указывающий адрес источника, который будет использоваться для подключения. (Автор: Элдон Зиглер; bpo-3972.)Методы
recv_into()иrecvfrom_into()теперь будут записываться в объекты, поддерживающие buffer API, наиболее эффективно в объектыbytearrayиmemoryview. (Реализовано Антуаном Питру; bpo-8104.)Класс
SocketServerмодуляTCPServerтеперь поддерживает тайм-ауты сокетов и отключение алгоритма Nagle. Атрибутdisable_nagle_algorithmпо умолчанию имеет значениеFalse; если переопределить значение true, для новых соединений с запросами будет установлен параметр TCP_NODELAY, чтобы предотвратить буферизацию множества небольших отправлений в одном TCP-пакете. Атрибут классаtimeoutможет содержать время ожидания в секундах, которое будет применено к сокету запроса; если в течение этого времени запрос не будет получен, будет вызванhandle_timeout()и будет возвращенhandle_request(). (Автор: Кристьян Валюр Йонссон; bpo-6192 и bpo-6267.)Обновленный модуль: модуль
sqlite3был обновлен до версии 2.6.0 версии pysqlite package. Версия 2.6.0 содержит ряд исправлений и добавляет возможность загружать расширения SQLite из общих библиотек. Вызовите методenable_load_extension(True), чтобы включить расширения, а затем вызовите методload_extension()для загрузки определенной разделяемой библиотеки. (Обновлено Герхардом Херингом).Объекты модуля
sslSSLSocketтеперь поддерживают buffer API, который исправил ошибку набора тестов (исправлено Антуаном Питру; bpo-7133) и автоматически установил OpenSSLSSL_MODE_AUTO_RETRY, который предотвратит возврат кода ошибки изrecv()операций, которые запускают повторное согласование SSL (исправлено Антуаном Питру; bpo-8222).Функция-конструктор
wrap_socket()теперь принимает аргумент ciphers, представляющий собой строку со списком разрешенных алгоритмов шифрования; формат строки описан как in the OpenSSL documentation. (Добавлено Антуаном Питру; bpo-8322.)Еще одно изменение заставляет расширение загружать все шифры Openssl и алгоритмы дайджеста, чтобы все они были доступны. Не удалось проверить некоторые SSL-сертификаты, что приводит к ошибке «неизвестный алгоритм». (Сообщено Бедой Косатой и исправлено Антуаном Питру; bpo-8484.)
Используемая версия OpenSSL теперь доступна в виде атрибутов модуля
ssl.OPENSSL_VERSION(строка),ssl.OPENSSL_VERSION_INFO( кортеж из 5) иssl.OPENSSL_VERSION_NUMBER(целое число). (Добавлено Антуаном Питру; bpo-8321.)Модуль
structбольше не будет автоматически игнорировать ошибки переполнения, когда значение слишком велико для определенного кода целочисленного формата (одного изbBhHiIlLqQ); теперь он всегда вызывает исключениеstruct.error. (Изменено Марком Дикинсоном; bpo-1523.) Функцияpack()также попытается использовать__index__()для преобразования и упаковки нецелых чисел, прежде чем использовать метод__int__()или сообщить об ошибке. (Изменено Марком Дикинсоном; bpo-8300.)Новая функция: модуль
subprocesscheck_output()запускает команду с указанным набором аргументов и возвращает выходные данные команды в виде строки, когда команда выполняется без ошибок, или вызывает исключениеCalledProcessErrorв противном случае.>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(Автор: Грегори П. Смит.)
Модуль
subprocessтеперь будет повторять свои внутренние системные вызовы при получении сигналаEINTR. (Об этом сообщили несколько человек; последнее исправление Грегори П. Смита в bpo-1068268.)Новая функция:
is_declared_global()в модулеsymtableвозвращает значение true для переменных, которые явно объявлены глобальными, и значение false для переменных, которые являются глобальными неявно. (Автор Джереми Хилтон).Модуль
syslogтеперь будет использовать значениеsys.argv[0]в качестве идентификатора вместо предыдущего значения по умолчанию'python'. (Изменено Шоном Райфшнайдером; bpo-8451.)Значение
sys.version_infoтеперь представляет собой именованный кортеж с атрибутами с именамиmajor,minor,micro,releaselevel, иserial. (Автор: Росс Лайт; bpo-4285.)sys.getwindowsversion()также возвращает именованный кортеж с атрибутами с именамиmajor,minor,build,platform,service_pack,service_pack_major,service_pack_minor,suite_mask, иproduct_type. (Автор: Брайан Кертин; bpo-7766.)В модуле
tarfileизменена обработка ошибок по умолчанию, чтобы больше не подавлять фатальные ошибки. Уровень ошибок по умолчанию ранее был равен 0, что означало, что ошибки приводили только к записи сообщения в журнал отладки, но поскольку журнал отладки по умолчанию не активирован, эти ошибки остаются незамеченными. Уровень ошибок по умолчанию теперь равен 1, что приводит к возникновению исключения при наличии ошибки. (Изменено Ларсом Густабелем; bpo-7357.)tarfileтеперь поддерживается фильтрация объектовTarInfo, добавляемых в tar-файл. При вызовеadd()вы можете указать необязательный аргумент filter, который может быть вызван. Вызываемому фильтру будет передаватьсяTarInfoдля каждого добавляемого файла, и он может изменять и возвращать его. Если вызываемый файл возвращаетNone, файл будет исключен из результирующего архива. Это более мощный параметр, чем существующий аргумент exclude, который, следовательно, устарел. (Добавлен Ларсом Густабелем); bpo-6856.) КлассTarFileтеперь также поддерживает протокол управления контекстом. (Добавлено Ларсом Густабелем; bpo-7232.)Метод
wait()классаthreading.Eventтеперь возвращает внутренний флаг при выходе. Это означает, что метод обычно возвращает значение true, посколькуwait()должен блокироваться до тех пор, пока внутренний флаг не станет true. Возвращаемое значение будет равно false только в том случае, если был задан тайм-аут и время выполнения операции истекло. (Автор: Тим Лешер; bpo-1674032.)База данных Unicode, предоставляемая модулем
unicodedata, теперь используется внутри системы для определения того, какие символы являются числовыми, пробельными или представляют собой разрывы строк. База данных также содержит информацию из файла данныхUnihan.txt(исправление от Андерса Кригстрема и Амора Форжо д’Арк; bpo-1571184) и была обновлена до версии 5.2.0 (обновлено Флораном Шиклуной; bpo-8024).Модуль
urlparseurlsplit()теперь обрабатывает неизвестные схемы URL-адресов в соответствии с RFC 3986: если URL-адрес имеет вид"<something>://...", текст перед://рассматривается как схема, даже если это выдуманная схема, о которой модуль не знает. Это изменение может нарушить работу кода, который работал с прежним поведением. Например, Python 2.6.4 или 2.5 вернет следующее:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (и Python 2.6.5) вернет:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
((Python 2.7 на самом деле выдает немного другой результат, поскольку возвращает именованный кортеж вместо стандартного кортежа.)
Модуль
urlparseтакже поддерживает литеральные адреса IPv6, определенные в RFC 2732 (автор - Сентил Кумаран; bpo-2987).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
Новый класс: класс
WeakSetв модулеweakrefпредставляет собой набор, который содержит только слабые ссылки на свои элементы; элементы будут удалены, как только не останется ссылок, указывающих на них. (Первоначально реализован на Python 3.x Раймондом Хеттингером и перенесен на версию 2.7 Майклом Фордом.)Библиотека
xml.etree.ElementTreeбольше не экранирует амперсанды и угловые скобки при выводе команды обработки XML (которая выглядит как<?xml-stylesheet href="#style1"?>) или комментария (который выглядит как<!-- comment -->). (Патч от Нила Мюллера; bpo-2746.)Клиент и сервер XML-RPC, предоставляемые модулями
xmlrpclibиSimpleXMLRPCServer, улучшили производительность благодаря поддержке HTTP/1.1 keep-alive и дополнительному использованию кодировки gzip для сжатия передаваемого XML-файла. Сжатие в формате gzip контролируется атрибутомencode_thresholdвSimpleXMLRPCRequestHandler, который содержит размер в байтах; ответы, превышающие этот размер, будут сжаты. (Автор: Кристиан Валюр Йонссон; bpo-6267.)Модуль
zipfileZipFileтеперь поддерживает протокол управления контекстом, поэтому вы можете написатьwith zipfile.ZipFile(...) as f:. (Автор Брайан Кертин; bpo-5511.)zipfileтеперь также поддерживается архивирование пустых каталогов и их корректное извлечение. (Исправлено Kuba Wieczorek; bpo-4710.) Чтение файлов из архива стало быстрее, а чередованиеread()иreadline()теперь работает корректно. (Предоставлено Nir Aides; bpo-7610.)Функция
is_zipfile()теперь принимает файловый объект в дополнение к именам путей, принятым в более ранних версиях. (Автор: Габриэль Дженеллина; bpo-4756.)Метод
writestr()теперь имеет необязательный параметр compress_type, который позволяет переопределить метод сжатия по умолчанию, указанный в конструктореZipFile. (Автор: Рональд Оуссорен; bpo-6003.)
Новый модуль: importlib¶
Python 3.1 включает в себя пакет importlib, представляющий собой повторную реализацию логики, лежащей в основе инструкции Python import. importlib полезен разработчикам интерпретаторов Python и пользователям, которые хотят написать новые импортеры, которые могут участвовать в разработке. процесс импорта. Python 2.7 не содержит полного пакета importlib, но вместо этого имеет крошечное подмножество, содержащее одну функцию, import_module().
import_module(name, package=None) импортирует модуль. name - это строка, содержащая название модуля или пакета. Можно выполнить относительный импорт, указав строку, которая начинается с символа ., например ..utils.errors. Для относительного импорта должен быть указан аргумент package, который является именем пакета, который будет использоваться в качестве привязки для относительного импорта. import_module() одновременно вставляет импортированный модуль в sys.modules и возвращает объект module.
Вот несколько примеров:
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib был реализован Бреттом Кэнноном и представлен в Python 3.1.
Новый модуль: sysconfig¶
Модуль sysconfig был удален из пакета Distutils, став самостоятельным модулем верхнего уровня. sysconfig предоставляет функции для получения информации о процессе сборки Python: переключателях компилятора, путях установки, названии платформы и о том, используется ли Python запускается из своего исходного каталога.
Вот некоторые из функций этого модуля:
get_config_var()возвращает переменные из Makefile Python и файлаpyconfig.h.get_config_vars()возвращает словарь, содержащий все переменные конфигурации.get_path()возвращает настроенный путь к модулю определенного типа: стандартной библиотеке, модулям для конкретного сайта, модулям для конкретной платформы и т.д.is_python_build()возвращает значение true, если вы запускаете двоичный файл из дерева исходных текстов Python, и значение false в противном случае.
Обратитесь к документации sysconfig для получения более подробной информации и полного списка функций.
Пакет Distutils и sysconfig не поддерживаются Тареком Зиаде, который также запустил пакет Distutils2 (репозиторий исходных текстов по адресу https://hg.python.org/distutils2/) для разработки версии Distutils следующего поколения.
ttk: Тематические виджеты для Tk¶
Tcl/Tk 8.5 включает в себя набор тематических виджетов, которые повторяют базовые виджеты Tk, но имеют более настраиваемый внешний вид и, следовательно, могут больше походить на виджеты родной платформы. Этот набор виджетов изначально назывался Tile, но был переименован в Ttk (что означает «тематическое Тз») после добавления в Tcl/Tk версии 8.5.
Чтобы узнать больше, ознакомьтесь с документацией по модулю ttk. Возможно, вы также захотите ознакомиться со страницей руководства по Tcl/Tk, описывающей движок тем Ttk, доступной по адресу https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Некоторые скриншоты используемого кода на Python/Ttk приведены по адресу https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.
Модуль tkinter.ttk был написан Гильерме Поло и добавлен в bpo-2983. Альтернативная версия под названием Tile.py, написанная Мартином Франклином и поддерживаемая Кевином Уолцером, была предложена для включения в bpo-2618, но авторы утверждали, что работа Гильерме Поло была более всеобъемлющей.
Обновленный модуль: unittest¶
Модуль unittest был значительно усовершенствован, было добавлено много новых функций. Большинство из этих функций были реализованы Майклом Фордом, если не указано иное. Расширенную версию модуля можно загрузить отдельно для использования с версиями Python 2.4-2.6, она поставляется в виде пакета unittest2 с сайта https://pypi.org/project/unittest2.
При использовании из командной строки модуль может автоматически обнаруживать тесты. Он не такой сложный, как py.test или nose, но предоставляет простой способ запуска тестов, хранящихся в наборе каталогов пакетов. Например, следующая команда выполнит поиск в подкаталоге test/ любых импортируемых тестовых файлов с именем test*.py:
python -m unittest discover -s test
Обратитесь к документации по модулю unittest для получения более подробной информации. (Разработано в bpo-6001.)
Функция main() поддерживает некоторые другие новые опции:
-bили--bufferбудут буферизовать стандартный вывод и потоки стандартных ошибок во время каждого теста. Если тест пройден успешно, все результирующие выходные данные будут удалены; в случае сбоя будут отображены буферизованные выходные данные.-cили--catchприведет к более корректной обработке прерывания control-C. Вместо немедленного прерывания процесса тестирования будет завершен текущий тест, а затем будут представлены частичные результаты, вплоть до прерывания. Если вам не терпится, повторное нажатие кнопки control-C приведет к немедленному прерыванию работы.Этот обработчик control-C пытается избежать возникновения проблем, когда тестируемый код или выполняемые тесты сами определяют обработчик сигнала, замечая, что обработчик сигнала уже установлен, и вызывая его. Если у вас это не работает, есть
removeHandler()декоратор, который можно использовать для пометки тестов, в которых должна быть отключена обработка control-C.-fили--failfastнемедленно останавливает выполнение теста при сбое, вместо того чтобы продолжать выполнение дальнейших тестов. (Предложено Клиффом Дайером и реализовано Майклом Фордом; bpo-8074.)
В сообщениях о ходе выполнения теперь отображается «x» для ожидаемых сбоев и «u» для неожиданных успехов при запуске в подробном режиме. (Автор: Бенджамин Питерсон).
Тестовые примеры могут вызывать исключение SkipTest для пропуска теста (bpo-1034053).
Сообщения об ошибках при сбоях assertEqual(), assertTrue(), и assertFalse() теперь содержат больше информации. Если вы установите для атрибута longMessage ваших классов TestCase значение true, то при сбоях будут выводиться как стандартные сообщения об ошибках, так и любые дополнительные сообщения, которые вы предоставите. (Добавлено Майклом Фордом; bpo-5663.)
Метод assertRaises() теперь возвращает обработчик контекста при вызове, не предоставляя вызываемый объект для запуска. Например, вы можете написать это:
with self.assertRaises(KeyError):
{}['foo']
(Реализовано Антуаном Питру; bpo-4444.)
Теперь поддерживается настройка и демонтаж на уровне модуля и класса. Модули могут содержать функции setUpModule() и tearDownModule(). Классы могут иметь setUpClass() и tearDownClass() методы, которые должны быть определены как методы класса (с использованием @classmethod или эквивалентных методов). Эти функции и методы вызываются, когда тестировщик переключается на тестовый набор в другом модуле или классе.
Добавлены методы addCleanup() и doCleanups(). addCleanup() позволяет добавлять функции очистки, которые будут вызываться безоговорочно (после setUp(), если setUp() завершается ошибкой, в противном случае после tearDown()). Это позволяет значительно упростить распределение и высвобождение ресурсов во время тестов (bpo-5679).
Был добавлен ряд новых методов, которые предоставляют более специализированные тесты. Многие из этих методов были написаны инженерами Google для использования в их наборах тестов; Грегори П. Смит, Майкл Фоорд и GvR работали над их объединением с версией Python unittest.
assertIsNone()иassertIsNotNone()берут одно выражение и проверяют, является ли результатNoneили нет.assertIs()иassertIsNot()принимают два значения и проверяют, относятся ли эти два значения к одному и тому же объекту или нет. (Добавлено Майклом Фордом; bpo-2578.)assertIsInstance()иassertNotIsInstance()проверяют, является ли результирующий объект экземпляром определенного класса или одного из множества классов. (Добавлено Георгом Брандлом; bpo-7031.)assertGreater(),assertGreaterEqual(),assertLess(), иassertLessEqual()сравните две величины.assertMultiLineEqual()сравнивает две строки и, если они не равны, отображает полезное сравнение, которое подчеркивает различия в двух строках. Это сравнение теперь используется по умолчанию при сравнении строк в Юникоде сassertEqual().assertRegexpMatches()иassertNotRegexpMatches()проверяют, является ли первый аргумент строкой, соответствующей или не соответствующей регулярному выражению, указанному в качестве второго аргумента (bpo-8038).assertRaisesRegexp()проверяет, вызвано ли конкретное исключение, а затем также проверяет, соответствует ли строковое представление исключения предоставленному регулярному выражению.assertIn()иassertNotIn()проверяют, находится ли первый во втором или нет.assertItemsEqual()проверяет, содержат ли две предоставленные последовательности одинаковые элементы.assertSetEqual()сравнивает, равны ли два набора, и сообщает о различиях между наборами только в случае ошибки.Аналогично,
assertListEqual()иassertTupleEqual()сравнивают указанные типы и объясняют любые различия, не обязательно выводя их полные значения; эти методы теперь используются по умолчанию при сравнении списков и кортежей с использованиемassertEqual(). В более общем плане,assertSequenceEqual()сравнивает две последовательности и может дополнительно проверить, относятся ли обе последовательности к определенному типу.assertDictEqual()сравнивает два словаря и сообщает о различиях; теперь он используется по умолчанию при сравнении двух словарей с помощьюassertEqual().assertDictContainsSubset()проверяет, все ли пары ключ/значение в первом найдены в втором.assertAlmostEqual()иassertNotAlmostEqual()проверяют, являются ли первый и второй приблизительно равными. Этот метод может либо округлить их разницу до произвольно указанного количества мест (по умолчанию - 7) и сравнить ее с нулем, либо потребовать, чтобы разница была меньше указанного значения дельта.loadTestsFromName()должным образом соответствуетsuiteClassатрибутуTestLoader. (Исправлено Марком Родди; bpo-6866.)Новый хук позволяет расширить метод
assertEqual()для обработки новых типов данных. МетодaddTypeEqualityFunc()принимает тип object и функцию. Функция будет использоваться, когда оба сравниваемых объекта относятся к указанному типу. Эта функция должна сравнивать два объекта и вызывать исключение, если они не совпадают; было бы неплохо, чтобы функция предоставляла дополнительную информацию о том, почему эти два объекта не совпадают, во многом так же, как это делают новые методы сравнения последовательностей.
unittest.main() теперь принимает необязательный аргумент exit. Если значение равно false, то main() не вызывает sys.exit(), позволяя использовать main() из интерактивного интерпретатора. (Автор: Х. Пабло Фернандес; bpo-3379.)
TestResult содержит новые методы startTestRun() и stopTestRun(), которые вызываются непосредственно перед тестовым запуском и после него. (Автор Роберт Коллинз; bpo-5728.)
Со всеми этими изменениями unittest.py стал слишком большим, поэтому модуль был преобразован в пакет, а код разделен на несколько файлов (автор Бенджамин Петерсон). Это не влияет на то, как модуль импортируется или используется.
См.также
- https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml
Описывает новые функции, способы их использования и обоснование различных дизайнерских решений. (Автор Майкл Фурд).
Обновленный модуль: ElementTree 1.3¶
Версия библиотеки ElementTree, входящей в состав Python, была обновлена до версии 1.3. Некоторые из новых функций включают:
Различные функции синтаксического анализа теперь принимают аргумент ключевого слова parser, в котором указывается
XMLParser, который будет использоваться. Это позволяет переопределить внутреннюю кодировку файла:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
Ошибки при синтаксическом анализе XML теперь вызывают исключение
ParseError, экземпляры которого имеют атрибутposition, содержащий кортеж (строка, столбец), указывающий местоположение проблемы.Код Elementtree для преобразования деревьев в строку был значительно переработан, что во многих случаях делает его примерно в два раза быстрее. Методы
ElementTree.write()иElement.write()теперь имеют параметр method, который может быть «xml» (по умолчанию), «html» или «text». Режим HTML будет выводить пустые элементы как<empty></empty>вместо<empty/>, а текстовый режим будет пропускать элементы и выводить только фрагменты текста. Если вы установите для атрибутаtagзначениеNone, но оставите его дочерние элементы на месте, элемент будет опущен при записи дерева, поэтому вам не нужно выполнять более обширную перестановку, чтобы удалить один элемент.Также улучшена обработка пространства имен. Все объявления
xmlns:<whatever>теперь выводятся в корневом элементе, а не разбросаны по всему результирующему XML-файлу. Вы можете задать пространство имен по умолчанию для дерева, установив атрибутdefault_namespace, и зарегистрировать новые префиксы с помощьюregister_namespace(). В режиме XML вы можете использовать параметр true/false xml_declaration для подавления объявления XML.Новый метод
Element:extend()добавляет элементы из последовательности к дочерним элементам элемента. Сами элементы ведут себя как последовательности, поэтому дочерние элементы легко перемещать из одного элемента в другой:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
Новый метод
Element:iter()выводит дочерние элементы элемента в качестве генератора. Также можно написатьfor child in elem:, чтобы выполнить цикл по дочерним элементам элемента. Существующий методgetiterator()теперь устарел, как иgetchildren(), который создает и возвращает список дочерних элементов.Новый метод
Element:itertext()возвращает все фрагменты текста, которые являются потомками элемента. Например:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
Устаревший: using an element as a Boolean (i.e.,
if elem:) would return true if the element had any children, or false if there were no children. This behaviour is confusing –Noneis false, but so is a childless element? – so it will now trigger aFutureWarning. In your code, you should be explicit: writelen(элемент) != 0if you’re interested in the number of children, or `` элемент - это не None`.
Фредрик Лунд разрабатывает ElementTree и выпустил версию 1.3; вы можете прочитать его статью с описанием версии 1.3 по адресу https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Флорент Сиклуна обновил версию, входящую в состав Python, после обсуждения на python-dev и в bpo-6472.)
Изменения в сборке и C API¶
Изменения в процессе сборки Python и в C API включают:
Последней версией отладчика GNU, GDB 7, может быть scripted using Python. Когда вы начинаете отладку исполняемой программы P, GDB будет искать файл с именем
P-gdb.pyи автоматически считывать его. Дэйв Малкольм внес свой вклад вpython-gdb.py, который добавляет ряд команд, полезных при отладке самого Python. Например,py-upиpy-downподнимают или опускают один фрейм стека Python, который обычно соответствует нескольким фреймам стека C.py-printвыводит значение переменной Python, аpy-btвыводит трассировку стека Python. (Добавлено в результате bpo-8032.)Если вы используете файл
.gdbinit, поставляемый с Python, макрос «pyo» в версии 2.7 теперь работает корректно, когда отлаживаемый поток не содержит GIL; теперь макрос получает его перед печатью. (Автор: Виктор Стиннер; bpo-3632.): c:func:Py_AddPendingCall теперь потокобезопасен, позволяя любому рабочему потоку отправлять уведомления в основной поток Python. Это особенно полезно для асинхронных операций ввода-вывода. (Автор: Кристьян Валюр Йонссон; bpo-4293.)
Новая функция:
PyCode_NewEmpty()создает пустой объект кода; требуются только имя файла, название функции и номер первой строки. Это полезно для модулей расширения, которые пытаются создать более полезный стек обратной трассировки. Ранее для таких расширений требовалось вызыватьPyCode_New(), у которого было намного больше аргументов. (Добавлено Джеффри Яськиным.)Новая функция:
PyErr_NewExceptionWithDoc()создает новый класс исключений, точно так же, как это делает существующийPyErr_NewException(), но принимает дополнительный аргументchar *, содержащий строку документации для нового класса исключений. ((Добавлено „lekma“ в систему отслеживания ошибок Python; bpo-7033.)Новая функция:
PyFrame_GetLineNumber()принимает объект frame и возвращает номер строки, которую в данный момент выполняет фрейм. Ранее в коде требовалось получить индекс выполняемой в данный момент команды байт-кода, а затем найти номер строки, соответствующий этому адресу. (Добавлено Джеффри Яськиным.)Новые функции:
PyLong_AsLongAndOverflow()иPyLong_AsLongLongAndOverflow()приближают длинное целое число Python к C long или long long. Если число слишком велико, чтобы соответствовать типу вывода, устанавливается флаг переполнения, который возвращается вызывающей стороне. (Добавлено Кейсом Ван Хорсеном; bpo-7528 и bpo-7767.)Новая функция: в результате перезаписи преобразования строки в число с плавающей точкой была добавлена новая функция
PyOS_string_to_double(). Старые функцииPyOS_ascii_strtod()иPyOS_ascii_atof()теперь устарели.Новая функция:
PySys_SetArgvEx()устанавливает значениеsys.argvи может дополнительно обновлятьsys.path, чтобы включить каталог, содержащий скрипт с именемsys.argv[0], в зависимости от значения параметра updatepath.Эта функция была добавлена, чтобы закрыть брешь в безопасности приложений, использующих Python. Старая функция,
PySys_SetArgv(), всегда обновлялаsys.path, а иногда добавляла текущий каталог. Это означало, что если вы запустите приложение, использующее Python, в каталоге, контролируемом кем-то другим, злоумышленники могут поместить в этот каталог троянский модуль (скажем, файл с именемos.py), который ваше приложение затем импортирует и запустит.Если вы поддерживаете приложение на C/C++, в которое встроен Python, проверьте, вызываете ли вы
PySys_SetArgv()и тщательно подумайте, должно ли приложение использоватьPySys_SetArgvEx()с updatepath, установленным в значение false.Проблема безопасности, о которой сообщалось как о CVE-2008-5983; обсуждалась в bpo-5753 и была исправлена Антуаном Питру.
Новые макросы: заголовочные файлы Python теперь определяют следующие макросы:
Py_ISALNUM,Py_ISALPHA,Py_ISDIGIT,Py_ISLOWER,Py_ISSPACE,Py_ISUPPER,Py_ISXDIGIT,Py_TOLOWERиPy_TOUPPER. Все эти функции аналогичны стандартным макросам C для классификации символов, но игнорируют текущие настройки языкового стандарта, поскольку в некоторых местах Python должен анализировать символы независимым от языкового стандарта способом. (Добавлено Эриком Смитом; bpo-5793.)Удаленная функция:
PyEval_CallObject()теперь доступна только в виде макроса. Для сохранения совместимости с ABI-компоновками сохранялась версия функции, но это было в 1997 году; к настоящему времени ее, безусловно, можно удалить. (Снято Антуаном Питру; bpo-8276.)Новые коды формата: функции
PyString_FromFormat(),PyString_FromFormatV()иPyErr_Format()теперь принимают коды формата%lldи%lluдля отображения символов C long long типов. (Автор: Марк Дикинсон; bpo-7228.)Изменено сложное взаимодействие между потоками и разветвление процессов. Ранее дочерний процесс, созданный с помощью
os.fork(), мог завершиться ошибкой, поскольку дочерний процесс создается только с одним запущенным потоком, выполняющимos.fork(). Если бы другие потоки удерживали блокировку, такую как блокировка импорта в Python, при выполнении форка блокировка все равно была бы помечена как «удерживаемая» в новом процессе. Но в дочернем процессе ничто никогда не снимало блокировку, поскольку другие потоки не реплицировались, и дочерний процесс больше не мог выполнять импорт.Python 2.7 получает блокировку импорта перед выполнением
os.fork(), а также удаляет все блокировки, созданные с помощью модуляthreading. Модули расширения C, которые имеют внутренние блокировки или которые сами вызываютfork(), не выиграют от этой очистки.(Исправлено Томасом Ваутерсом; bpo-1590864.)
Функция
Py_Finalize()теперь вызывает внутреннюю функциюthreading._shutdown(); это предотвращает возникновение некоторых исключений при завершении работы интерпретатора. (Исправление от Адама Олсена; bpo-1722344.)При использовании структуры
PyMemberDefдля определения атрибутов типа, Python больше не позволит вам пытаться удалить или установить атрибутT_STRING_INPLACE.Глобальные символы, определенные модулем
ctypes, теперь имеют префиксPyили_ctypes. (Реализовано Томасом Хеллером; bpo-3102.)Новая опция настройки: параметр
--with-system-expatпозволяет создавать модульpyexpatдля использования системной библиотеки Expat. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Новая опция настройки: опция
--with-valgrindтеперь отключает распределитель pymalloc, что затрудняет корректный анализ детектором ошибок памяти Valgrind. Таким образом, Valgrind будет лучше обнаруживать утечки и перерасход памяти. (Автор: Джеймс Хенстридж; bpo-2422.)Новая опция настройки: теперь вы можете ввести пустую строку в поле
--with-dbmliborder=, чтобы отключить все различные модули СУБД. (Добавлено пользователем Frehtes Taifersar Arahesis; bpo-6491.)Скрипт configure теперь проверяет ошибки округления с плавающей запятой в некоторых 32-разрядных процессорах Intel и определяет определение препроцессора
X87_DOUBLE_ROUNDING. В настоящее время это определение не используется в коде, но оно доступно, если кто-то захочет его использовать. (Добавлено Марком Дикинсоном; bpo-2937.)configure также теперь задает переменную
LDCXXSHAREDMakefile для поддержки компоновки на C++. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)В процессе сборки теперь создаются необходимые файлы для поддержки pkg-config. (Автор: Клинтон Рой; bpo-3585.)
Процесс сборки теперь поддерживает Subversion 1.7. (Автор: Arfrever Frehtes Taifersar Arahesis; bpo-6094.)
Капсулы¶
Python 3.1 добавляет новый тип данных C, PyCapsule, для предоставления Capitol модуля расширения. Капсула, по сути, является носителем указателя C void * и доступна как атрибут модуля; например, API модуля socket отображается как socket.CAPI и unicodedata раскрывает ucnhash_CAPI. Другие расширения могут импортировать модуль, обращаться к его словарю, чтобы получить объект capsule, а затем получить указатель void *, который обычно указывает на массив указателей на различные функции API модуля.
Для этого уже используется существующий тип данных PyCObject, но он не обеспечивает безопасность типов. Вредоносный код, написанный на чистом Python, может вызвать ошибку сегментации, если взять : c:type:!PyCObject из модуля A и каким-то образом заменить его на PyCObject в модуле B. Капсулы знают свое собственное имя, и для получения указателя требуется указать имя:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Вы можете быть уверены, что vtable указывает на то, что вы ожидаете. Если был передан другой код, PyCapsule_IsValid() обнаружит несоответствие имени и вернет значение false. Обратитесь к Предоставление API на языке C для модуля расширения для получения дополнительной информации об использовании этих объектов.
Python 2.7 теперь использует capsules для предоставления различных API-интерфейсов модулей расширения, но PyCObject_AsVoidPtr() был изменен для работы с capsules, сохраняя совместимость во время компиляции с интерфейсом PyCObject. Использование PyCObject_AsVoidPtr() будет сигнализировать о PendingDeprecationWarning, который по умолчанию отключен.
Реализован на Python 3.1 и перенесен в версию 2.7 Ларри Гастингсом; обсуждался в bpo-5630.
Изменения, относящиеся к конкретному порту: Windows¶
Модуль
msvcrtтеперь содержит некоторые константы из заголовочного файлаcrtassem.h:CRT_ASSEMBLY_VERSION,VC_ASSEMBLY_PUBLICKEYTOKEN, иLIBRARIES_ASSEMBLY_NAME_PREFIX. (Автор: Дэвид Курнапо; bpo-4365.)Модуль
_winregдля доступа к реестру теперь реализует функцииCreateKeyEx()иDeleteKeyEx()- расширенные версии ранее поддерживаемых функций, которые принимают несколько дополнительных аргументов. МетодыDisableReflectionKey(),EnableReflectionKey(), иQueryReflectionKey()также были протестированы и задокументированы. (Реализован Брайаном Кертином: bpo-7347.)_beginthreadex`Для запуска потоков используется новый: c < < < 0>>> API, и теперь используются собственные функции локального хранилища потоков. (Автор: Кристьян Валюр Йонссон; :issue:`3582().)Функция
os.kill()теперь работает в Windows. Значением сигнала могут быть константыCTRL_C_EVENT,CTRL_BREAK_EVENT, или любое целое число. Первые две константы будут отправлять Control-C и Control-Break события нажатия клавиши в подпроцессы; любое другое значение будет использоватьTerminateProcess()API. (Автор: Мики Тебека; bpo-1220212.)Функция
os.listdir()теперь корректно завершается ошибкой для пустого пути. (Исправлено Хирокадзу Ямамото; bpo-5913.)Модуль
mimetypesтеперь будет считывать базу данных MIME из реестра Windows при инициализации. (Исправление от Gabriel Genellina; bpo-4969.)
Изменения, связанные с конкретными портами: Mac OS X¶
Путь
/Library/Python/2.7/site-packagesтеперь добавлен кsys.path, чтобы совместно использовать добавленные пакеты при установке системы и копии той же версии, установленной пользователем. (Изменено Рональдом Оуссореном; bpo-4865.)Изменено в версии 2.7.13: Начиная с версии 2.7.13, это изменение было удалено.
/Library/Python/2.7/site-packages, каталог site-packages, используемый поставляемой Apple системой Python 2.7, больше не добавляется кsys.pathдля установленных пользователем Pythons, например, из установщиков python.org. Начиная с macOS 10.12, Apple изменила настройку системного каталога site-packages, что может привести к сбою установки компонентов pip, таких как setuptools. Пакеты, установленные для системного Python, больше не будут использоваться совместно с установленными пользователями Pythons. (bpo-28440)
Изменения, касающиеся конкретных портов: FreeBSD¶
Константа
SO_SETFIBво FreeBSD 7.1, используемая с помощью методовsocket()getsockopt()/setsockopt()для выбора альтернативной таблицы маршрутизации, теперь доступна в модулеsocket. (Добавлено Кайлом Вандербиком; bpo-8235.)
Другие изменения и исправления¶
В каталог
Toolsбыли добавлены два тестовых сценария,iobenchиccbench.iobenchизмеряет скорость встроенных файловых объектов ввода-вывода, возвращаемыхopen()при выполнении различных операций, аccbench- это тест параллелизма, который пытается измерить пропускную способность вычислений, задержку переключения потоков и обработку ввода-вывода пропускная способность при выполнении нескольких задач с использованием различного количества потоков.Сценарий
Tools/i18n/msgfmt.pyтеперь понимает формы множественного числа в файлах.po. (Исправлено Мартином фон Левисом; bpo-5464.)При импорте модуля из файла
.pycили.pyoс существующим аналогом.pyатрибутыco_filenameрезультирующих объектов кода перезаписываются, когда исходное имя файла становится устаревшим. Это может произойти, если файл был переименован, перемещен или доступ к нему осуществляется по разным путям. (Пластырь Зиги Зайлнахта и Жан-Поля Кальдероне; bpo-1180193.)Сценарий
regrtest.pyтеперь использует переключатель--randseed=, который принимает целое число, которое будет использоваться в качестве случайного начального значения для параметра-r, который выполняет тесты в случайном порядке. Параметр-rтакже указывает количество использованных семян (добавлено Collin Winter).Другим параметром
regrtest.pyявляется-j, который принимает целое число, указывающее, сколько тестов выполняется параллельно. Это позволяет сократить общее время выполнения на многоядерных компьютерах. Этот параметр совместим с несколькими другими параметрами, включая переключатель-R, который, как известно, обеспечивает длительное время работы. (Добавлено Антуаном Питру, bpo-6152.) Это также можно использовать с новым переключателем-F, который запускает выбранные тесты в цикле до тех пор, пока они не завершатся неудачей. (Добавлено Антуаном Питру; bpo-7312.)При выполнении в виде скрипта модуль
py_compile.pyтеперь принимает'-'в качестве аргумента, который будет считывать стандартный ввод для списка имен файлов, подлежащих компиляции. (Автор: Петр Ожаровский; bpo-8233.)
Перенос на Python 2.7¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код:
Функция
range()обрабатывает свои аргументы более последовательно; теперь она будет вызывать__int__()для передаваемых ей аргументов, не являющихся числами с плавающей точкой, нецелыми числами. (Исправлено Александром Белопольским; bpo-1533.)Метод string
format()изменил точность по умолчанию, используемую для чисел с плавающей запятой и комплексных чисел, с 6 знаков после запятой на 12, что соответствует точности, используемой вstr(). (Изменено Эриком Смитом; bpo-5920.)Из-за оптимизации для оператора
withспециальные методы__enter__()и__exit__()должны принадлежать типу объекта и не могут быть напрямую привязаны к экземпляру объекта. Это влияет на классы нового стиля (производные отobject) и типы расширений C. (bpo-6101.)Из-за ошибки в Python 2.6 параметр exc_value для методов
__exit__()часто был строковым представлением исключения, а не экземпляром. Это было исправлено в версии 2.7, поэтому exc_value будет экземпляром, как и ожидалось. (Исправлено Florent Xicluna; bpo-7853.)Когда ограниченный набор атрибутов был задан с помощью
__slots__, удаление неустановленного атрибута не приводило к появлениюAttributeError, как можно было бы ожидать. Исправлено Бенджамином Питерсоном; bpo-7604.)
В стандартной библиотеке:
Операции с экземплярами
datetime, в результате которых значение года выходило за пределы поддерживаемого диапазона, не всегда приводили к возникновениюOverflowError. Такие ошибки теперь проверяются более тщательно и теперь будут вызывать исключение. (Репортаж Марка Лиандера, патч Ананда Б. Пиллаи и Александра Белопольского; bpo-7150.)При использовании экземпляров
Decimalсо строковым методомformat()выравнивание по умолчанию ранее выполнялось по левому краю. Это значение было изменено на выравнивание по правому краю, что может привести к изменению выходных данных ваших программ. (Изменено Марком Дикинсоном; bpo-6857.)Сравнения, включающие сигнальное значение NaN (или
sNAN), теперь сигнализируют о значенииInvalidOperationвместо того, чтобы автоматически возвращать значение true или false в зависимости от оператора сравнения. Значения NaN (илиNaN) теперь доступны для хэширования. (Исправлено Марком Дикинсоном; bpo-7279.)Библиотека
xml.etree.ElementTreeбольше не экранирует амперсанды и угловые скобки при выводе команды обработки XML (которая выглядит как<?xml-stylesheet href="#style1"?>) или комментария (который выглядит как<!-- comment -->). (Патч от Нила Мюллера; bpo-2746.)Метод
readline()объектовStringIOтеперь ничего не делает при запросе отрицательной длины, как это делают другие файловые объекты. (bpo-7348).Модуль
syslogтеперь будет использовать значениеsys.argv[0]в качестве идентификатора вместо предыдущего значения по умолчанию'python'. (Изменено Шоном Райфшнайдером; bpo-8451.)В модуле
tarfileизменена обработка ошибок по умолчанию, чтобы больше не подавлять фатальные ошибки. Уровень ошибок по умолчанию ранее был равен 0, что означало, что ошибки приводили только к записи сообщения в журнал отладки, но поскольку журнал отладки по умолчанию не активирован, эти ошибки остаются незамеченными. Уровень ошибок по умолчанию теперь равен 1, что приводит к возникновению исключения при наличии ошибки. (Изменено Ларсом Густабелем; bpo-7357.)Модуль
urlparseurlsplit()теперь обрабатывает неизвестные схемы URL-адресов в соответствии с RFC 3986: если URL-адрес имеет вид"<something>://...", текст перед://рассматривается как схема, даже если это выдуманная схема, о которой модуль не знает. Это изменение может нарушить работу кода, который работал с прежним поведением. Например, Python 2.6.4 или 2.5 вернет следующее:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (и Python 2.6.5) вернет:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
((Python 2.7 на самом деле выдает немного другой результат, поскольку возвращает именованный кортеж вместо стандартного кортежа.)
Для расширений языка Си:
Расширения C, использующие коды целочисленного формата с семейством функций
PyArg_Parse*, теперь будут вызывать исключениеTypeErrorвместо запускаDeprecationWarning(bpo-5080).Используйте новую функцию
PyOS_string_to_double()вместо старых функцийPyOS_ascii_strtod()иPyOS_ascii_atof(), которые в настоящее время являются устаревшими.
Для приложений, использующих Python:
Была добавлена функция
PySys_SetArgvEx(), позволяющая приложениям закрывать брешь в системе безопасности при использовании существующей функцииPySys_SetArgv(). Проверьте, вызываете ли вы:c:func:PySys_SetArgv и тщательно обдумайте, должно ли приложение использоватьPySys_SetArgvEx()с параметром updatepath, равным false.
В обновленные версии Python 2.7 добавлены новые функции¶
В обновленные версии Python 2.7 могут быть добавлены новые функции, когда этого действительно потребует ситуация. Любые подобные дополнения должны пройти процедуру рассмотрения предложения по улучшению Python и убедительно обосновать, почему они не могут быть должным образом устранены либо путем добавления новой функции исключительно в Python 3, либо путем публикации ее в индексе пакетов Python.
В дополнение к конкретным предложениям, перечисленным ниже, существует общее исключение, позволяющее добавлять новые предупреждения -3 в любой технический выпуск Python 2.7.
Две новые переменные среды для режима отладки¶
В режиме отладки статистика [xxx refs] по умолчанию не записывается, теперь также должна быть установлена переменная окружения PYTHONSHOWREFCOUNT. (Автор: Виктор Стиннер; bpo-31733.)
Когда Python компилируется с заданным значением COUNT_ALLOC, количество выделений больше не выводится по умолчанию: теперь также должна быть установлена переменная окружения PYTHONSHOWALLOCCOUNT. Более того, количество выделений теперь выводится в stderr, а не в стандартный вывод. (Автор: Виктор Стиннер; bpo-31692.)
Добавлено в версии 2.7.15.
PEP 434: Исключение для улучшения простоя для всех филиалов¶
PEP 434 описывает общее исключение для изменений, внесенных в среду разработки IDLE, поставляемую вместе с Python. Это исключение позволяет разработчикам IDLE обеспечить более согласованное взаимодействие с пользователями во всех поддерживаемых версиях Python 2 и 3.
Для получения подробной информации о любых изменениях в режиме ОЖИДАНИЯ обратитесь к файлу НОВОСТЕЙ для конкретного выпуска.
PEP 466: Улучшения сетевой безопасности для Python 2.7¶
PEP 466 описывает ряд предложений по повышению сетевой безопасности, которые были одобрены для включения в версии поддержки Python 2.7, причем первые из этих изменений появились в версии Python 2.7.7.
PEP 466 соответствующие функции добавлены в Python 2.7.7:
hmac.compare_digest()был перенесен с Python 3, чтобы сделать операцию сравнения устойчивости к временной атаке доступной для приложений на Python 2. (Автор: Алекс Гейнор; bpo-21306.)Версия OpenSSL 1.0.1g была обновлена в официальных установщиках Windows, опубликованных на python.org. (Автор - Захари Уэр; bpo-21462.)
PEP 466 соответствующие функции добавлены в Python 2.7.8:
hashlib.pbkdf2_hmac()был перенесен с Python 3, чтобы сделать алгоритм хэширования, подходящий для безопасного хранения паролей, широко доступным для приложений на Python 2. (Автор: Алекс Гейнор; bpo-21304.)OpenSSL 1.0.1h был обновлен для официальных установщиков Windows, опубликованных на python.org. (добавлено Закари Уэром в bpo-21671 для CVE-2014-0224)
PEP 466 соответствующие функции добавлены в Python 2.7.9:
Большая часть модуля
sslв Python 3.4 была перенесена обратно. Это означает, чтоsslтеперь поддерживает указание имени сервера, настройки TLS 1.x, доступ к хранилищу сертификатов платформы, классSSLContextи другие функции. (Авторы: Алекс Гейнор и Дэвид Рид; bpo-21308.)Для получения более подробной информации обратитесь к примечаниям «Добавлена версия: 2.7.9» в документации к модулю.
Было изменено значение
os.urandom()для кэширования файлового дескриптора на/dev/urandomвместо повторного открытия/dev/urandomпри каждом вызове. (Автор: Алекс Гейнор; bpo-21305.)hashlib.algorithms_guaranteedиhashlib.algorithms_availableбыли перенесены из Python 3, чтобы упростить для приложений на Python 2 выбор наиболее надежного доступного алгоритма хэширования. (Автор Алекс Гейнор в bpo-21307)
PEP 477: Обратный перенос ensurepip (PEP 453) на Python 2.7¶
PEP 477 одобряет включение модуля PEP 453 ensurepip и улучшенной документации, которая была включена с его помощью в выпуски поддержки Python 2.7, впервые появившиеся в выпуске Python 2.7.9.
Начальная загрузка pip по умолчанию¶
Новый модуль ensurepip (определенный в PEP 453) предоставляет стандартный кроссплатформенный механизм для начальной загрузки установщика pip в установки на Python. Версия pip, входящая в состав Python 2.7.9, - это pip 1.5.6, и в будущих обновлениях для поддержки 2.7.x версия, входящая в комплект поставки, будет обновлена до последней версии pip, доступной на момент создания версии-кандидата.
По умолчанию команды pip, pipX и pipX.Y будут установлены на всех платформах (где X.Y означает версию установки Python) вместе с пакетом pip Python и его зависимостями.
Для CPython source builds on POSIX systems команды make install и make altinstall по умолчанию не запускают pip. Этим поведением можно управлять с помощью параметров configure и переопределять с помощью параметров Makefile.
В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают pip вместе с самим CPython (пользователи могут отказаться от его установки в процессе установки). Пользователям Windows необходимо будет выбрать автоматические изменения PATH, чтобы по умолчанию из командной строки было доступно pip, в противном случае к нему все еще можно получить доступ через программу запуска Python для Windows как к py -m pip.
Поскольку discussed in the PEP, разработчики пакетов для платформы могут отказаться от установки этих команд по умолчанию, при условии, что при вызове они предоставляют четкие и простые инструкции о том, как установить их на эту платформу (обычно с помощью системного менеджера пакетов).
Изменения в документации¶
В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в виде краткого руководства по началу работы и часто задаваемых вопросов. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide, а также в документацию по отдельным проектам.
Однако, поскольку эта миграция в настоящее время все еще не завершена, устаревшие версии этих руководств остаются доступными как Установка модулей Python (устаревшая версия) и Распространение модулей Python (устаревшая версия).
См.также
- PEP 453 – Явная загрузка pip в установках Python
PEP написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Левисом и Недом Дейли.
PEP 476: Включение проверки сертификата по умолчанию для http-клиентов stdlib¶
PEP 476 обновлен httplib и модули, которые его используют, такие как urllib2 и xmlrpclib, чтобы теперь проверять, что сервер предоставляет сертификат, подписанный Центром сертификации в хранилище доверия платформы и имя хоста которого совпадает с именем хоста, запрашиваемым по умолчанию, что значительно повышает безопасность многих приложений. Это изменение было внесено в версию Python 2.7.9.
Для приложений, которым требуется прежнее поведение, они могут передавать альтернативный контекст:
import urllib2
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493: Инструменты миграции проверки HTTPS для Python 2.7¶
PEP 493 предоставляет дополнительные средства миграции для поддержки более поэтапного процесса обновления инфраструктуры для сред, содержащих приложения и службы, использующие исторически разрешительную обработку сертификатов сервера при установлении клиентских HTTPS-соединений. Эти дополнения были внесены в версию Python 2.7.12.
Эти инструменты предназначены для использования в тех случаях, когда уязвимые приложения и службы не могут быть изменены для явной передачи более разрешительного контекста SSL при установлении соединения.
Для приложений и служб, которые вообще не могут быть изменены, новой переменной окружения PYTHONHTTPSVERIFY может быть присвоено значение 0, чтобы вернуть весь процесс Python к разрешительному поведению по умолчанию в Python 2.7.8 и более ранних версиях.
В случаях, когда код установления соединения изменить невозможно, но можно изменить приложение в целом, можно использовать новую функцию ssl._https_verify_certificates() для настройки поведения по умолчанию во время выполнения.
Новая цель построения make regen-all¶
Чтобы упростить перекрестную компиляцию и обеспечить надежную компиляцию CPython без необходимости наличия существующей версии Python, система сборки на основе autotools больше не пытается неявно перекомпилировать сгенерированные файлы в зависимости от времени изменения файла.
Вместо этого была добавлена новая команда make regen-all для принудительной регенерации этих файлов по желанию (например, после того, как начальная версия Python уже была собрана на основе предварительно сгенерированных версий).
Также определены более избирательные цели регенерации - подробнее смотрите в разделе Makefile.pre.in.
(Автор: Виктор Стиннер в bpo-23404.)
Добавлено в версии 2.7.14.
Удаление make touch целевого объекта сборки¶
Цель сборки make touch, ранее использовавшаяся для запроса неявной регенерации сгенерированных файлов путем обновления времени их модификации, была удалена.
Он был заменен новой целью make regen-all.
(Автор: Виктор Стиннер в bpo-23404.)
Изменено в версии 2.7.14.
Признание¶
Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь в работе над различными вариантами этой статьи: Ника Коглана, Филипа Дженви, Райана Ловетта, Р. Дэвида Мюррея, Хью Секер-Уокера.