# Що нового в Python 2.7

Автор:

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

У цій статті пояснюється нові функції в Python 2.7. Python 2.7 був випущений 3 липня 2010 року.

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

Планується, що Python 2.7 стане останнім випуском 2.x, тому ми працювали над тим, щоб зробити його хорошим випуском у довгостроковій перспективі. Щоб допомогти з перенесенням на Python 3, кілька нових функцій із серії Python 3.x було включено у 2.7.

Ця стаття не намагається надати повну специфікацію нових функцій, натомість надає зручний огляд. Щоб отримати повну інформацію, зверніться до документації для Python 2.7 за адресою https://docs.python.org. Якщо ви хочете зрозуміти обґрунтування дизайну та реалізації, зверніться до PEP щодо конкретної нової функції або проблеми на https://bugs.python.org, у якій обговорювалася зміна. Коли це можливо, «Що нового в Python» посилається на елемент помилки/виправлення для кожної зміни.

## Майбутнє для Python 2.x

Python 2.7 є останнім великим випуском серії 2.x, оскільки розробники Python перенесли фокус своїх зусиль щодо розробки нових функцій на серію Python 3.x. Це означає, що в той час як Python 2 продовжує отримувати виправлення помилок і буде оновлюватися для правильного створення на новому апаратному забезпеченні та версіях підтримуваних операційних систем, не буде нових випусків повних функцій для мови або стандартної бібліотеки.

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

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

Ось деякі ключові наслідки довгострокового значення 2.7:

- Як зазначалося вище, випуск 2.7 має набагато довший період обслуговування порівняно з попередніми версіями 2.x. Наразі очікується, що Python 2.7 підтримуватиметься основною командою розробників (отримаючи оновлення безпеки та інші виправлення помилок) принаймні до 2020 року (через 10 років після початкового випуску порівняно з типовішим періодом підтримки 18–24 місяців).

- Оскільки стандартна бібліотека Python 2.7 старіє, ефективне використання індексу пакетів Python (пряме або через розповсюджувач) стає більш важливим для користувачів Python 2. На додаток до широкого спектру пакетів сторонніх розробників для різних завдань, доступні пакети включають бекпорти нових модулів і функцій із стандартної бібліотеки Python 3, які сумісні з Python 2, а також різні інструменти та бібліотеки, які можуть спростити перейдіть на Python 3. Посібник користувача з упаковки Python містить вказівки щодо завантаження та встановлення програмного забезпечення з індексу пакетів Python.

- Хоча зараз кращим підходом до покращення Python 2 є публікація нових пакетів у індексі пакетів Python, цей підхід не обов’язково працює у всіх випадках, особливо у випадках, пов’язаних із безпекою мережі. У виняткових випадках, які не можуть бути належним чином оброблені шляхом публікації нових або оновлених пакетів на PyPI, процес Python Enhancement Proposal може бути використаний для аргументації додавання нових функцій безпосередньо до стандартної бібліотеки Python 2. Будь-які такі доповнення та версії обслуговування, де вони були додані, будуть зазначені в розділі Нові функції, додані до випусків обслуговування Python 2.7 нижче.

Для проектів, які бажають перейти з Python 2 на Python 3, або для розробників бібліотек і фреймворків, які бажають підтримувати користувачів як на Python 2, так і на Python 3, доступні різноманітні інструменти та посібники, які допоможуть вибрати відповідний підхід і керувати деякими з технічні деталі. Рекомендованою відправною точкою є How to port Python 2 Code to Python 3 посібник HOWTO.

## Зміни в обробці попереджень про припинення підтримки

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

У попередніх випусках повідомлення `DeprecationWarning` було ввімкнено за замовчуванням, надаючи розробникам Python чітке вказівку про те, де їхній код може бути зламаний у майбутній основній версії Python.

Проте все більше користувачів програм на основі Python не беруть безпосередньої участі в розробці цих програм. Повідомлення `DeprecationWarning` не мають значення для таких користувачів, змушуючи їх турбуватися про програму, яка справді працює правильно, і обтяжуючи розробників програм реагуванням на ці проблеми.

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

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

## Функції Python 3.1

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

Неповний список функцій 3.1, які були перенесені до 2.7:

- Синтаксис літералів набору (`{1,2}` є змінним набором).

- Словник і набір розуміння (`{i: i*2 for i in range(3)}`).

- Кілька менеджерів контексту в одному операторі `with`.

- Нова версія бібліотеки `io`, переписана на C для підвищення продуктивності.

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

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

- Об’єкт `memoryview`.

- Невелика підмножина модуля `importlib`, описаного нижче.

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

- Перетворення float-to-string і string-to-float правильно округлені. Функція `round()` також тепер правильно округлена.

- Тип `PyCapsule`, який використовується для надання C API для модулів розширення.

- Функція C API `PyLong_AsLongAndOverflow()`.

Інші нові попередження режиму Python3 включають:

- `operator.isCallable()` and `operator.sequenceIncludes()`, which are not supported in 3.x, now trigger warnings.

- Перемикач `-3` тепер автоматично вмикає перемикач `-Qwarn`, який викликає попередження про використання класичного ділення на цілі та довгі цілі числа.

## PEP 372: Додавання впорядкованого словника до колекцій

Звичайні словники Python перебирають пари ключ/значення в довільному порядку. Протягом багатьох років кілька авторів написали альтернативні реалізації, які запам’ятовують порядок початкового вставлення ключів. Базуючись на досвіді цих реалізацій, 2.7 представляє новий клас `OrderedDict` в модулі `collections`.

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

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

Якщо новий запис перезаписує існуючий запис, вихідна позиція вставки залишається незмінною:

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

Видалення запису та повторне його вставлення перемістить його в кінець:

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

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

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

Порівняння двох упорядкованих словників перевіряє як ключі, так і значення, і вимагає, щоб порядок вставки був однаковим:

    >>> od1 = OrderedDict([('first', 1),
    ...                    ('second', 2),
    ...                    ('third', 3)])
    >>> od2 = OrderedDict([('third', 3),
    ...                    ('first', 1),
    ...                    ('second', 2)])
    >>> od1 == od2
    False
    >>> # Move 'third' key to the end
    >>> del od2['third']; od2['third'] = 3
    >>> od1 == od2
    True

Порівняння `OrderedDict` зі звичайним словником ігнорує порядок вставки та просто порівнює ключі та значення.

How does the `OrderedDict` work? It maintains a doubly linked list of keys, appending new keys to the list as they’re inserted. A secondary dictionary maps keys to their corresponding list node, so deletion doesn’t have to traverse the entire linked list and therefore remains O(1).

Стандартна бібліотека тепер підтримує використання впорядкованих словників у кількох модулях.

- The `ConfigParser` module uses them by default, meaning that configuration files can now be read, modified, and then written back in their original order.

- Метод `_asdict()` для `collections.namedtuple()` тепер повертає словник зі значеннями у тому ж порядку, що й базові індекси кортежу.

- The `json` module’s `JSONDecoder` class constructor was extended with an object_pairs_hook parameter to allow `OrderedDict` instances to be built by the decoder. Support was also added for third-party tools like PyYAML.

Дивись також

PEP 372 - Додавання впорядкованого словника до колекцій

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

## PEP 378: Специфікатор формату для розділювача тисяч

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

Повністю загальним рішенням для цього є модуль `locale`, який може використовувати різні роздільники («,» у Північній Америці, «.» у Європі) і різні розміри групування, але `locale` є складним. для використання та непридатний для багатопоточних програм, де різні потоки створюють вихід для різних локалей.

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

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

Форматуючи ціле число, додайте кому після ширини:

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

Цей механізм взагалі не адаптується; коми завжди використовуються як роздільники, а групування завжди відбувається у тризначні групи. Механізм форматування комами не такий загальний, як модуль `locale`, але ним простіше користуватися.

Дивись також

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

  PEP, написаний Раймондом Геттінгером; реалізований Еріком Смітом.

## PEP 389: Модуль argparse для розбору командних рядків

Модуль `argparse` для аналізу аргументів командного рядка було додано як більш потужну заміну модулю `optparse`.

This means Python now supports three different modules for parsing command-line arguments: `getopt`, `optparse`, and `argparse`. The `getopt` module closely resembles the C library’s `getopt()` function, so it remains useful if you’re writing a Python prototype that will eventually be rewritten in C. `optparse` becomes redundant, but there are no plans to remove it because there are many scripts still using it, and there’s no automated way to update these scripts. (Making the `argparse` API consistent with `optparse`’s interface was discussed but rejected as too messy and difficult.)

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

Ось приклад:

    import argparse

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

    # Add optional switches
    parser.add_argument('-v', action='store_true', dest='is_verbose',
                        help='produce verbose output')
    parser.add_argument('-o', action='store', dest='output',
                        metavar='FILE',
                        help='direct output to FILE instead of stdout')
    parser.add_argument('-C', action='store', type=int, dest='context',
                        metavar='NUM', default=0,
                        help='display NUM lines of added context')

    # Allow any number of additional arguments.
    parser.add_argument(nargs='*', action='store', dest='inputs',
                        help='input filenames (default is stdin)')

    args = parser.parse_args()
    print args.__dict__

Якщо ви не заміните його, перемикачі `-h` і `--help` додаються автоматично та створюють акуратно відформатований вихід:

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

    Command-line example.

    positional arguments:
      inputs      input filenames (default is stdin)

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

