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 3106 - Переделка dict.keys(), .values() и .items()

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

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')
>>>

См.также

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

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

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.

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

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