What’s New in Python 2.7¶
- Author:
A.M. Kuchling (amk at amk.ca)
This article explains the new features in Python 2.7. Python 2.7 was released on July 3, 2010.
Decimal
: Разрешить параметры с именами unittest
и argparse
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
Python 2.7 is planned to be the last of the 2.x releases, so we worked on making it a good release for the long term. To help with porting to Python 3, several new features from the Python 3.x series have been included in 2.7.
This article doesn’t attempt to provide a complete specification of the new features, but instead provides a convenient overview. For full details, you should refer to the documentation for Python 2.7 at https://docs.python.org. If you want to understand the rationale for the design and implementation, refer to the PEP for a particular new feature or the issue on https://bugs.python.org in which a change was discussed. Whenever possible, «What’s New in Python» links to the bug/patch item for each change.
The Future for Python 2.x¶
Python 2.7 is the last major release in the 2.x series, as the Python maintainers have shifted the focus of their new feature development efforts to the Python 3.x series. This means that while Python 2 continues to receive bug fixes, and to be updated to build correctly on new hardware and versions of supported operated systems, there will be no new full feature releases for the language or standard library.
However, while there is a large common subset between Python 2.7 and Python 3, and many of the changes involved in migrating to that common subset, or directly to Python 3, can be safely automated, some other changes (notably those associated with Unicode handling) may require careful consideration, and preferably robust automated regression test suites, to migrate effectively.
Это означает, что Python 2.7 будет существовать еще долгое время, обеспечивая стабильную и поддерживаемую базовую платформу для производственных систем, которые еще не переведены на Python 3. Полный ожидаемый жизненный цикл серии Python 2.7 подробно описан в PEP 373.
Some key consequences of the long-term significance of 2.7 are:
As noted above, the 2.7 release has a much longer period of maintenance when compared to earlier 2.x versions. Python 2.7 is currently expected to remain supported by the core development team (receiving security updates and other bug fixes) until at least 2020 (10 years after its initial release, compared to the more typical support period of 18–24 months).
По мере старения стандартной библиотеки Python 2.7 для пользователей Python 2 становится все более важным эффективное использование индекса пакетов Python (напрямую или через редистрибьютора). Помимо широкого спектра пакетов сторонних разработчиков для решения различных задач, доступные пакеты включают бэкпорты новых модулей и функций из стандартной библиотеки Python 3, совместимых с Python 2, а также различные инструменты и библиотеки, которые могут облегчить переход на Python 3. В разделе Python Packaging User Guide содержится руководство по загрузке и установке программ из индекса пакетов Python.
Хотя в настоящее время предпочтительным подходом к улучшению Python 2 является публикация новых пакетов в Python Package Index, этот подход не обязательно работает во всех случаях, особенно в тех, которые связаны с сетевой безопасностью. В исключительных случаях, когда публикация новых или обновленных пакетов на PyPI не может быть адекватно решена, можно использовать процесс Python Enhancement Proposal для обоснования необходимости добавления новых функций непосредственно в стандартную библиотеку Python 2. Любые такие дополнения, а также выпуски обновлений, в которых они были добавлены, будут отмечены в разделе Новые возможности, добавленные в обновленные версии Python 2.7 ниже.
Для проектов, желающих перейти с Python 2 на Python 3, или для разработчиков библиотек и фреймворков, желающих поддерживать пользователей как на Python 2, так и на Python 3, существует множество инструментов и руководств, которые помогут выбрать подходящий подход и разобраться с некоторыми техническими деталями. Рекомендуемая отправная точка - Как перенести код Python 2 на Python 3 руководство HOWTO.
Changes to the Handling of Deprecation Warnings¶
В Python 2.7 было принято политическое решение о том, что по умолчанию предупреждения, представляющие интерес только для разработчиков, будут игнорироваться. DeprecationWarning
и его потомки теперь игнорируются, если не запрошено иное, что не позволяет пользователям видеть предупреждения, вызванные приложением. Это изменение также было внесено в ветку, ставшую Python 3.2. (Обсуждалось на stdlib-sig и было реализовано в bpo-7319).
В предыдущих выпусках сообщения DeprecationWarning
были включены по умолчанию, предоставляя разработчикам Python четкое указание на то, где их код может сломаться в будущей основной версии Python.
Однако среди пользователей приложений на базе Python становится все больше тех, кто не принимает непосредственного участия в разработке этих приложений. Сообщения DeprecationWarning
не имеют значения для таких пользователей, что заставляет их беспокоиться о приложении, которое на самом деле работает правильно, и обременяет разработчиков приложений реагированием на эти проблемы.
DeprecationWarning
: Разрешить параметры с именами -Wdefault
и -Wd
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
Модуль unittest
также автоматически включает предупреждения об износе при выполнении тестов.
Python 3.1 Features¶
Much as Python 2.6 incorporated features from Python 3.0, version 2.7 incorporates some of the new features in Python 3.1. The 2.x series continues to provide tools for migrating to the 3.x series.
A partial list of 3.1 features that were backported to 2.7:
Синтаксис для литералов множеств (
{1,2,3}
- изменяемое множество).Понимание словарей и множеств (
{i: i*2 for i in range(3)}
).Несколько менеджеров контекста в одном операторе
with
.Новая версия библиотеки
io
, переписанная на C для повышения производительности.Тип упорядоченного словаря, описанный в PEP 372: Adding an Ordered Dictionary to collections.
Новый спецификатор формата
","
, описанный в PEP 378: Format Specifier for Thousands Separator.Объект
memoryview
.Небольшое подмножество модуля
importlib
, described below.repr()
: Разрешить параметры с именамиx
иx
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаПреобразования из плавающей строки в строку и из строки в плавающую правильно округляются. Функция
round()
также теперь правильно округляется.Тип
PyCapsule
, используемый для предоставления API на языке C для модулей расширения.Функция
PyLong_AsLongAndOverflow()
Функция C API.
Other new Python3-mode warnings include:
operator.isCallable()
иoperator.sequenceIncludes()
, которые не поддерживаются в 3.x, теперь вызывают предупреждения.Переключатель
-3
теперь автоматически включает переключатель-Qwarn
, который вызывает предупреждения об использовании классического деления с целыми и длинными целыми числами.
PEP 372: Adding an Ordered Dictionary to collections¶
Обычные словари Python перебирают пары ключ/значение в произвольном порядке. За прошедшие годы ряд авторов написали альтернативные реализации, которые запоминают порядок, в котором ключи были вставлены изначально. Основываясь на опыте этих реализаций, 2.7 вводит новый класс OrderedDict
в модуле collections
.
API OrderedDict
API предоставляет тот же интерфейс, что и обычные словари, но перебирает ключи и значения в гарантированном порядке в зависимости от того, когда ключ был вставлен первым:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
If a new entry overwrites an existing entry, the original insertion position is left unchanged:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
Deleting an entry and reinserting it will move it to the end:
>>> 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)
Comparing two ordered dictionaries checks both the keys and values, and requires that the insertion order was the same:
>>> 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).
The standard library now supports use of ordered dictionaries in several modules.
Модуль
ConfigParser
использует их по умолчанию, а это значит, что конфигурационные файлы теперь можно читать, изменять, а затем записывать обратно в исходном порядке.Метод
_asdict()
дляcollections.namedtuple()
теперь возвращает упорядоченный словарь, в котором значения располагаются в том же порядке, что и индексы кортежей.json
: Разрешить параметры с именамиJSONDecoder
иOrderedDict
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
См.также
- PEP 372 - Добавление упорядоченного словаря в коллекции
PEP written by Armin Ronacher and Raymond Hettinger; implemented by Raymond Hettinger.
PEP 378: Format Specifier for Thousands Separator¶
To make program output more readable, it can be useful to add separators to large numbers, rendering them as 18,446,744,073,709,551,616 instead of 18446744073709551616.
Полностью общим решением для этого является модуль locale
, который может использовать различные разделители («,» в Северной Америке, «.» в Европе) и различные размеры группировки, но locale
сложен в использовании и не подходит для многопоточных приложений, где разные потоки производят вывод для разных локалей.
Поэтому в мини-язык, используемый методом str.format()
, был добавлен простой механизм группировки запятых. При форматировании числа с плавающей точкой просто поставьте запятую между шириной и точностью:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
When formatting an integer, include the comma after the width:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Этот механизм вообще не поддается адаптации; в качестве разделителя всегда используются запятые, а группировка всегда осуществляется по трехзначным группам. Механизм форматирования с помощью запятых не такой общий, как модуль locale
, но он проще в использовании.
См.также
- PEP 378 - Спецификатор формата для разделителя тысяч
PEP written by Raymond Hettinger; implemented by Eric Smith.
PEP 389: The argparse Module for Parsing Command Lines¶
Модуль argparse
для разбора аргументов командной строки был добавлен в качестве более мощной замены модуля optparse
.
getopt
: Разрешить параметры с именами optparse
и argparse
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
Короче говоря, если вы пишете новый сценарий и вам не нужно беспокоиться о совместимости с предыдущими версиями Python, используйте argparse
вместо optparse
.
Here’s an example:
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
и '*'
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
См.также
- Документация
argparse
The documentation page of the argparse module.
- Обновление кода optparse
Часть документации по Python, описывающая, как преобразовать код, использующий
optparse
.- PEP 389 - argparse - новый модуль разбора командной строки
PEP written and implemented by Steven Bethard.
PEP 391: Dictionary-Based Configuration For Logging¶
Модуль logging
очень гибкий; приложения могут определять дерево подсистем регистрации, и каждый регистратор в этом дереве может отфильтровывать определенные сообщения, форматировать их по-разному и направлять сообщения различному количеству обработчиков.
Вся эта гибкость может потребовать большого количества настроек. Вы можете писать операторы Python для создания объектов и установки их свойств, но сложная настройка требует многословного, но скучного кода. logging
также поддерживает функцию fileConfig()
, которая разбирает файл, но формат файла не поддерживает настройку фильтров, и его сложнее генерировать программно.
В Python 2.7 добавлена функция dictConfig()
, которая использует словарь для настройки протоколирования. Существует множество способов получить словарь из различных источников: построить его с помощью кода, разобрать файл, содержащий JSON, или использовать библиотеку разбора YAML, если таковая установлена. Более подробную информацию можно найти в Функции конфигурации.
В следующем примере настроены два регистратора: корневой и сетевой. Сообщения, отправленные в корневой логгер, будут отправляться в системный журнал по протоколу syslog, а сообщения в логгер «network» будут записываться в файл 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
: Разрешить параметры с именамиsocket.SOCK_DGRAM
иsocket.SOCK_STREAM
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаLogger
: Разрешить параметры с именамиgetChild()
иlog = getLogger('app')
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаКласс
LoggerAdapter
обзавелся методомisEnabledFor()
, который принимает значение уровня и возвращает, будет ли базовый регистратор обрабатывать сообщение этого уровня важности.
См.также
- PEP 391 - Конфигурация на основе словаря для ведения журнала
PEP written and implemented by Vinay Sajip.
PEP 3106: Dictionary Views¶
keys()
: Разрешить параметры с именами values()
и items()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
keys()
: Разрешить параметры с именами values()
и items()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
>>> 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])
The view keeps track of the dictionary and its contents change as the dictionary is modified:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
However, note that you can’t add or remove keys while you’re iterating over the view:
>>> 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
keys()
: Разрешить параметры с именами values()
и items()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
PEP 3137: The memoryview Object¶
Объект 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>
The content of the view can be converted to a string of bytes or a list of integers:
>>> 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')
>>>
Other Language Changes¶
Some smaller changes made to the core Python language are:
Синтаксис литералов множеств был перенесен из Python 3.x. Фигурные скобки используются для окружения содержимого результирующего изменяемого множества; литералы множеств отличаются от словарей тем, что не содержат двоеточий и значений.
{}
продолжает представлять пустой словарь; для пустого множества используйтеset()
.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
Задним числом Александр Вассалотти; bpo-2335.
Dictionary and set comprehensions are another feature backported from 3.x, generalizing list/generator comprehensions to use the literal syntax for sets and dictionaries.
>>> {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 ...
is equivalent to:
with A() as a: with B() as b: ... suite of statements ...
Функция
contextlib.nested()
обеспечивает очень похожую функцию, поэтому она больше не нужна и была устаревшей.(Proposed in https://codereview.appspot.com/53094; implemented by Georg Brandl.)
str()
: Разрешить параметры с именамиfloat
иcomplex
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаВ связи с этим
repr()
числа с плавающей точкой x теперь возвращает результат, основанный на самой короткой десятичной строке, которая гарантированно округляется до x при правильном округлении (в режиме округления от половины до четности). Ранее он выдавал строку, основанную на округлении x до 17 десятичных цифр.sys.float_repr_style
: Разрешить параметры с именамиshort
иlegacy
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаРеализовано Эриком Смитом и Марком Дикинсоном с использованием библиотеки Дэвида Гэя
dtoa.c
; bpo-7117.Conversions from long integers and regular integers to floating point now round differently, returning the floating-point number closest to the number. This doesn’t matter for small integers that can be converted exactly, but for large numbers that will unavoidably lose precision, Python 2.7 now approximates more closely. For example, Python 2.6 computed the following:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Python 2.7’s floating-point result is larger, but much closer to the true value:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(Выполнено Марком Дикинсоном; bpo-3166).
Целочисленное деление также более точно в своих действиях округления. (Также реализовано Марком Дикинсоном; bpo-1811).
Неявное принуждение для комплексных чисел было удалено; интерпретатор больше не будет пытаться вызвать метод
__coerce__()
на комплексных объектах. (Удалено Мидором Ингом и Марком Дикинсоном; bpo-5211).str.format()
: Разрешить параметры с именамиstr.format()
и%s
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
{...}
: Разрешить параметры с именамиstr.format()
и bpo-5237 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаformat()
: Разрешить параметры с именами1.5+3j
и bpo-1588 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаКод формата „F“ теперь всегда форматирует свой вывод, используя символы верхнего регистра, поэтому теперь он будет выдавать „INF“ и „NAN“. (Внесено Эриком Смитом; bpo-3382).
object.__format__()
: Разрешить параметры с именамиPendingDeprecationWarning
и__format__()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаint()
: Разрешить параметры с именамиlong()
иbit_length
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> 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
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаunicode
: Разрешить параметры с именами__unicode__()
и bpo-1583863 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаbytearray
: Разрешить параметры с именамиtranslate()
иNone
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда@classmethod
: Разрешить параметры с именами@staticmethod
и__func__
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда__slots__
: Разрешить параметры с именамиAttributeError
и bpo-7604 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаТеперь поддерживаются две новые кодировки: «cp720», используемая в основном для арабского текста; и «cp858», вариант CP 850, добавляющий символ евро. (CP720 предоставлена Александром Бельченко и Амори Форжо д’Арк в bpo-1616979; CP858 предоставлена Тимом Хэтчем в bpo-8016).
file
: Разрешить параметры с именамиfilename
иIOError
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаТокенизатор Python теперь сам переводит окончания строк, поэтому встроенная функция
compile()
теперь принимает код с любым соглашением об окончании строки. Кроме того, она больше не требует, чтобы код заканчивался новой строкой.Лишние круглые скобки в определениях функций недопустимы в Python 3.x, что означает синтаксическую ошибку
def f((x)): pass
. В режиме Python3-warning Python 2.7 теперь будет предупреждать о таком странном использовании. (Замечено Джеймсом Лингардом; bpo-7362).Теперь можно создавать слабые ссылки на объекты классов старого стиля. Классы нового стиля всегда имели слабые ссылки. (Исправлено Антуаном Питру; bpo-8268).
Когда объект модуля очищается от мусора, словарь модуля теперь очищается только в том случае, если ни у кого больше нет ссылки на этот словарь (bpo-7140).
Interpreter Changes¶
PYTHONWARNINGS
: Разрешить параметры с именами -W
и bpo-7301 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
Например, следующая настройка будет выводить предупреждения при каждом их появлении, но превращать предупреждения от модуля Cookie
в ошибку. (Точный синтаксис для установки переменной окружения различается в разных операционных системах и оболочках).
export PYTHONWARNINGS=all,error:::Cookie:0
Optimizations¶
Several performance enhancements have been added:
with
: Разрешить параметры с именами__enter__()
и__exit__()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаСборщик мусора теперь работает лучше для одного распространенного шаблона: когда выделяется много объектов без удаления ни одного из них. Раньше сборка мусора занимала квадратичное время, но теперь количество полных сборок мусора уменьшается по мере роста числа объектов в куче. Новая логика выполняет полную сборку мусора только тогда, когда среднее поколение было собрано 10 раз и когда количество выживших объектов из среднего поколения превышает 10 % от количества объектов в самом старом поколении. (Предложено Мартином фон Лёвисом и реализовано Антуаном Питру; bpo-4074).
Сборщик мусора старается не отслеживать простые контейнеры, которые не могут быть частью цикла. В Python 2.7 это теперь справедливо для кортежей и диктов, содержащих атомарные типы (такие как ints, strings и т. д.). Транзитивно, dict, содержащий кортежи атомарных типов, также не будет отслеживаться. Это помогает снизить стоимость каждой сборки мусора за счет уменьшения количества объектов, которые должны быть рассмотрены и пройдены сборщиком. (Внесено Антуаном Питру; bpo-4688).
2**15
: Разрешить параметры с именами2**30
и2**15
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаПомимо повышения производительности, это изменение должно быть незаметным для конечных пользователей, за одним исключением: для целей тестирования и отладки имеется новая структура 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).
%
: Разрешить параметры с именами%
и bpo-5176 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаВычисления списков с условием
if
компилируются в более быстрый байткод. (Исправление Антуана Питру, перенесено в 2.7 Джеффри Ясскином; bpo-4715).Преобразование целого или длинного целого числа в десятичную строку ускорялось за счет специального выделения основания 10 вместо использования обобщенной функции преобразования, поддерживающей произвольные основания. (Исправление Гавейна Болтона; bpo-6713).
split()
: Разрешить параметры с именамиreplace()
иrindex()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаpickle
: Разрешить параметры с именамиcPickle
и bpo-5084 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаВ модуле
cPickle
словари теперь имеют специальный регистр, что почти вдвое сокращает время, необходимое для их маринования. (Внесено Коллином Винтером; bpo-5670).
New and Improved Modules¶
Как и в каждом выпуске, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Здесь представлен неполный список наиболее заметных изменений, отсортированный в алфавитном порядке по имени модуля. За более полным списком изменений обратитесь к файлу Misc/NEWS
в дереве исходных текстов или просмотрите журналы Subversion, чтобы узнать все подробности.
bdb
: Разрешить параметры с именамиBdb
иdjango.*
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаbinascii
: Разрешить параметры с именамиmemoryview
и bpo-7703 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаbsddb
: Разрешить параметры с именами the pybsddb package и bpo-8156 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаbz2
: Разрешить параметры с именамиBZ2File
иwith bz2.BZ2File(...) as f:
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаCounter
: Разрешить параметры с именамиcollections
иCounter
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> 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()
иelements()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> 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: Adding an Ordered Dictionary to collections.deque
: Разрешить параметры с именамиcount()
иreverse()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаКласс
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
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаКонструкторы классов парсинга в модуле
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
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаМодуль
cookielib
теперь игнорирует файлы cookie с некорректным полем версии, не содержащим целочисленного значения. (Исправлено Джоном Дж. Ли; bpo-3924).copy
: Разрешить параметры с именамиdeepcopy()
и bpo-1515 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаctypes
: Разрешить параметры с именамиNone
иNULL
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаdatetime
: Разрешить параметры с именамиtimedelta
иtotal_seconds()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаDecimal
: Разрешить параметры с именамиfrom_float()
иDecimal
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаDecimal
: Разрешить параметры с именамиDecimal
иDecimal
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаDecimal
: Разрешить параметры с именами bpo-8257 и bpo-6595 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаContext
: Разрешить параметры с именамиDecimal
иcanonical()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаDecimal
: Разрешить параметры с именамиformat()
и bpo-6857 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаsNAN
: Разрешить параметры с именамиInvalidOperation
иNaN
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаdifflib
: Разрешить параметры с именами diff и patch с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsdist
: Разрешить параметры с именамиMANIFEST
иMANIFEST.in
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаdoctest
: Разрешить параметры с именамиIGNORE_EXCEPTION_DETAIL
и bpo-7490 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаemail
: Разрешить параметры с именамиMessage
иoutput_charset
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаFraction
: Разрешить параметры с именамиDecimal
и bpo-5812 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда<
: Разрешить параметры с именами<=
и>
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаFTP_TLS
: Разрешить параметры с именамиftplib
и bpo-2054 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаМетод
storbinary()
для бинарных закачек теперь может перезапускать закачки благодаря добавленному параметру rest (исправление Пабло Музо; bpo-6845).total_ordering()
: Разрешить параметры с именамиfunctools
и__eq__()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаcmp_to_key()
: Разрешить параметры с именамиsorted()
иmin()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаgc
: Разрешить параметры с именамиis_tracked()
и bpo-4688 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаgzip
: Разрешить параметры с именамиGzipFile
иwith gzip.GzipFile(...) as f:
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаФайлы в формате gzip могут быть дополнены нулевыми байтами; модуль
gzip
теперь будет использовать эти нулевые байты. (Исправлено Тадеком Пьетрашеком и Брайаном Кертином; bpo-2846).hashlib
: Разрешить параметры с именамиalgorithms
иhashlib.algorithms
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаHTTPResponse
: Разрешить параметры с именамиhttplib
и bpo-4879 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаHTTPConnection
: Разрешить параметры с именамиHTTPSConnection
и(host, port)
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаihooks
: Разрешить параметры с именамиihooks
иimputil
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаМодуль
imaplib
теперь поддерживает адреса IPv6. (Внесено Дереком Морром; bpo-1655).Новая функция:
inspect
модуляgetcallargs()
принимает вызываемую переменную и ее позиционные и ключевые аргументы, выясняет, какой из параметров вызываемой переменной будет принимать каждый аргумент, и возвращает словарь, отображающий имена аргументов на их значения. Например:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass ... >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Внесено Джорджем Саккисом; bpo-3135.
Обновленный модуль: Библиотека
io
была обновлена до версии, поставляемой с Python 3.1. В версии 3.1 библиотека ввода-вывода была полностью переписана на языке C и стала в 2-20 раз быстрее в зависимости от выполняемой задачи. Оригинальная версия для Python была переименована в модуль_pyio
.io.TextIOBase
: Разрешить параметры с именамиerrors
и'strict'
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаio.FileIO
: Разрешить параметры с именамиOSError
и bpo-4991 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаНовая функция:
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')
Note that elements are treated as unique depending on their position in the input, not their actual values.
itertools.count()
: Разрешить параметры с именамиcount()
иDecimal
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаitertools.combinations()
: Разрешить параметры с именамиitertools.product()
иValueError
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаОбновленный модуль: Модуль
json
был обновлен до версии 2.0.9 пакета simplejson, который включает расширение C, ускоряющее кодирование и декодирование. (Внесено Бобом Ипполито; bpo-4136).collections.OrderedDict
: Разрешить параметры с именамиjson.load()
и bpo-5381 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаmailbox
: Разрешить параметры с именамиMaildir
и bpo-1607951 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаmath
: Разрешить параметры с именамиerf()
иerfc()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаmultiprocessing
: Разрешить параметры с именамиManager*
и bpo-5585 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаPool
: Разрешить параметры с именамиPool
и bpo-6963 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаМодуль
nntplib
теперь поддерживает адреса IPv6. (Внесено Дереком Морром; bpo-1664).os
: Разрешить параметры с именамиgetresgid()
иgetresuid()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаos.fork()
: Разрешить параметры с именамиfork()
и bpo-7242 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаos.path
: Разрешить параметры с именамиnormpath()
иabspath()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаpydoc
: Разрешить параметры с именамиhelp('<<')
иhelp('@')
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаre
: Разрешить параметры с именамиsplit()
иsub()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаrun_path()
: Разрешить параметры с именамиrunpy
иexample.py
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаНовая функция: в модуле
shutil
make_archive()
принимает имя файла, тип архива (zip или tar-формат) и путь к каталогу и создает архив, содержащий содержимое каталога. (Добавлена Тареком Зиаде).shutil
: Разрешить параметры с именамиcopyfile()
иcopytree()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаМодуль
signal
больше не устанавливает обработчик сигналов заново, если это не является действительно необходимым, что исправляет ошибку, из-за которой было невозможно надежно перехватить сигнал EINTR. (Исправлено Шарлем-Франсуа Натали; bpo-8354).site
: Разрешить параметры с именамиgetsitepackages()
иgetusersitepackages()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsite
: Разрешить параметры с именамиsitecustomize
иKeyboardInterrupt
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаcreate_connection()
: Разрешить параметры с именами(host, port)
и bpo-3972 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаrecv_into()
: Разрешить параметры с именамиrecvfrom_into()
иbytearray
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаSocketServer
: Разрешить параметры с именамиTCPServer
иdisable_nagle_algorithm
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsqlite3
: Разрешить параметры с именами pysqlite package иenable_load_extension(True)
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаssl
: Разрешить параметры с именамиSSLSocket
и bpo-7133 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаwrap_socket()
: Разрешить параметры с именами in the OpenSSL documentation и bpo-8322 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаЕще одно изменение заставляет расширение загружать все шифры и алгоритмы дайджеста OpenSSL, чтобы все они были доступны. Некоторые SSL-сертификаты не могли быть проверены, сообщая об ошибке «неизвестный алгоритм». (Сообщено Бедой Косатой, исправлено Антуаном Питру; bpo-8484).
ssl.OPENSSL_VERSION
: Разрешить параметры с именамиssl.OPENSSL_VERSION_INFO
иssl.OPENSSL_VERSION_NUMBER
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаstruct
: Разрешить параметры с именамиbBhHiIlLqQ
иstruct.error
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsubprocess
: Разрешить параметры с именамиcheck_output()
иCalledProcessError
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> 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
(Contributed by Gregory P. Smith.)
subprocess
: Разрешить параметры с именамиEINTR
и bpo-1068268 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаНовая функция:
is_declared_global()
в модулеsymtable
возвращает true для переменных, явно объявленных глобальными, false - для переменных, объявленных глобальными неявно. (Внесено Джереми Хилтоном).syslog
: Разрешить параметры с именамиsys.argv[0]
и'python'
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsys.version_info
: Разрешить параметры с именамиmajor
иminor
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаsys.getwindowsversion()
: Разрешить параметры с именамиmajor
иminor
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаОбработка ошибок по умолчанию в модуле
tarfile
изменилась и больше не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был равен 0, что означало, что при ошибках будет записываться только сообщение в отладочный журнал, но поскольку отладочный журнал по умолчанию не активирован, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию равен 1, что вызывает исключение при возникновении ошибки. (Изменено Ларсом Густебелем; bpo-7357).tarfile
: Разрешить параметры с именамиTarInfo
иadd()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаwait()
: Разрешить параметры с именамиthreading.Event
иwait()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаunicodedata
: Разрешить параметры с именамиUnihan.txt
и bpo-1571184 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаurlparse
: Разрешить параметры с именамиurlsplit()
и RFC 3986 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (and Python 2.6.5) will return:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 actually produces slightly different output, since it returns a named tuple instead of a standard tuple.)
urlparse
: Разрешить параметры с именами RFC 2732 и bpo-2987 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> 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-stylesheet href="#style1"?>
и<!-- comment -->
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаxmlrpclib
: Разрешить параметры с именамиSimpleXMLRPCServer
иencode_threshold
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаzipfile
: Разрешить параметры с именамиZipFile
иwith zipfile.ZipFile(...) as f:
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасландаzipfile
: Разрешить параметры с именами bpo-4710 иread()
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаФункция
is_zipfile()
теперь принимает объект файла в дополнение к именам путей, которые принимались в предыдущих версиях. (Внесено Габриэлем Дженеллиной; bpo-4756).writestr()
: Разрешить параметры с именамиZipFile
и bpo-6003 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
New module: importlib¶
importlib
: Разрешить параметры с именами import
и importlib
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
import_module(name, package=None)
импортирует модуль. name - это строка, содержащая имя модуля или пакета. Можно выполнить относительный импорт, указав строку, начинающуюся с символа .
, например ..utils.errors
. Для относительного импорта необходимо указать аргумент package, который представляет собой имя пакета, используемого в качестве якоря для относительного импорта. import_module()
как вставляет импортируемый модуль в sys.modules
, так и возвращает объект модуля.
Вот несколько примеров:
>>> 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, но после добавления в релиз Tcl/Tck 8.5 был переименован в Ttk (для «тематического Tk»).
Чтобы узнать больше, прочитайте документацию по модулю 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
с сайта 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» для неожиданных успехов при запуске в режиме verbose. (Внесено Бенджамином Петерсоном.)
Тестовые примеры могут поднимать исключение SkipTest
, чтобы пропустить тест (bpo-1034053).
Сообщения об ошибках при сбоях assertEqual()
, assertTrue()
и assertFalse()
теперь содержат больше информации. Если вы установите атрибут longMessage
ваших классов TestCase
в true, то при сбоях будет выводиться как стандартное сообщение об ошибке, так и любое дополнительное сообщение, которое вы предоставите. (Добавлено Michael Foord; 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 работали над их включением в версию unittest
для Python.
Возьмите по одному выражению
assertIsNone()
иassertIsNotNone()
и проверьте, является ли результатNone
или нет.assertIs()
иassertIsNot()
принимают два значения и проверяют, относятся ли эти два значения к одному и тому же объекту или нет. (Добавлено Майклом Фоордом; bpo-2578).assertIsInstance()
иassertNotIsInstance()
проверяют, является ли полученный объект экземпляром определенного класса или одного из кортежа классов. (Добавлено Георгом Брандлом; bpo-7031).assertGreater()
,assertGreaterEqual()
,assertLess()
иassertLessEqual()
сравнивают две величины.assertMultiLineEqual()
сравнивает две строки и, если они не равны, отображает полезное сравнение, подчеркивающее различия в двух строках. Теперь это сравнение используется по умолчанию, когда строки Unicode сравниваются с помощьюassertEqual()
.assertRegexpMatches()
иassertNotRegexpMatches()
проверяет, является ли первый аргумент строкой, совпадающей или не совпадающей с регулярным выражением, указанным в качестве второго аргумента (bpo-8038).assertRaisesRegexp()
проверяет, возникло ли определенное исключение, а также проверяет, соответствует ли строковое представление исключения заданному регулярному выражению.assertIn()
иassertNotIn()
проверяют, находится ли первый в втором или нет.assertItemsEqual()
проверяет, содержат ли две предоставленные последовательности одинаковые элементы.assertSetEqual()
сравнивает, равны ли два набора, и в случае ошибки сообщает только разницу между наборами.Аналогично,
assertListEqual()
иassertTupleEqual()
сравнивают указанные типы и объясняют любые различия, не обязательно выводя их полные значения; эти методы теперь используются по умолчанию при сравнении списков и кортежей с помощьюassertEqual()
. В более общем случаеassertSequenceEqual()
сравнивает две последовательности и может опционально проверять, относятся ли обе последовательности к определенному типу.assertDictEqual()
сравнивает два словаря и сообщает о различиях; теперь он используется по умолчанию, когда вы сравниваете два словаря с помощьюassertEqual()
.assertDictContainsSubset()
проверяет, все ли пары ключ/значение из первого встречаются во втором.assertAlmostEqual()
иassertNotAlmostEqual()
проверяют, приблизительно ли равны первое и второе. Этот метод может либо округлить их разницу до опционально заданного числа мест (по умолчанию 7) и сравнить ее с нулем, либо потребовать, чтобы разница была меньше заданного значения дельта.loadTestsFromName()
должным образом учитывает атрибутsuiteClass
вTestLoader
. (Исправлено Марком Родди; bpo-6866).Новый хук позволяет расширить метод
assertEqual()
для работы с новыми типами данных. МетодaddTypeEqualityFunc()
принимает объект типа и функцию. Функция будет использоваться, если оба сравниваемых объекта имеют указанный тип. Эта функция должна сравнивать два объекта и вызывать исключение, если они не совпадают; хорошо, если функция будет предоставлять дополнительную информацию о том, почему два объекта не совпадают, как это делают новые методы сравнения последовательностей.
unittest.main()
теперь принимает необязательный аргумент exit
. Если он равен false, main()
не вызывает sys.exit()
, что позволяет использовать main()
из интерактивного интерпретатора. (Внесено Х. Пабло Фернандесом; bpo-3379).
В TestResult
появились новые методы startTestRun()
и stopTestRun()
, которые вызываются непосредственно перед и после выполнения теста. (Внесено Робертом Коллинзом; bpo-5728).
Со всеми этими изменениями unittest.py
становился неудобно большим, поэтому модуль был превращен в пакет, а код разбит на несколько файлов (автор Бенджамин Петерсон). Это не влияет на то, как модуль импортируется или используется.
См.также
- 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/>
, а в режиме text элементы будут пропускаться и выводиться только фрагменты текста. Если установить для атрибута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())
Исправлено: использование элемента в качестве булевого (т.е.
if elem:
) возвращало true, если у элемента были дети, или false, если детей не было. Такое поведение сбивает с толку -None
ложно, но ведь и элемент без детей тоже? – Поэтому теперь будет срабатыватьFutureWarning
. В своем коде вы должны быть явными: пишитеlen(elem) != 0
, если вас интересует количество детей, илиelem is not 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 Debugger, 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).Py_AddPendingCall()
теперь является потокобезопасным, позволяя любому рабочему потоку отправлять уведомления главному потоку Python. Это особенно полезно для асинхронных операций ввода-вывода. (Вклад Кристьяна Валура Йонссона; bpo-4293).Новая функция:
PyCode_NewEmpty()
создает пустой объект кода; требуется только имя файла, имя функции и номер первой строки. Это полезно для модулей расширения, которые пытаются построить более полезный стек отказов. Ранее такие расширения должны были вызыватьPyCode_New()
, который имел гораздо больше аргументов. (Добавлено Джеффри Ясскином).Новая функция:
PyErr_NewExceptionWithDoc()
создает новый класс исключений, как и существующаяPyErr_NewException()
, но принимает дополнительный аргументchar *
, содержащий строку документации для нового класса исключений. (Добавлена „lekma“ на трекере ошибок Python; bpo-7033).Новая функция:
PyFrame_GetLineNumber()
принимает объект фрейма и возвращает номер строки, в которой этот фрейм выполняется в данный момент. Ранее код должен был получить индекс инструкции байткода, выполняющейся в данный момент, а затем найти номер строки, соответствующий этому адресу. (Добавлено Джеффри Ясскином.)Новые функции:
PyLong_AsLongAndOverflow()
иPyLong_AsLongLongAndOverflow()
аппроксимирует длинное целое число Python как long или long long в C. Если число слишком велико, чтобы поместиться в выходной тип, устанавливается флаг переполнения и возвращается вызывающей стороне. (Вклад Кейса Ван Хорсена; 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
для отображения типов 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).Новая опция configure: переключатель
--with-system-expat
позволяет собрать модульpyexpat
, чтобы использовать системную библиотеку Expat. (Внесено Arfrever Frehtes Taifersar Arahesis; bpo-7609).Новая опция configure: опция
--with-valgrind
теперь отключает аллокатор pymalloc, который трудно корректно анализировать детектору ошибок памяти Valgrind. Таким образом, Valgrind будет лучше обнаруживать утечки и превышения памяти. (Внесено Джеймсом Хенстриджем; bpo-2422).Новая опция configure: теперь вы можете передать пустую строку в
--with-dbmliborder=
, чтобы отключить все различные модули DBM. (Добавлено Arfrever Frehtes Taifersar Arahesis; bpo-6491).Скрипт configure теперь проверяет ошибки округления с плавающей точкой на некоторых 32-битных чипах Intel и определяет определение препроцессора
X87_DOUBLE_ROUNDING
. В настоящее время ни один код не использует это определение, но оно доступно, если кто-то захочет его использовать. (Добавлено Марком Дикинсоном; bpo-2937).configure также теперь устанавливает переменную
LDCXXSHARED
. переменную Makefile для поддержки линковки C++. (Внесено Arfrever Frehtes Taifersar Arahesis; bpo-1222585).Теперь процесс сборки создает необходимые файлы для поддержки pkg-config. (Внесено Клинтоном Роем; bpo-3585).
Процесс сборки теперь поддерживает Subversion 1.7. (Внесено Arfrever Frehtes Taifersar Arahesis; bpo-6094).
Капсулы¶
В Python 3.1 добавлен новый тип данных C, PyCapsule
, для предоставления API на языке C модулю расширения. Капсула по сути является держателем указателя C void *
и доступна как атрибут модуля; например, API модуля socket
раскрывается как socket.CAPI
, а unicodedata
раскрывает ucnhash_CAPI
. Другие расширения могут импортировать модуль, получить доступ к его словарю, чтобы получить объект капсулы, а затем получить указатель void *
, который обычно указывает на массив указателей на различные API-функции модуля.
Для этого уже существует тип данных PyCObject
, но он не обеспечивает безопасности типов. Злой код, написанный на чистом Python, может вызвать ошибку сегментации, взяв PyCObject
из модуля A и каким-то образом заменив его на PyCObject
в модуле B. Капсулы знают свое имя, и получение указателя требует указания имени:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Вы можете быть уверены, что vtable
указывает на то, что вы ожидаете. Если была передана другая капсула, PyCapsule_IsValid()
обнаружит несовпадение имен и вернет false. Дополнительные сведения об использовании этих объектов см. в разделе Предоставление API на языке C для модуля расширения.
Python 2.7 теперь использует капсулы для предоставления различных API модулей расширения, но PyCObject_AsVoidPtr()
был модифицирован для работы с капсулами, сохраняя совместимость с интерфейсом 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()
API используется для запуска потоков, и теперь применяются собственные функции локального хранения потоков. (Вклад Кристьяна Валура Йонссона; bpo-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
для установленных пользователем Python, например из установщиков python.org. Начиная с macOS 10.12, Apple изменила конфигурацию системного каталога site-packages, что может привести к сбою при установке компонентов pip, например setuptools. Пакеты, установленные для системного Python, больше не будут совместно использоваться с установленными пользователями Python. (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
также сообщает, какое зерно было использовано (Добавлено Коллином Винтером).Еще один переключатель
regrtest.py
--j
, который принимает целое число, указывающее, сколько тестов выполняется параллельно. Это позволяет сократить общее время выполнения на многоядерных машинах. Эта опция совместима с некоторыми другими опциями, включая переключатель-R
, который, как известно, приводит к большому времени выполнения. (Добавлен Антуаном Питру, bpo-6152.) Его также можно использовать с новым переключателем-F
, который запускает выбранные тесты в цикле до тех пор, пока они не будут провалены. (Добавлено Антуаном Питру; bpo-7312).При выполнении в виде сценария модуль
py_compile.py
теперь принимает в качестве аргумента'-'
, который будет считывать стандартный ввод для списка имен файлов, подлежащих компиляции. (Внесено Петром Ожаровским; bpo-8233).
Переход на Python 2.7¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код:
Функция
range()
обрабатывает свои аргументы более последовательно; теперь она будет вызывать__int__()
при передаче ей не плоских и не целых аргументов. (Исправлено Александром Белопольским; bpo-1533).В строковом методе
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 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда
В стандартной библиотеке:
Операции с экземплярами
datetime
, в результате которых год выходил за пределы поддерживаемого диапазона, не всегда вызывали исключениеOverflowError
. Теперь такие ошибки проверяются более тщательно и будут вызывать исключение. (Сообщение Марка Линдера, исправление Ананда Б. Пиллая и Александра Белопольского; bpo-7150).При использовании экземпляров
Decimal
с методомformat()
строки по умолчанию ранее использовалось выравнивание по левому краю. Теперь оно изменено на выравнивание по правому краю, что может изменить вывод ваших программ. (Изменено Марком Дикинсоном; bpo-6857).sNAN
: Разрешить параметры с именамиInvalidOperation
иNaN
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаБиблиотека
xml.etree.ElementTree
больше не экранирует амперсанд и угловые скобки при выводе инструкции по обработке XML (которая выглядит как<?xml-stylesheet href="#style1"?>
) или комментария (который выглядит как<!-- comment -->
). (Исправление Нила Мюллера; bpo-2746).Метод
readline()
объектовStringIO
теперь ничего не делает, когда запрашивается отрицательная длина, как это делают другие файлоподобные объекты. (bpo-7348).syslog
: Разрешить параметры с именамиsys.argv[0]
и'python'
с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. АасландаОбработка ошибок по умолчанию в модуле
tarfile
изменилась и больше не подавляет фатальные ошибки. Ранее уровень ошибок по умолчанию был равен 0, что означало, что при ошибках будет записываться только сообщение в отладочный журнал, но поскольку отладочный журнал по умолчанию не активирован, эти ошибки оставались незамеченными. Теперь уровень ошибок по умолчанию равен 1, что вызывает исключение при возникновении ошибки. (Изменено Ларсом Густебелем; bpo-7357).urlparse
: Разрешить параметры с именамиurlsplit()
и RFC 3986 с пользовательскими именами C в Argument Clinic. Исправление Эрленда Э. Аасланда>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (and Python 2.6.5) will return:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 actually produces slightly different output, since it returns a named tuple instead of a standard tuple.)
Для расширений на языке C:
Расширения C, использующие коды целочисленных форматов с семейством функций
PyArg_Parse*
, теперь будут вызывать исключениеTypeError
, а не срабатывать наDeprecationWarning
(bpo-5080).Используйте новую функцию
PyOS_string_to_double()
вместо старых функцийPyOS_ascii_strtod()
иPyOS_ascii_atof()
, которые уже устарели.
Для приложений, в которых используется Python:
Функция
PySys_SetArgvEx()
была добавлена, что позволило приложениям закрыть брешь в безопасности, когда использовалась существующая функцияPySys_SetArgv()
. Проверьте, вызываете ли вы функциюPySys_SetArgv()
, и тщательно подумайте, не следует ли приложению использоватьPySys_SetArgvEx()
с updatepath, установленным на false.
Новые возможности, добавленные в обновленные версии Python 2.7¶
Новые возможности могут быть добавлены в релизы сопровождения Python 2.7, когда этого действительно требует ситуация. Любые такие дополнения должны проходить через процесс Python Enhancement Proposal и убедительно доказывать, почему они не могут быть адекватно решены либо добавлением новой функции исключительно в Python 3, либо публикацией ее в Python Package Index.
В дополнение к конкретным предложениям, перечисленным ниже, существует общее исключение, позволяющее добавлять новые предупреждения -3
в любом выпуске обновления Python 2.7.
Две новые переменные окружения для режима отладки¶
В режиме отладки статистика [xxx refs]
по умолчанию не записывается, теперь необходимо также установить переменную окружения PYTHONSHOWREFCOUNT
. (Внесено Виктором Стиннером; bpo-31733).
Когда Python компилируется с определенным значением COUNT_ALLOC
, подсчеты распределения больше не сбрасываются по умолчанию: теперь необходимо также установить переменную окружения PYTHONSHOWALLOCCOUNT
. Кроме того, подсчеты выделений теперь сбрасываются в stderr, а не в stdout. (Внесено Виктором Стиннером; bpo-31692).
Added in version 2.7.15.
PEP 434: Исключение по улучшению IDLE для всех филиалов¶
PEP 434 описывает общее исключение для изменений, внесенных в среду разработки IDLE, поставляемую вместе с Python. Это исключение позволяет разработчикам IDLE обеспечить более согласованный пользовательский опыт во всех поддерживаемых версиях Python 2 и 3.
Подробные сведения об изменениях в IDLE см. в файле NEWS для конкретного выпуска.
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
теперь поддерживает указание имени сервера, настройки TLS1.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.
Загрузочный конвейер по умолчанию¶
Новый модуль 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 были полностью переработаны в краткие документы по началу работы и FAQ. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide и документацию отдельных проектов.
Однако, поскольку в настоящее время эта миграция еще не завершена, старые версии этих руководств остаются доступными в виде Создание расширений C и C++ с помощью setuptools и Создание расширений C и C++ с помощью setuptools.
См.также
- 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).
Added in version 2.7.14.
Удаление цели сборки make touch
¶
Цель сборки make touch
, ранее использовавшаяся для запроса неявной регенерации сгенерированных файлов путем обновления времени их модификации, была удалена.
Она была заменена новой целью make regen-all
.
(Внесено Виктором Стиннером в bpo-23404).
Изменено в версии 2.7.14.
Благодарности¶
Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь в работе над различными черновиками этой статьи: Ник Коглан, Филип Дженви, Райан Ловетт, Р. Дэвид Мюррей, Хью Секер-Уокер.