Як і у випадку з `optparse`, ключі та аргументи командного рядка повертаються як об’єкт з атрибутами, названими параметрами dest:

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

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

`argparse` має набагато кращу перевірку, ніж `optparse`; ви можете вказати точну кількість аргументів у вигляді цілого числа, 0 або більше аргументів, передавши `'*'`, 1 або більше, передавши `'+'`, або необов’язковий аргумент за допомогою `'?'`. Парсер верхнього рівня може містити суб-парсери для визначення підкоманд, які мають різні набори перемикачів, як-от `svn commit`, `svn checkout` тощо. Ви можете вказати тип аргументу як `FileType`, який автоматично відкриватиме для вас файли та розуміє, що `'-'` означає стандартне введення або виведення.

Дивись також

`argparse` документація

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

Migrating optparse code to argparse

  Частина документації Python, яка описує, як конвертувати код, який використовує `optparse`.

PEP 389 - argparse - Новий модуль аналізу командного рядка

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

## PEP 391: Конфігурація на основі словника для журналювання

Модуль `logging` дуже гнучкий; Програми можуть визначати дерево підсистем журналювання, і кожен реєстратор у цьому дереві може фільтрувати певні повідомлення, форматувати їх по-різному та направляти повідомлення до різної кількості обробників.

All this flexibility can require a lot of configuration. You can write Python statements to create objects and set their properties, but a complex set-up requires verbose but boring code. `logging` also supports a `fileConfig()` function that parses a file, but the file format doesn’t support configuring filters, and it’s messier to generate programmatically.

Python 2.7 adds a `dictConfig()` function that uses a dictionary to configure logging. There are many ways to produce a dictionary from different sources: construct one with code; parse a file containing JSON; or use a YAML parsing library if one is installed. For more information see Функції конфігурації.

У наступному прикладі налаштовуються два реєстратори, кореневий реєстратор і реєстратор під назвою «мережа». Повідомлення, надіслані до кореневого реєстратора, надсилатимуться до системного журналу за допомогою протоколу системного журналу, а повідомлення до «мережевого» реєстратора записуватимуться у файл `network.log`, який буде обертатися, коли розмір журналу досягне 1 МБ.

    import logging
    import logging.config

    configdict = {
     'version': 1,    # Configuration schema in use; must be 1 for now
     'formatters': {
         'standard': {
             'format': ('%(asctime)s %(name)-15s '
                        '%(levelname)-8s %(message)s')}},

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

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

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

    # As an example, log two error messages
    logger = logging.getLogger('/')
    logger.error('Database not found')

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

Три менші вдосконалення модуля `logging`, усі реалізовані Вінаєм Саджипом, це:

- Клас `SysLogHandler` тепер підтримує ведення системного журналу через TCP. Конструктор має параметр socktype, що вказує тип сокета для використання: `socket.SOCK_DGRAM` для UDP або `socket.SOCK_STREAM` для TCP. Стандартним протоколом залишається UDP.

- Екземпляри `Logger` отримали метод `getChild()`, який отримує реєстратор-нащадок за допомогою відносного шляху. Наприклад, якщо ви отримуєте реєстратор за допомогою `log = getLogger('app')`, виклик `log.getChild('network.listen')` еквівалентний `getLogger('app.network. слухай')`.

- The `LoggerAdapter` class gained an `isEnabledFor()` method that takes a level and returns whether the underlying logger would process a message of that level of importance.

Дивись також

PEP 391 - Конфігурація для журналювання на основі словника

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

## PEP 3106: Перегляди словника

Методи словника `keys()`, `values()` і `items()` відрізняються в Python 3.x. Вони повертають об’єкт під назвою view замість повністю матеріалізованого списку.

It’s not possible to change the return values of `keys()`, `values()`, and `items()` in Python 2.7 because too much code would break. Instead the 3.x versions were added under the new names `viewkeys()`, `viewvalues()`, and `viewitems()`.

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

Подання можна повторювати, але подання ключів і елементів також поводяться як набори. Оператор `&` виконує перетин, а `|` виконує об’єднання:

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

Перегляд відстежує словник і його вміст змінюється, коли словник змінюється:

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

Однак зауважте, що ви не можете додавати або видаляти ключі під час перегляду перегляду:

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

Ви можете використовувати методи перегляду в коді Python 2.x, а конвертер 2to3 змінить їх на стандартні `keys()`, `values()` і Методи `items()`.

Дивись також

PEP 3106 - Перебудова dict.keys(), .values() і .items()

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

## PEP 3137: об’єкт memoryview

Об’єкт `memoryview` забезпечує перегляд вмісту пам’яті іншого об’єкта, який відповідає інтерфейсу типу `bytes`.

    >>> import string
    >>> m = memoryview(string.letters)
    >>> m
    <memory at 0x37f850>
    >>> len(m)           # Returns length of underlying object
    52
    >>> m[0], m[25], m[26]   # Indexing returns one byte
    ('a', 'z', 'A')
    >>> m2 = m[0:26]         # Slicing returns another memoryview
    >>> m2
    <memory at 0x37f080>

Вміст подання можна перетворити на рядок байтів або список цілих чисел:

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

Об’єкти `memoryview` дозволяють змінювати базовий об’єкт, якщо він змінний.

    >>> m2[0] = 75
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: cannot modify read-only memory
    >>> b = bytearray(string.letters)  # Creating a mutable object
    >>> b
    bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
    >>> mb = memoryview(b)
    >>> mb[0] = '*'         # Assign to view, changing the bytearray.
    >>> b[0:5]              # The bytearray has been changed.
    bytearray(b'*bcde')
    >>>

Дивись також

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

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

## Інші зміни мови

Деякі менші зміни, внесені до основної мови Python:

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

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

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

- Розуміння словників і наборів — ще одна функція, портована з версії 3.x, яка узагальнює розуміння списків/генераторів для використання літерального синтаксису для наборів і словників.

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

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

- Оператор `with` тепер може використовувати кілька менеджерів контексту в одному операторі. Менеджери контексту обробляються зліва направо, і кожен з них розглядається як початок нового оператора `with`. Це означає що:

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

  еквівалентно:

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

  The `contextlib.nested()` function provides a very similar function, so it’s no longer necessary and has been deprecated.

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

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

  Пов’язано з цим, `repr()` числа з плаваючою комою x тепер повертає результат на основі найкоротшого десяткового рядка, який гарантовано повертається до x за правильного округлення (з округленням від половини до- рівномірний режим округлення). Раніше він давав рядок на основі округлення x до 17 десяткових цифр.

  Бібліотека округлення, відповідальна за це вдосконалення, працює на платформах Windows і Unix за допомогою компіляторів gcc, icc або suncc. Може існувати невелика кількість платформ, на яких коректна робота цього коду не може бути гарантована, тому код не використовується в таких системах. Ви можете дізнатися, який код використовується, перевіривши `sys.float_repr_style`, який буде `short`, якщо новий код використовується, і `legacy`, якщо він не використовується.

  Реалізовано Еріком Смітом і Марком Дікінсоном, використовуючи бібліотеку `dtoa.c` Девіда Гея; bpo-7117.

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

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

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

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

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

  Цілочисельне ділення також є більш точним у своїй поведінці округлення. (Також реалізовано Марком Дікінсоном; bpo-1811.)

- Implicit coercion for complex numbers has been removed; the interpreter will no longer ever attempt to call a `__coerce__()` method on complex objects. (Removed by Meador Inge and Mark Dickinson; bpo-5211.)

- Метод `str.format()` тепер підтримує автоматичну нумерацію полів заміни. Це робить використання `str.format()` більш схожим на використання `%s` форматування:

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

  Автоматична нумерація виконує поля зліва направо, тому перший специфікатор `{...}` використовуватиме перший аргумент `str.format()`, наступний специфікатор використовуватиме наступний аргумент, а так далі. Ви не можете змішувати автоматичну нумерацію та явну нумерацію — або пронумеруйте всі поля специфікаторів, або жодне з них — але ви можете поєднувати автоматичну нумерацію та іменовані поля, як у другому прикладі вище. (Надав Ерік Сміт; bpo-5237.)

  Комплексні числа тепер правильно підтримують використання з `format()` і за замовчуванням вирівнюються по правому краю. Вказівка точності або розділення комами застосовується як до дійсної, так і до уявної частин числа, але задана ширина поля та вирівнювання застосовуються до всього результуючого результату `1,5+3j`. (Надав Ерік Сміт; bpo-1588 і bpo-7988.)

  Код формату «F» тепер завжди форматує вихідні дані за допомогою символів у верхньому регістрі, тому тепер він створюватиме «INF» і «NAN». (Надав Ерік Сміт; bpo-3382.)

  A low-level change: the `object.__format__()` method now triggers a `PendingDeprecationWarning` if it’s passed a format string, because the `__format__()` method for `object` converts the object to a string representation and formats that. Previously the method silently applied the format string to the string representation, but that could hide mistakes in Python code. If you’re supplying formatting information such as an alignment or precision, presumably you’re expecting the formatting to be applied in some object-specific way. (Fixed by Eric Smith; bpo-7994.)

- The `int()` and `long()` types gained a `bit_length` method that returns the number of bits necessary to represent its argument in binary:

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

  (Надано Фредріком Йоханссоном і Віктором Стіннером; bpo-3439.)

- Оператор `import` більше не намагатиметься виконати абсолютний імпорт, якщо відносний імпорт (наприклад, `from .os import sep`) не вдається. Це виправляє помилку, але, можливо, може порушити певні оператори `import`, які працювали лише випадково. (Виправлено Meador Inge; bpo-7902.)

- It’s now possible for a subclass of the built-in `unicode` type to override the `__unicode__()` method. (Implemented by Victor Stinner; bpo-1583863.)

- Метод `translate()` типу `bytearray` тепер приймає як перший аргумент `None`. (Виправлено Георгом Брандлом; bpo-4759.)

- When using `@classmethod` and `@staticmethod` to wrap methods as class or static methods, the wrapper object now exposes the wrapped function as their `__func__` attribute. (Contributed by Amaury Forgeot d’Arc, after a suggestion by George Sakkis; bpo-5982.)

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

- Тепер підтримуються два нових кодування: «cp720», що використовується переважно для арабського тексту; і «cp858», варіант CP 850, який додає символ євро. (CP720 надано Олександром Бельченком і Аморі Форже д’Арком у bpo-1616979; CP858 надано Тімом Хетчем у bpo-8016.)

- The `file` object will now set the `filename` attribute on the `IOError` exception when trying to open a directory on POSIX platforms (noted by Jan Kaliszewski; bpo-4764), and now explicitly checks for and forbids writing to read-only file objects instead of trusting the C library to catch and report the error (fixed by Stefan Krah; bpo-5677).

- Токенізатор Python тепер сам перекладає закінчення рядків, тож вбудована функція `compile()` тепер приймає код із використанням будь-якої угоди про закінчення рядків. Крім того, більше не потрібно, щоб код закінчувався символом нового рядка.

- Додаткові круглі дужки у визначеннях функцій заборонені в Python 3.x, що означає, що ви отримуєте синтаксичну помилку від `def f((x)): pass`. У режимі попередження Python3 Python 2.7 тепер попереджатиме про це дивне використання. (Примітив Джеймс Лінгард; bpo-7362.)

- Тепер можна створювати слабкі посилання на об’єкти класу старого стилю. Класи нового стилю завжди мали слабкі посилання. (Виправлено Антуаном Пітру; bpo-8268.)

- Коли об’єкт модуля збирає сміття, словник модуля тепер очищається, лише якщо ніхто інший не містить посилання на словник (bpo-7140).

### Зміни перекладача

Нова змінна середовища, `PYTHONWARNINGS`, дозволяє контролювати попередження. Його слід встановити на рядок, що містить параметри попередження, еквівалентні тим, що використовуються з перемикачем `-W`, розділені комами. (Надав Браян Кертін; bpo-7301.)

For example, the following setting will print warnings every time they occur, but turn warnings from the `Cookie` module into an error. (The exact syntax for setting an environment variable varies across operating systems and shells.)

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

### Оптимізації

Додано кілька покращень продуктивності:

- A new opcode was added to perform the initial setup for `with` statements, looking up the `__enter__()` and `__exit__()` methods. (Contributed by Benjamin Peterson.)

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

- Збирач сміття намагається уникати відстеження простих контейнерів, які не можуть бути частиною циклу. У Python 2.7 це тепер вірно для кортежів і dicts, що містять атомарні типи (такі як int, strings тощо). Транзитивно, dict, що містить кортежі атомарних типів, також не відстежуватиметься. Це допомагає зменшити вартість кожного збору сміття за рахунок зменшення кількості об’єктів, які розглядаються та обходяться збирачем. (Надав Антуан Пітру; bpo-4688.)

- Довгі цілі числа тепер зберігаються внутрішньо або в основі `2**15`, або в базі `2**30`, причому база визначається під час створення. Раніше вони завжди зберігалися в базі `2**15`. Використання бази `2**30` дає значне покращення продуктивності на 64-розрядних машинах, але результати порівняльного тестування на 32-розрядних машинах були неоднозначними. Тому за замовчуванням на 64-розрядних машинах використовується основа `2**30` і основа `2**15` на 32-розрядних машинах; в Unix є новий параметр конфігурації `--enable-big-digits`, який можна використовувати для заміни цього значення за замовчуванням.

  Apart from the performance improvements this change should be invisible to end users, with one exception: for testing and debugging purposes there’s a new structseq `sys.long_info` that provides information about the internal format, giving the number of bits per digit and the size in bytes of the C type used to store each digit:

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

  (Надав Марк Дікінсон; bpo-4258.)

  Інший набір змін зробив довгі об’єкти на кілька байтів меншими: на 2 байти менше в 32-бітних системах і на 6 байтів у 64-бітних. (Надав Марк Дікінсон; bpo-5260.)

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

- Реалізація `%` перевіряє, чи лівий операнд є рядком Python, і вводить його в спеціальні регістри; це призводить до збільшення продуктивності на 1–3% для програм, які часто використовують `%` з рядками, наприклад бібліотек шаблонів. (Реалізовано Колліном Вінтером; bpo-5176.)

- Розуміння списків із умовою `if` компілюється у швидший байт-код. (Патч Антуана Пітру, перенесено на 2.7 Джеффрі Яскіним; bpo-4715.)

- Перетворення цілого або довгого цілого числа в десятковий рядок стало швидшим за допомогою спеціальної бази 10 замість використання узагальненої функції перетворення, яка підтримує довільні основи. (Патч від Гавейна Болтона; bpo-6713.)

- The `split()`, `replace()`, `rindex()`, `rpartition()`, and `rsplit()` methods of string-like types (strings, Unicode strings, and `bytearray` objects) now use a fast reverse-search algorithm instead of a character-by-character scan. This is sometimes faster by a factor of 10. (Added by Florent Xicluna; bpo-7462 and bpo-7622.)

- The `pickle` and `cPickle` modules now automatically intern the strings used for attribute names, reducing memory usage of the objects resulting from unpickling. (Contributed by Jake McGuire; bpo-5084.)

- The `cPickle` module now special-cases dictionaries, nearly halving the time required to pickle them. (Contributed by Collin Winter; bpo-5670.)

## Нові та вдосконалені модулі

Як і в кожному випуску, стандартна бібліотека Python отримала низку вдосконалень і виправлень помилок. Ось неповний список найбільш помітних змін, відсортованих за алфавітом назв модулів. Зверніться до файлу `Misc/NEWS` у дереві вихідних кодів, щоб отримати більш повний список змін, або перегляньте журнали Subversion, щоб отримати всі деталі.

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

- Модуль `binascii` тепер підтримує API буфера, тому його можна використовувати з примірниками `memoryview` та іншими подібними об’єктами буфера. (Портпортовано з 3.x Флораном Ксіклюною; bpo-7703.)

- Updated module: the `bsddb` module has been updated from 4.7.2devel9 to version 4.8.4 of the pybsddb package. The new version features better Python 3.x compatibility, various bug fixes, and adds several new BerkeleyDB flags and methods. (Updated by Jesús Cea Avión; bpo-8156. The pybsddb changelog can be read at https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)

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

- Новий клас: клас `Counter` у модулі `collections` корисний для підрахунку даних. Екземпляри `Counter` поводяться здебільшого як словники, але повертають нуль за відсутні ключі замість того, щоб викликати `KeyError`:

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

  Є три додаткові методи `Counter`. `most_common()` повертає N найпоширеніших елементів та їх кількість. `elements()` повертає ітератор над вмістом елементів, повторюючи кожен елемент стільки разів, скільки його кількість. `subtract()` приймає iterable і віднімає один для кожного елемента замість додавання; якщо аргументом є словник або інший `Counter`, кількість віднімається.

      >>> c.most_common(5)
      [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
      >>> c.elements() ->
         'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
         'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
         'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
         's', 's', 'r', 't', 't', 'x'
      >>> c['e']
      5
      >>> c.subtract('very heavy on the letter e')
      >>> c['e']    # Count is now lower
      -1

  Надав Реймонд Геттінгер; bpo-1696199.

  Новий клас: `OrderedDict` описано в попередньому розділі PEP 372: Додавання впорядкованого словника до колекцій.

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

  Клас `namedtuple` тепер має додатковий параметр rename. Якщо rename має значення true, назви полів, які є недійсними через те, що вони повторювалися або не є допустимими ідентифікаторами Python, буде перейменовано на офіційні імена, які походять від позиції поля в списку полів:

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

  (Додав Раймонд Геттінгер; bpo-1818.)

  Finally, the `Mapping` abstract base class now returns `NotImplemented` if a mapping is compared to another type that isn’t a `Mapping`. (Fixed by Daniel Stutzbach; bpo-8729.)

- Constructors for the parsing classes in the `ConfigParser` module now take an allow_no_value parameter, defaulting to false; if true, options without values will be allowed. For example:

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

- Deprecated function: `contextlib.nested()`, which allows handling more than one context manager with a single `with` statement, has been deprecated, because the `with` statement now supports multiple context managers.

- The `cookielib` module now ignores cookies that have an invalid version field, one that doesn’t contain an integer value. (Fixed by John J. Lee; bpo-3924.)

- Функція `deepcopy()` модуля `copy` тепер правильно копіюватиме зв’язані методи примірників. (Реалізовано Робертом Коллінзом; bpo-1515.)

- Модуль `ctypes` тепер завжди перетворює `None` на покажчик C `NULL` для аргументів, оголошених як покажчики. (Змінено Томасом Хеллером; bpo-4606.) Базову бібліотеку libffi було оновлено до версії 3.0.9, що містить різні виправлення для різних платформ. (Оновлено Маттіасом Клозе; bpo-8142.)

- Новий метод: клас `timedelta` модуля `datetime` отримав метод `total_seconds()`, який повертає кількість секунд у тривалості. (Надав Браян Квінлан; bpo-5788.)

- New method: the `Decimal` class gained a `from_float()` class method that performs an exact conversion of a floating-point number to a `Decimal`. This exact conversion strives for the closest decimal approximation to the floating-point representation’s value; the resulting decimal value will therefore still include the inaccuracy, if any. For example, `Decimal.from_float(0.1)` returns `Decimal('0.1000000000000000055511151231257827021181583404541015625')`. (Implemented by Raymond Hettinger; bpo-4796.)

  Comparing instances of `Decimal` with floating-point numbers now produces sensible results based on the numeric values of the operands. Previously such comparisons would fall back to Python’s default rules for comparing objects, which produced arbitrary results based on their type. Note that you still cannot combine `Decimal` and floating point in other operations such as addition, since you should be explicitly choosing how to convert between float and `Decimal`. (Fixed by Mark Dickinson; bpo-2531.)

  Конструктор для `Decimal` тепер приймає числа з плаваючою комою (додано Raymond Hettinger; bpo-8257) і неєвропейські символи Unicode, такі як арабсько-індійські цифри (надано Марком Дікінсоном; : випуск: 6595).

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

  Під час використання екземплярів `Decimal` із методом `format()` рядка вирівнювання за замовчуванням раніше було лівим. Це було змінено на вирівнювання по правому краю, що є більш розумним для числових типів. (Змінено Марком Дікінсоном; bpo-6857.)

  Порівняння, що включають сигнальне значення NaN (або `sNAN`), тепер сигналізують `InvalidOperation` замість мовчки повертати значення true або false залежно від оператора порівняння. Тихі значення NaN (або `NaN`) тепер можна хешувати. (Виправлено Марком Дікінсоном; bpo-7279.)

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

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

- The `doctest` module’s `IGNORE_EXCEPTION_DETAIL` flag will now ignore the name of the module containing the exception being tested. (Patch by Lennart Regebro; bpo-7490.)

- The `email` module’s `Message` class will now accept a Unicode-valued payload, automatically converting the payload to the encoding specified by `output_charset`. (Added by R. David Murray; bpo-1368247.)

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

  Порядок порівнянь (`<`, `<=`, `>`, `>=`) між дробами та комплексними числами тепер викликає `TypeError`. Це виправляє недогляд, завдяки чому `Fraction` відповідає іншим числовим типам.

- Новий клас: `FTP_TLS` у модулі `ftplib` забезпечує безпечні FTP-з’єднання за допомогою інкапсуляції TLS для автентифікації, а також подальший контроль і передачу даних. (Надав Джампаоло Родола; bpo-2054.)

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

- New class decorator: `total_ordering()` in the `functools` module takes a class that defines an `__eq__()` method and one of `__lt__()`, `__le__()`, `__gt__()`, or `__ge__()`, and generates the missing comparison methods. Since the `__cmp__()` method is being deprecated in Python 3.x, this decorator makes it easier to define ordered classes. (Added by Raymond Hettinger; bpo-5479.)

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

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

- `GzipFile` модуля `gzip` тепер підтримує протокол керування контекстом, тому ви можете писати `with gzip.GzipFile(...) як f:` (надано Hagen Fürstenau; bpo-3860), і тепер він реалізує `io.BufferedIOBase` ABC, тому ви можете обернути його `io.BufferedReader` для швидшої обробки (надано Nir Aides; bpo-7471). Також тепер можна змінити час модифікації, записаний у файлі, стиснутому gzip, шляхом надання конструктору додаткової позначки часу. (Надав Жак Фреше; bpo-4272.)

  Файли у форматі gzip можуть бути доповнені нульовими байтами в кінці; модуль `gzip` тепер споживатиме ці кінцеві байти. (Виправлено Tadek Pietraszek і Brian Curtin; bpo-2846.)

- New attribute: the `hashlib` module now has an `algorithms` attribute containing a tuple naming the supported algorithms. In Python 2.7, `hashlib.algorithms` contains `('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')`. (Contributed by Carl Chenet; bpo-7418.)

- The default `HTTPResponse` class used by the `httplib` module now supports buffering, resulting in much faster reading of HTTP responses. (Contributed by Kristján Valur Jónsson; bpo-4879.)

  The `HTTPConnection` and `HTTPSConnection` classes now support a source_address parameter, a `(host, port)` 2-tuple giving the source address that will be used for the connection. (Contributed by Eldon Ziegler; bpo-3972.)

- The `ihooks` module now supports relative imports. Note that `ihooks` is an older module for customizing imports, superseded by the `imputil` module added in Python 2.0. (Relative import support added by Neil Schemenauer.)

- Модуль `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.

- Updated module: The `io` library has been upgraded to the version shipped with Python 3.1. For 3.1, the I/O library was entirely rewritten in C and is 2 to 20 times faster depending on the task being performed. The original Python version was renamed to the `_pyio` module.

  One minor resulting change: the `io.TextIOBase` class now has an `errors` attribute giving the error setting used for encoding and decoding errors (one of `'strict'`, `'replace'`, `'ignore'`).

  Клас `io.FileIO` тепер викликає `OSError`, коли передається недійсний дескриптор файлу. (Реалізовано Бенджаміном Петерсоном; bpo-4991.) Метод `truncate()` тепер зберігає позицію файлу; раніше він змінював позицію файлу на кінець нового файлу. (Виправлено Паскалем Шамбоном; bpo-6939.)

- Нова функція: `itertools.compress(data, selectors)` використовує два ітератори. Елементи data повертаються, якщо відповідне значення в selectors має значення true:

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

  Нова функція: `itertools.combinations_with_replacement(iter, r)` повертає всі можливі комбінації елементів довжини r з ітерованого iter. На відміну від `combinations()`, окремі елементи можуть повторюватися у згенерованих комбінаціях:

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

  Зауважте, що елементи розглядаються як унікальні залежно від їхньої позиції у вхідних даних, а не від фактичних значень.

  Функція `itertools.count()` тепер має аргумент step, який дозволяє збільшувати значення, відмінні від 1. `count()` також тепер дозволяє використовувати ключові аргументи та використовувати нецілі значення, наприклад числа з плаваючою точкою або `Decimal` екземпляри. (Реалізовано Raymond Hettinger; bpo-5032.)

  `itertools.combinations()` і `itertools.product()` раніше викликали `ValueError` для значень r, які перевищують ітерацію введення. Це було визнано помилкою специфікації, тому тепер вони повертають порожній ітератор. (Виправлено Раймондом Геттінгером; bpo-4816.)

- Оновлений модуль: модуль `json` було оновлено до версії 2.0.9 пакета simplejson, який включає розширення C, яке робить кодування та декодування швидшим. (Надав Боб Іполіто; bpo-4136.)

  Щоб підтримувати новий тип `collections.OrderedDict`, `json.load()` тепер має необов’язковий параметр object_pairs_hook, який буде викликатися з будь-яким літералом об’єкта, який декодує список пар. (Надав Реймонд Геттінгер; bpo-5381.)

- Клас `Maildir` модуля `mailbox` тепер записує мітку часу в каталогах, які він читає, і перечитує їх, лише якщо час модифікації згодом змінився. Це покращує продуктивність, уникаючи непотрібного сканування каталогу. (Виправлено A.M. Kuchling і Antoine Pitrou; bpo-1607951, bpo-6896.)

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

- The `multiprocessing` module’s `Manager*` classes can now be passed a callable that will be called whenever a subprocess is started, along with a set of arguments that will be passed to the callable. (Contributed by lekma; bpo-5585.)

  The `Pool` class, which controls a pool of worker processes, now has an optional maxtasksperchild parameter. Worker processes will perform the specified number of tasks and then exit, causing the `Pool` to start a new worker. This is useful if tasks may leak memory or other resources, or if some tasks will cause the worker to become very large. (Contributed by Charles Cazabon; bpo-6963.)

- The `nntplib` module now supports IPv6 addresses. (Contributed by Derek Morr; bpo-1664.)

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

  Функція `os.fork()` тепер повторно ініціалізує блокування імпорту в дочірньому процесі; це вирішує проблеми в Solaris, коли `fork()` викликається з потоку. (Виправлено Жолтом Черною; bpo-7242.)

- У модулі `os.path` функції `normpath()` і `abspath()` тепер зберігають Unicode; якщо їхній вхідний шлях є рядком Unicode, значення, що повертається, також є рядком Unicode. (`normpath()` виправлено Метом Джукою в bpo-5827; `abspath()` виправлено Еціо Мелотті в bpo-3426.)

- Модуль `pydoc` тепер має довідку для різних символів, які використовує Python. Тепер ви можете, наприклад, виконати `help('<<')` або `help('@')`. (Надав Девід Лабан; bpo-4739.)

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

- Нова функція: `run_path()` у модулі `runpy` виконає код за наданим аргументом path. шлях може бути шляхом до вихідного файлу Python (`example.py`), скомпільованого файлу байт-коду (`example.pyc`), каталогу (`./package/` ), або архів zip (`example.zip`). Якщо вказано каталог або шлях до zip-архіву, його буде додано на початку `sys.path`, а модуль `__main__` буде імпортовано. Очікується, що каталог або zip містить `__main__.py`; якщо цього не відбувається, якийсь інший `__main__.py` може бути імпортовано з розташування пізніше в `sys.path`. Це робить більшу частину механізму `runpy` доступною для сценаріїв, які хочуть імітувати те, як командний рядок Python обробляє явне ім’я шляху. (Додав Нік Коглан; bpo-6816.)

- Нова функція: у модулі `shutil` `make_archive()` приймає назву файлу, тип архіву (формат zip або tar) і шлях до каталогу та створює архів із вмістом каталогу. (Додав Тарек Зіаде.)

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

- Модуль `signal` більше не перевстановлює обробник сигналу, якщо це не справді необхідно, що виправляє помилку, яка могла зробити неможливим надійне перехоплення сигналу EINTR. (Виправлено Чарльзом-Франсуа Наталі; bpo-8354.)

- New functions: in the `site` module, three new functions return various site- and user-specific paths. `getsitepackages()` returns a list containing all global site-packages directories, `getusersitepackages()` returns the path of the user’s site-packages directory, and `getuserbase()` returns the value of the `USER_BASE` environment variable, giving the path to a directory that can be used to store data. (Contributed by Tarek Ziadé; bpo-6693.)

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

- Функція `create_connection()` отримала параметр source_address, двокортеж `(хост, порт)`, що вказує адресу джерела, яка використовуватиметься для підключення. (Надав Елдон Зіглер; bpo-3972.)

  Методи `recv_into()` і `recvfrom_into()` тепер записуватимуть в об’єкти, які підтримують API буфера, найбільш корисні `bytearray` і об’єкти `memoryview`. (Реалізовано Антуаном Пітру; bpo-8104.)

- The `SocketServer` module’s `TCPServer` class now supports socket timeouts and disabling the Nagle algorithm. The `disable_nagle_algorithm` class attribute defaults to `False`; if overridden to be true, new request connections will have the TCP_NODELAY option set to prevent buffering many small sends into a single TCP packet. The `timeout` class attribute can hold a timeout in seconds that will be applied to the request socket; if no request is received within that time, `handle_timeout()` will be called and `handle_request()` will return. (Contributed by Kristján Valur Jónsson; bpo-6192 and bpo-6267.)

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

- The `ssl` module’s `SSLSocket` objects now support the buffer API, which fixed a test suite failure (fix by Antoine Pitrou; bpo-7133) and automatically set OpenSSL’s `SSL_MODE_AUTO_RETRY`, which will prevent an error code being returned from `recv()` operations that trigger an SSL renegotiation (fix by Antoine Pitrou; bpo-8222).

  The `wrap_socket()` constructor function now takes a ciphers argument that’s a string listing the encryption algorithms to be allowed; the format of the string is described in the OpenSSL documentation. (Added by Antoine Pitrou; bpo-8322.)

  Інша зміна змушує розширення завантажувати всі шифри та алгоритми дайджесту OpenSSL, щоб усі вони були доступними. Деякі сертифікати SSL не вдалося перевірити, повідомляючи про помилку «невідомий алгоритм». (Повідомив Беда Косата та виправив Антуан Пітру; bpo-8484.)

  The version of OpenSSL being used is now available as the module attributes `ssl.OPENSSL_VERSION` (a string), `ssl.OPENSSL_VERSION_INFO` (a 5-tuple), and `ssl.OPENSSL_VERSION_NUMBER` (an integer). (Added by Antoine Pitrou; bpo-8321.)

- The `struct` module will no longer silently ignore overflow errors when a value is too large for a particular integer format code (one of `bBhHiIlLqQ`); it now always raises a `struct.error` exception. (Changed by Mark Dickinson; bpo-1523.) The `pack()` function will also attempt to use `__index__()` to convert and pack non-integers before trying the `__int__()` method or reporting an error. (Changed by Mark Dickinson; bpo-8300.)

- Нова функція: модуль `subprocess` `check_output()` виконує команду з указаним набором аргументів і повертає результат команди як рядок, коли команда виконується без помилок, або викликає Виняток `CalledProcessError` інакше.

      >>> subprocess.check_output(['df', '-h', '.'])
      'Filesystem     Size   Used  Avail Capacity  Mounted on\n
      /dev/disk0s2    52G    49G   3.0G    94%    /\n'

      >>> subprocess.check_output(['df', '-h', '/bogus'])
        ...
      subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1

  (Надав Грегорі П. Сміт.)

  The `subprocess` module will now retry its internal system calls on receiving an `EINTR` signal. (Reported by several people; final patch by Gregory P. Smith in bpo-1068268.)

- Нова функція: `is_declared_global()` у модулі `symtable` повертає true для змінних, які явно оголошені як глобальні, і false для змінних, які неявно є глобальними. (Надав Джеремі Гілтон.)

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

- The `sys.version_info` value is now a named tuple, with attributes named `major`, `minor`, `micro`, `releaselevel`, and `serial`. (Contributed by Ross Light; bpo-4285.)

  `sys.getwindowsversion()` also returns a named tuple, with attributes named `major`, `minor`, `build`, `platform`, `service_pack`, `service_pack_major`, `service_pack_minor`, `suite_mask`, and `product_type`. (Contributed by Brian Curtin; bpo-7766.)

- Стандартну обробку помилок модуля `tarfile` було змінено, і більше не пригнічуються фатальні помилки. Раніше рівень помилок за замовчуванням був 0, що означало, що помилки призводили лише до запису повідомлення в журнал налагодження, але оскільки журнал налагодження не активовано за замовчуванням, ці помилки залишаються непоміченими. Рівень помилки за замовчуванням тепер становить 1, що викликає виняток у разі виникнення помилки. (Змінено Ларсом Густебелем; bpo-7357.)

  `tarfile` тепер підтримує фільтрацію об’єктів `TarInfo`, які додаються до файлу tar. Коли ви викликаєте `add()`, ви можете надати додатковий аргумент filter, який можна викликати. Викликаний filter отримуватиме `TarInfo` для кожного файлу, який додається, і зможе змінювати та повертати його. Якщо виклик повертає `None`, файл буде виключено з отриманого архіву. Це потужніший аргумент, ніж існуючий аргумент exclude, який, отже, застарів. (Додав Ларс Густебель; bpo-6856.) Клас `TarFile` тепер також підтримує протокол керування контекстом. (Додав Ларс Густебель; bpo-7232.)

- Метод `wait()` класу `threading.Event` тепер повертає внутрішній прапор під час виходу. Це означає, що метод зазвичай повертатиме true, оскільки `wait()` має блокуватися, доки внутрішній прапор не стане істинним. Повернене значення буде false, лише якщо було надано тайм-аут і час очікування операції минув. (Надав Тім Лешер; bpo-1674032.)

- База даних Юнікод, надана модулем `unicodedata`, тепер використовується внутрішньо, щоб визначити, які символи є цифрами, пробілами чи представляють розриви рядків. База даних також містить інформацію з файлу даних `Unihan.txt` (патч від Anders Chrigström і Amaury Forgeot d’Arc; bpo-1571184) і була оновлена до версії 5.2.0 (оновлено Florent Xicluna ; bpo-8024).

- The `urlparse` module’s `urlsplit()` now handles unknown URL schemes in a fashion compliant with RFC 3986: if the URL is of the form `"<something>://..."`, the text before the `://` is treated as the scheme, even if it’s a made-up scheme that the module doesn’t know about. This change may break code that worked around the old behaviour. For example, Python 2.6.4 or 2.5 will return the following:

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

  Python 2.7 (і Python 2.6.5) поверне:

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

  (Python 2.7 фактично створює дещо інший вихід, оскільки він повертає іменований кортеж замість стандартного кортежу.)

  The `urlparse` module also supports IPv6 literal addresses as defined by RFC 2732 (contributed by Senthil Kumaran; bpo-2987).

      >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
      ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
                  path='/foo', params='', query='', fragment='')

- Новий клас: клас `WeakSet` у модулі `weakref` — це набір, який містить лише слабкі посилання на свої елементи; елементи буде видалено, якщо на них не буде посилань. (Спочатку реалізовано в Python 3.x Реймондом Геттінгером і перенесено до версії 2.7 Майклом Фордом.)

- The `xml.etree.ElementTree` library, no longer escapes ampersands and angle brackets when outputting an XML processing instruction (which looks like `<?xml-stylesheet href="#style1"?>`) or comment (which looks like `<!-- comment -->`). (Patch by Neil Muller; bpo-2746.)

- The XML-RPC client and server, provided by the `xmlrpclib` and `SimpleXMLRPCServer` modules, have improved performance by supporting HTTP/1.1 keep-alive and by optionally using gzip encoding to compress the XML being exchanged. The gzip compression is controlled by the `encode_threshold` attribute of `SimpleXMLRPCRequestHandler`, which contains a size in bytes; responses larger than this will be compressed. (Contributed by Kristján Valur Jónsson; bpo-6267.)

- Модуль `zipfile` `ZipFile` тепер підтримує протокол керування контекстом, тому ви можете писати `with zipfile.ZipFile(...) як f:`. (Надав Браян Кертін; bpo-5511.)

  `zipfile` now also supports archiving empty directories and extracts them correctly. (Fixed by Kuba Wieczorek; bpo-4710.) Reading files out of an archive is faster, and interleaving `read()` and `readline()` now works correctly. (Contributed by Nir Aides; bpo-7610.)

  Функція `is_zipfile()` тепер приймає об’єкт файлу на додаток до імен шляхів, прийнятих у попередніх версіях. (Надав Габріель Генелліна; bpo-4756.)

  Метод `writestr()` тепер має необов’язковий параметр compress_type, який дозволяє перевизначити метод стиснення за замовчуванням, указаний у конструкторі `ZipFile`. (Надав Рональд Оуссорен; bpo-6003.)

### Новий модуль: importlib

Python 3.1 includes the `importlib` package, a re-implementation of the logic underlying Python’s `import` statement. `importlib` is useful for implementers of Python interpreters and to users who wish to write new importers that can participate in the import process. Python 2.7 doesn’t contain the complete `importlib` package, but instead has a tiny subset that contains a single function, `import_module()`.

`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, але був перейменований на Ttk (для «тематичних Tk») після додавання до випуску Tcl/Tck 8.5.

To learn more, read the `ttk` module documentation. You may also wish to read the Tcl/Tk manual page describing the Ttk theme engine, available at https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Some screenshots of the Python/Ttk code in use are at https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.

The `tkinter.ttk` module was written by Guilherme Polo and added in bpo-2983. An alternate version called `Tile.py`, written by Martin Franklin and maintained by Kevin Walzer, was proposed for inclusion in bpo-2618, but the authors argued that Guilherme Polo’s work was more comprehensive.

### Оновлений модуль: unittest

The `unittest` module was greatly enhanced; many new features were added. Most of these features were implemented by Michael Foord, unless otherwise noted. The enhanced version of the module is downloadable separately for use with Python versions 2.4 to 2.6, packaged as the `unittest2` package, from unittest2.

When used from the command line, the module can automatically discover tests. It’s not as fancy as py.test or nose, but provides a simple way to run tests kept within a set of package directories. For example, the following command will search the `test/` subdirectory for any importable test files named `test*.py`:

    python -m unittest discover -s test

Щоб дізнатися більше, зверніться до документації модуля `unittest`. (Розроблено в bpo-6001.)

Функція `main()` підтримує деякі інші нові параметри:

- `-b` або `--buffer` буферизує стандартний вихід і стандартні потоки помилок під час кожного тесту. Якщо тест пройдено, будь-які отримані результати будуть відхилені; у разі помилки буде відображено буферизований вихід.

- `-c` або `--catch` призведе до того, що переривання control-C оброблятиметься більш витончено. Замість негайного переривання процесу тестування поточний тест буде завершено, а потім буде повідомлено про часткові результати до моменту переривання. Якщо ви нетерплячі, повторне натискання Control-C призведе до негайної перерви.

  Цей обробник control-C намагається уникнути проблем, коли код, що тестується, або тести, що виконуються, визначили власний обробник сигналу, помічаючи, що обробник сигналу вже встановлено, і викликає його. Якщо це не працює для вас, є декоратор `removeHandler()`, який можна використовувати для позначення тестів, для яких слід вимкнено обробку control-C.

- `-f` або `--failfast` негайно припиняє виконання тесту, коли тест не вдається, замість того, щоб продовжувати виконання подальших тестів. (Запропоновано Кліффом Даєром і реалізовано Майклом Фордом; bpo-8074.)

Повідомлення про перебіг тепер показують «x» для очікуваних помилок і «u» для неочікуваних успіхів під час запуску в докладному режимі. (Надав Бенджамін Петерсон.)

Тестові випадки можуть викликати виключення `SkipTest`, щоб пропустити тест (bpo-1034053).

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

Метод `assertRaises()` тепер повертає обробник контексту під час виклику без надання об’єкта для запуску. Наприклад, ви можете написати це:

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

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

Тепер підтримуються пристрої налаштування та демонтажу на рівні модуля та класу. Модулі можуть містити функції `setUpModule()` і `tearDownModule()`. Класи можуть мати методи `setUpClass()` і `tearDownClass()`, які мають бути визначені як методи класу (використовуючи `@classmethod` або еквівалент). Ці функції та методи викликаються, коли виконавець тесту перемикається на тестовий приклад в іншому модулі чи класі.

Додано методи `addCleanup()` і `doCleanups()`. `addCleanup()` дозволяє додавати функції очищення, які будуть викликані безумовно (після `setUp()`, якщо `setUp()` не вдається, інакше після `tearDown()`). Це дозволяє набагато простіше розподіляти та звільняти ресурси під час тестування (bpo-5679).

Було додано ряд нових методів, які забезпечують більш спеціалізовані тести. Багато з цих методів були написані інженерами Google для використання в їхніх наборах тестів; Грегорі П. Сміт, Майкл Форд і GvR працювали над їх об’єднанням у версію Python `unittest`.

- `assertIsNone()` і `assertIsNotNone()` беруть один вираз і перевіряють, чи є результат `None`.

- `assertIs()` і `assertIsNot()` приймають два значення та перевіряють, чи обидва значення обчислюються для одного об’єкта чи ні. (Додав Майкл Форд; bpo-2578.)

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

- `assertGreater()`, `assertGreaterEqual()`, `assertLess()`, and `assertLessEqual()` порівнюють два значення.

- `assertMultiLineEqual()` порівнює два рядки, і якщо вони не рівні, відображає корисне порівняння, яке підкреслює відмінності в двох рядках. Це порівняння тепер використовується за замовчуванням, коли рядки Unicode порівнюються з `assertEqual()`.

- `assertRegexpMatches()` and `assertNotRegexpMatches()` checks whether the first argument is a string matching or not matching the regular expression provided as the second argument (bpo-8038).

- `assertRaisesRegexp()` checks whether a particular exception is raised, and then also checks that the string representation of the exception matches the provided regular expression.

- `assertIn()` і `assertNotIn()` перевіряє, чи є first у second чи ні.

- `assertItemsEqual()` tests whether two provided sequences contain the same elements.

- `assertSetEqual()` порівнює, чи рівні два набори, і повідомляє про відмінності між наборами лише в разі помилки.

- Подібним чином `assertListEqual()` і `assertTupleEqual()` порівнюють вказані типи та пояснюють будь-які відмінності, не обов’язково друкуючи їхні повні значення; ці методи тепер використовуються за замовчуванням під час порівняння списків і кортежів за допомогою `assertEqual()`. Загалом, `assertSequenceEqual()` порівнює дві послідовності та за бажанням може перевірити, чи обидві послідовності належать до певного типу.

- `assertDictEqual()` compares two dictionaries and reports the differences; it’s now used by default when you compare two dictionaries using `assertEqual()`. `assertDictContainsSubset()` checks whether all of the key/value pairs in first are found in second.

- `assertAlmostEqual()` and `assertNotAlmostEqual()` test whether first and second are approximately equal. This method can either round their difference to an optionally specified number of places (the default is 7) and compare it to zero, or require the difference to be smaller than a supplied delta value.

- `loadTestsFromName()` належним чином враховує атрибут `suiteClass` `TestLoader`. (Виправлено Марком Родді; bpo-6866.)

- Новий хук дозволяє розширити метод `assertEqual()` для обробки нових типів даних. Метод `addTypeEqualityFunc()` приймає об’єкт типу та функцію. Функція буде використана, якщо обидва порівнювані об’єкти належать до вказаного типу. Ця функція має порівняти два об’єкти та викликати виключення, якщо вони не збігаються; доцільно, щоб функція надавала додаткову інформацію про те, чому два об’єкти не збігаються, подібно до нових методів порівняння послідовностей.

`unittest.main()` тепер приймає додатковий аргумент `вихід`. Якщо 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)

  Errors in parsing XML now raise a `ParseError` exception, whose instances have a `position` attribute containing a (line, column) tuple giving the location of the problem.

- ElementTree’s code for converting trees to a string has been significantly reworked, making it roughly twice as fast in many cases. The `ElementTree.write()` and `Element.write()` methods now have a method parameter that can be «xml» (the default), «html», or «text». HTML mode will output empty elements as `<empty></empty>` instead of `<empty/>`, and text mode will skip over elements and only output the text chunks. If you set the `tag` attribute of an element to `None` but leave its children in place, the element will be omitted when the tree is written out, so you don’t need to do more extensive rearrangement to remove a single element.

  Namespace handling has also been improved. All `xmlns:<whatever>` declarations are now output on the root element, not scattered throughout the resulting XML. You can set the default namespace for a tree by setting the `default_namespace` attribute and can register new prefixes with `register_namespace()`. In XML mode, you can use the true/false xml_declaration parameter to suppress the XML declaration.

- Новий метод `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)

- New `Element` method: `iter()` yields the children of the element as a generator. It’s also possible to write `for child in elem:` to loop over an element’s children. The existing method `getiterator()` is now deprecated, as is `getchildren()` which constructs and returns a list of children.

- New `Element` method: `itertext()` yields all chunks of text that are descendants of the element. For example:

      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 не є None`.

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

## Зміни збірки та C API

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

- The latest release of the GNU Debugger, GDB 7, can be scripted using Python. When you begin debugging an executable program P, GDB will look for a file named `P-gdb.py` and automatically read it. Dave Malcolm contributed a `python-gdb.py` that adds a number of commands useful when debugging Python itself. For example, `py-up` and `py-down` go up or down one Python stack frame, which usually corresponds to several C stack frames. `py-print` prints the value of a Python variable, and `py-bt` prints the Python stack trace. (Added as a result of bpo-8032.)

- Якщо ви використовуєте файл `.gdbinit`, що надається разом з Python, макрос «pyo» у версії 2.7 тепер працює правильно, коли потік, який налагоджується, не містить GIL; тепер макрос отримує його перед друком. (Надав Віктор Стіннер; bpo-3632.)

- `Py_AddPendingCall()` тепер потокобезпечний, дозволяючи будь-якому робочому потоку надсилати сповіщення до основного потоку Python. Це особливо корисно для асинхронних операцій введення-виведення. (Надав Крістіян Валур Йонссон; bpo-4293.)

- New function: `PyCode_NewEmpty()` creates an empty code object; only the filename, function name, and first line number are required. This is useful for extension modules that are attempting to construct a more useful traceback stack. Previously such extensions needed to call `PyCode_New()`, which had many more arguments. (Added by Jeffrey Yasskin.)

- Нова функція: `PyErr_NewExceptionWithDoc()` створює новий клас винятків, як і існуючий `PyErr_NewException()`, але приймає додатковий аргумент `char *`, що містить рядок документації для нового класу винятків . (Додано «lekma» у системі відстеження помилок Python; bpo-7033.)

- Нова функція: `PyFrame_GetLineNumber()` приймає об’єкт фрейму та повертає номер рядка, який кадр зараз виконує. Раніше коду потрібно було отримати індекс інструкції байт-коду, яка зараз виконується, а потім знайти номер рядка, що відповідає цій адресі. (Додав Джеффрі Яскін.)

- New functions: `PyLong_AsLongAndOverflow()` and `PyLong_AsLongLongAndOverflow()` approximates a Python long integer as a C long or long long. If the number is too large to fit into the output type, an overflow flag is set and returned to the caller. (Contributed by Case Van Horsen; bpo-7528 and bpo-7767.)

- New function: stemming from the rewrite of string-to-float conversion, a new `PyOS_string_to_double()` function was added. The old `PyOS_ascii_strtod()` and `PyOS_ascii_atof()` functions are now deprecated.

- New function: `PySys_SetArgvEx()` sets the value of `sys.argv` and can optionally update `sys.path` to include the directory containing the script named by `sys.argv[0]` depending on the value of an updatepath parameter.

  This function was added to close a security hole for applications that embed Python. The old function, `PySys_SetArgv()`, would always update `sys.path`, and sometimes it would add the current directory. This meant that, if you ran an application embedding Python in a directory controlled by someone else, attackers could put a Trojan-horse module in the directory (say, a file named `os.py`) that your application would then import and run.

  If you maintain a C/C++ application that embeds Python, check whether you’re calling `PySys_SetArgv()` and carefully consider whether the application should be using `PySys_SetArgvEx()` with updatepath set to false.

  Security issue reported as CVE 2008-5983; discussed in bpo-5753, and fixed by Antoine Pitrou.

- Нові макроси: файли заголовків Python тепер визначають такі макроси: `Py_ISALNUM`, `Py_ISALPHA`, `Py_ISDIGIT`, `Py_ISLOWER`, `Py_ISSPACE`, `Py_ISUPPER`, `Py_ISXDIGIT`, `Py_TOLOWER` і `Py_TOUPPER`. Усі ці функції є аналогічними стандартним макросам C для класифікації символів, але ігнорують поточні параметри локалі, оскільки в деяких місцях Python потребує аналізу символів у спосіб, незалежний від локалі. (Додав Ерік Сміт; bpo-5793.)

- Removed function: `PyEval_CallObject()` is now only available as a macro. A function version was being kept around to preserve ABI linking compatibility, but that was in 1997; it can certainly be deleted by now. (Removed by Antoine Pitrou; bpo-8276.)

- New format codes: the `PyString_FromFormat()`, `PyString_FromFormatV()`, and `PyErr_Format()` functions now accept `%lld` and `%llu` format codes for displaying C’s long long types. (Contributed by Mark Dickinson; bpo-7228.)

- Змінено складну взаємодію між потоками та розгалуженням процесу. Раніше дочірній процес, створений `os.fork()`, міг вийти з ладу, оскільки дочірній процес створюється лише з одним запущеним потоком, потік, який виконує `os.fork()`. Якби інші потоки утримували блокування, наприклад блокування імпорту Python, під час виконання розгалуження блокування все одно було б позначено як «утримано» в новому процесі. Але в дочірньому процесі ніщо ніколи не зніме блокування, оскільки інші потоки не були репліковані, і дочірній процес більше не зможе виконувати імпорт.

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

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

- The `Py_Finalize()` function now calls the internal `threading._shutdown()` function; this prevents some exceptions from being raised when an interpreter shuts down. (Patch by Adam Olsen; bpo-1722344.)

- When using the `PyMemberDef` structure to define attributes of a type, Python will no longer let you try to delete or set a `T_STRING_INPLACE` attribute.

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

- New configure option: the `--with-system-expat` switch allows building the `pyexpat` module to use the system Expat library. (Contributed by Arfrever Frehtes Taifersar Arahesis; bpo-7609.)

- Новий параметр конфігурації: параметр `--with-valgrind` тепер вимикає розподільник pymalloc, який важко правильно аналізувати детектору помилок пам’яті Valgrind. Таким чином, Valgrind буде краще виявляти витоки пам’яті та перевантаження. (Надав Джеймс Хенстрідж; bpo-2422.)

- Новий параметр конфігурації: тепер ви можете надати порожній рядок `--with-dbmliborder=`, щоб вимкнути всі різні модулі DBM. (Додано Arfrever Frehtes Taifersar Arahesis; bpo-6491.)

- The configure script now checks for floating-point rounding bugs on certain 32-bit Intel chips and defines a `X87_DOUBLE_ROUNDING` preprocessor definition. No code currently uses this definition, but it’s available if anyone wishes to use it. (Added by Mark Dickinson; bpo-2937.)

  configure also now sets a `LDCXXSHARED` Makefile variable for supporting C++ linking. (Contributed by Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)

- Тепер у процесі збирання створюються необхідні файли для підтримки pkg-config. (Надав Клінтон Рой; bpo-3585.)

- Процес збирання тепер підтримує Subversion 1.7. (Надано Arfrever Frehtes Taifersar Arahesis; bpo-6094.)

### Капсули

Python 3.1 додає новий тип даних C, `PyCapsule`, для надання C API до модуля розширення. Капсула, по суті, є власником покажчика C `void *` і доступна як атрибут модуля; наприклад, API модуля `socket` представлено як `socket.CAPI`, а `unicodedata` — `ucnhash_CAPI`. Інші розширення можуть імпортувати модуль, отримати доступ до його словника, щоб отримати об’єкт капсули, а потім отримати покажчик `void *`, який зазвичай вказує на масив покажчиків на різні функції API модуля.

There is an existing data type already used for this, `PyCObject`, but it doesn’t provide type safety. Evil code written in pure Python could cause a segmentation fault by taking a `PyCObject` from module A and somehow substituting it for the `PyCObject` in module B. Capsules know their own name, and getting the pointer requires providing the name:

    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. Зверніться до Надання C API для модуля розширення для отримання додаткової інформації про використання цих об’єктів.

Python 2.7 now uses capsules internally to provide various extension-module APIs, but the `PyCObject_AsVoidPtr()` was modified to handle capsules, preserving compile-time compatibility with the `PyCObject` interface. Use of `PyCObject_AsVoidPtr()` will signal a `PendingDeprecationWarning`, which is silent by default.

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

### Зміни, що стосуються порту: Windows

- The `msvcrt` module now contains some constants from the `crtassem.h` header file: `CRT_ASSEMBLY_VERSION`, `VC_ASSEMBLY_PUBLICKEYTOKEN`, and `LIBRARIES_ASSEMBLY_NAME_PREFIX`. (Contributed by David Cournapeau; bpo-4365.)

- The `_winreg` module for accessing the registry now implements the `CreateKeyEx()` and `DeleteKeyEx()` functions, extended versions of previously supported functions that take several extra arguments. The `DisableReflectionKey()`, `EnableReflectionKey()`, and `QueryReflectionKey()` were also tested and documented. (Implemented by Brian Curtin: bpo-7347.)

- The new `_beginthreadex()` API is used to start threads, and the native thread-local storage functions are now used. (Contributed by Kristján Valur Jónsson; bpo-3582.)

- The `os.kill()` function now works on Windows. The signal value can be the constants `CTRL_C_EVENT`, `CTRL_BREAK_EVENT`, or any integer. The first two constants will send `Control`-`C` and `Control`-`Break` keystroke events to subprocesses; any other value will use the `TerminateProcess()` API. (Contributed by Miki Tebeka; bpo-1220212.)

- Функція `os.listdir()` тепер правильно не працює для порожнього шляху. (Виправлено Хірокадзу Ямамото; bpo-5913.)

- The `mimetypes` module will now read the MIME database from the Windows registry when initializing. (Patch by 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, який використовується системою Python 2.7, що надається Apple, більше не додається до `sys.path` для Python, встановлених користувачем, наприклад із інсталятори python.org. Починаючи з macOS 10.12, Apple змінила конфігурацію системного каталогу site-packages, що могло призвести до збою встановлення компонентів pip, як-от setuptools. Пакети, встановлені для системного Python, більше не будуть надані іншим Python, встановленим користувачами. (bpo-28440)

### Зміни, що стосуються порту: FreeBSD

- FreeBSD 7.1’s `SO_SETFIB` constant, used with the `socket()` methods `getsockopt()`/`setsockopt()` to select an alternate routing table, is now available in the `socket` module. (Added by Kyle VanderBeek; bpo-8235.)

## Інші зміни та виправлення

- Два сценарії тестування, `iobench` і `ccbench`, було додано до каталогу `Tools`. `iobench` вимірює швидкість вбудованих файлових об’єктів вводу/виводу, які повертає `open()` під час виконання різних операцій, а `ccbench` є тестом паралелізму, який намагається виміряти пропускну здатність обчислень, затримка перемикання потоків і пропускна здатність обробки вводу/виводу під час виконання кількох завдань із використанням різної кількості потоків.

- Сценарій `Tools/i18n/msgfmt.py` тепер розуміє форми множини у файлах `.po`. (Виправлено Мартіном фон Льовісом; bpo-5464.)

- When importing a module from a `.pyc` or `.pyo` file with an existing `.py` counterpart, the `co_filename` attributes of the resulting code objects are overwritten when the original filename is obsolete. This can happen if the file has been renamed, moved, or is accessed through different paths. (Patch by Ziga Seilnacht and Jean-Paul Calderone; bpo-1180193.)

- Сценарій `regrtest.py` тепер приймає перемикач `--randseed=`, який приймає ціле число, яке використовуватиметься як випадкове початкове значення для параметра `-r`, який виконує тести у довільному порядку. Параметр `-r` також повідомляє про використане насіння (додано Колліном Вінтером).

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

- Коли модуль `py_compile.py` виконується як сценарій, тепер приймає `'-'` як аргумент, який читатиме стандартний вхід для списку імен файлів, які потрібно скомпілювати. (Надав Пьотр Ожаровський; bpo-8233.)

## Перенесення на Python 2.7

У цьому розділі перераховані раніше описані зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді:

- The `range()` function processes its arguments more consistently; it will now call `__int__()` on non-float, non-integer arguments that are supplied to it. (Fixed by Alexander Belopolsky; bpo-1533.)

- Метод string `format()` змінив стандартну точність, що використовується для чисел з плаваючою комою та комплексних чисел, з 6 знаків після коми на 12, що відповідає точності, яку використовує `str()`. (Змінено Еріком Смітом; bpo-5920.)

- Because of an optimization for the `with` statement, the special methods `__enter__()` and `__exit__()` must belong to the object’s type, and cannot be directly attached to the object’s instance. This affects new-style classes (derived from `object`) and C extension types. (bpo-6101.)

- Due to a bug in Python 2.6, the exc_value parameter to `__exit__()` methods was often the string representation of the exception, not an instance. This was fixed in 2.7, so exc_value will be an instance as expected. (Fixed by Florent Xicluna; bpo-7853.)

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

У стандартній бібліотеці:

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

- Під час використання екземплярів `Decimal` із методом `format()` рядка раніше вирівнювання за замовчуванням було лівим. Це було змінено на вирівнювання за правим краєм, що може змінити вивід ваших програм. (Змінено Марком Дікінсоном; bpo-6857.)

  Порівняння, що включають сигнальне значення NaN (або `sNAN`), тепер сигналізують `InvalidOperation` замість мовчки повертати значення true або false залежно від оператора порівняння. Тихі значення NaN (або `NaN`) тепер можна хешувати. (Виправлено Марком Дікінсоном; bpo-7279.)

- The `xml.etree.ElementTree` library no longer escapes ampersands and angle brackets when outputting an XML processing instruction (which looks like `<?xml-stylesheet href="#style1"?>`) or comment (which looks like `<!-- comment -->`). (Patch by Neil Muller; bpo-2746.)

- The `readline()` method of `StringIO` objects now does nothing when a negative length is requested, as other file-like objects do. (bpo-7348).

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

- Стандартну обробку помилок модуля `tarfile` було змінено, і більше не пригнічуються фатальні помилки. Раніше рівень помилок за замовчуванням був 0, що означало, що помилки призводили лише до запису повідомлення в журнал налагодження, але оскільки журнал налагодження не активовано за замовчуванням, ці помилки залишаються непоміченими. Рівень помилки за замовчуванням тепер становить 1, що викликає виняток у разі виникнення помилки. (Змінено Ларсом Густебелем; bpo-7357.)

- The `urlparse` module’s `urlsplit()` now handles unknown URL schemes in a fashion compliant with RFC 3986: if the URL is of the form `"<something>://..."`, the text before the `://` is treated as the scheme, even if it’s a made-up scheme that the module doesn’t know about. This change may break code that worked around the old behaviour. For example, Python 2.6.4 or 2.5 will return the following:

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

  Python 2.7 (і Python 2.6.5) поверне:

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

  (Python 2.7 фактично створює дещо інший вихід, оскільки він повертає іменований кортеж замість стандартного кортежу.)

Для розширень C:

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

- Use the new `PyOS_string_to_double()` function instead of the old `PyOS_ascii_strtod()` and `PyOS_ascii_atof()` functions, which are now deprecated.

Для програм, які вбудовують Python:

- The `PySys_SetArgvEx()` function was added, letting applications close a security hole when the existing `PySys_SetArgv()` function was used. Check whether you’re calling `PySys_SetArgv()` and carefully consider whether the application should be using `PySys_SetArgvEx()` with updatepath set to false.

## Нові функції, додані до випусків обслуговування Python 2.7

Нові функції можуть бути додані до технічних версій Python 2.7, коли цього справді вимагає ситуація. Будь-які такі доповнення повинні пройти через процес Python Enhancement Proposal і надати переконливий аргумент, чому їх не можна належним чином вирішити, додавши нову функцію виключно до Python 3, або опублікувавши її в індексі пакетів Python.

На додаток до конкретних пропозицій, перелічених нижче, існує загальний виняток, який дозволяє додавати нові попередження `-3` до будь-якої версії обслуговування Python 2.7.

### Дві нові змінні середовища для режиму налагодження

In debug mode, the `[xxx refs]` statistic is not written by default, the `PYTHONSHOWREFCOUNT` environment variable now must also be set. (Contributed by Victor Stinner; bpo-31733.)

When Python is compiled with `COUNT_ALLOC` defined, allocation counts are no longer dumped by default anymore: the `PYTHONSHOWALLOCCOUNT` environment variable must now also be set. Moreover, allocation counts are now dumped into stderr, rather than stdout. (Contributed by Victor Stinner; 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. (Надав Zachary Ware; bpo-21462.)

PEP 466 пов’язані функції, додані в Python 2.7.8:

- `hashlib.pbkdf2_hmac()` було перенесено з Python 3, щоб зробити алгоритм хешування, придатним для безпечного зберігання паролів, загальнодоступним для програм Python 2. (Надав Алекс Гейнор; bpo-21304.)

- OpenSSL 1.0.1h was upgraded for the official Windows installers published on python.org. (Contributed by Zachary Ware in bpo-21671 for 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: Backport securepip (PEP 453) до Python 2.7

PEP 477 схвалює включення модуля PEP 453 securepip і покращеної документації, яку він увімкнув, у випуски обслуговування Python 2.7, які вперше з’явилися у випуску Python 2.7.9.

#### За замовчуванням завантажувальний pip

Новий модуль `ensurepip` (визначений у PEP 453) надає стандартний міжплатформний механізм для завантаження інсталятора pip у інсталяції Python. Версія `pip`, яка входить до Python 2.7.9, є `pip` 1.5.6, і в майбутніх випусках технічного обслуговування 2.7.x оновлюватиметься пакетна версія до останньої версії `pip`, доступної за адресою час створення реліз-кандидата.

За замовчуванням команди `pip`, `pipX` і `pipX.Y` будуть встановлені на всіх платформах (де X.Y означає версію інсталяції Python), а також `pip` Пакет Python і його залежності.

Для CPython source збірок на системах POSIX, команди `make install` і `make altinstall` не завантажують `pip` за замовчуванням. Цю поведінку можна контролювати за допомогою параметрів конфігурації та перевизначати за допомогою параметрів Makefile.

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

As discussed in the PEP, platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager).

#### Зміни в документації

У рамках цієї зміни розділи Installing Python modules і Розповсюдження модулів Python документації були повністю перероблені як короткі документи про початок роботи та FAQ. Більшість пакетної документації тепер переміщено до Python Packaging Authority, який підтримується Python Packaging User Guide і документація окремих проектів.

However, as this migration is currently still incomplete, the legacy versions of those guides remaining available as Building C and C++ Extensions with setuptools and Building C and C++ Extensions with setuptools.

Дивись також

PEP 453 – Явне початкове завантаження pip у інсталяціях Python

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

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

PEP 476 updated `httplib` and modules which use it, such as `urllib2` and `xmlrpclib`, to now verify that the server presents a certificate which is signed by a Certificate Authority in the platform trust store and whose hostname matches the hostname being requested by default, significantly improving security for many applications. This change was made in the Python 2.7.9 release.

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

    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 і попередніх версій. .

For cases where the connection establishment code can’t be modified, but the overall application can be, the new `ssl._https_verify_certificates()` function can be used to adjust the default behaviour at runtime.

### Нова ціль збірки `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.

## Подяки

Автор хотів би подякувати наступним особам за пропозиції, виправлення та допомогу з різними чернетками цієї статті: Ніку Коглану, Філіпу Дженві, Райану Ловетту, Р. Девіду Мюррею, Х’ю Секер-Вокеру.