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

2.6.md

1739 строк · 206.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.0/whatsnew/2.6.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 2.689| Автор: | А. М. Кухлинг (amk at amk.ca) |10| --- | --- |11| Версия: | 3.0.1 |12| Дата: | 14 февраля 2009 |1314В этой статье описываются новые возможности Python 2.6, выпущенного 1 октября 2008 года. График выпуска описан в [**PEP 361**](https://python-all.ru/3.0/whatsnew/2.6.html).1516Главная тема Python 2.6 – подготовка путей миграции на Python 3.0, где язык был существенно переработан. Там, где это возможно, Python 2.6 включает новые возможности и синтаксис из 3.0, оставаясь при этом совместимым с существующим кодом – старые возможности и синтаксис не удаляются. Когда сделать это невозможно, Python 2.6 старается помочь: он добавляет функции совместимости в модуле `future_builtins` и ключ *-3*, который предупреждает об использовании конструкций, ставших недопустимыми в 3.0.1718В стандартную библиотеку добавлено несколько значимых новых пакетов, например модули [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) и [`json`](https://python-all.ru/3.0/library/json.html#module-json), однако новых возможностей, не связанных с Python 3.0, не так много.1920Python 2.6 также содержит ряд улучшений и исправлений ошибок по всему исходному коду. Поиск по журналам изменений показывает, что между Python 2.5 и 2.6 было применено 259 патчей и исправлено 612 ошибок. Обе цифры, вероятно, занижены.2122Эта статья не пытается дать полную спецификацию новых возможностей, а вместо этого предоставляет удобный обзор. За подробностями обращайтесь к документации Python 2.6. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности. По возможности «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.2324## Python 3.02526Цикл разработки версий Python 2.6 и 3.0 был синхронизирован: альфа- и бета-релизы для обеих версий выходили в одни и те же дни. Разработка версии 3.0 повлияла на многие возможности в версии 2.6.2728Python 3.0 – это масштабное перепроектирование Python, которое нарушает совместимость с серией 2.x. Это означает, что существующий код Python потребует некоторой конвертации, чтобы работать на Python 3.0. Однако не все изменения в 3.0 обязательно нарушают совместимость. В тех случаях, когда новые возможности не приводят к нарушению существующего кода, они были перенесены в 2.6 и описаны в этом документе в соответствующих разделах. Некоторые из возможностей, заимствованных из 3.0:2930- Метод [`__complex__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__complex__) для преобразования объектов в комплексное число.31- Альтернативный синтаксис перехвата исключений: `except TypeError as exc`.32- Добавление [`functools.reduce()`](https://python-all.ru/3.0/library/functools.html#functools.reduce) как синонима встроенной функции `reduce()`.3334Python 3.0 добавляет несколько новых встроенных функций и изменяет семантику некоторых существующих. Функции, новые в 3.0, такие как [`bin()`](https://python-all.ru/3.0/library/functions.html#bin), были просто добавлены в Python 2.6, но существующие встроенные функции не менялись; вместо этого модуль `future_builtins` содержит версии с новой семантикой 3.0. Код, написанный для совместимости с 3.0, может использовать `from future_builtins import hex, map` по мере необходимости.3536Новый ключ командной строки *-3* включает предупреждения об особенностях, которые будут удалены в Python 3.0. Запустив код с этим ключом, можно оценить, сколько работы потребуется для переноса кода на 3.0. Значение этого ключа доступно в коде Python как логическая переменная `sys.py3kwarning`, а в C-расширениях – как `Py_Py3kWarningFlag`.3738> **См. также**39>40> Серия PEP 3xxx, содержащая предложения для Python 3.0. [**PEP 3000**](https://python-all.ru/3.0/whatsnew/2.6.html) описывает процесс разработки Python 3.0. Начните с [**PEP 3100**](https://python-all.ru/3.0/whatsnew/2.6.html), который описывает общие цели Python 3.0, а затем изучите PEP с более высокими номерами, предлагающие конкретные функции.4142## Изменения в процессе разработки4344Во время разработки 2.6 процесс разработки Python претерпел два существенных изменения: мы перешли с системы отслеживания ошибок SourceForge на настраиваемую установку Roundup, а документация была преобразована из LaTeX в reStructuredText.4546### Новая система отслеживания ошибок: Roundup4748Долгое время разработчики Python были всё более недовольны системой отслеживания ошибок SourceForge. Решение SourceForge, предоставляемое как услуга, не допускает значительной настройки; например, невозможно было настроить жизненный цикл задач.4950Поэтому комитет по инфраструктуре Python Software Foundation объявил конкурс на системы отслеживания ошибок, попросив добровольцев настроить различные продукты и импортировать некоторые ошибки и патчи из SourceForge. Были рассмотрены четыре различные системы: [Jira](https://python-all.ru/3.0/whatsnew/2.6.html), [Launchpad](https://python-all.ru/3.0/whatsnew/2.6.html), [Roundup](https://python-all.ru/3.0/whatsnew/2.6.html) и [Trac](https://python-all.ru/3.0/whatsnew/2.6.html). В конечном итоге комитет остановился на Jira и Roundup как на двух кандидатах. Jira – коммерческий продукт, который бесплатно предоставляет размещённые экземпляры для проектов свободного программного обеспечения; Roundup – проект с открытым исходным кодом, требующий добровольцев для его администрирования и сервера для его размещения.5152После публикации призыва добровольцев новая установка Roundup была развернута на [http://bugs.python.org](https://python-all.ru/3.0/whatsnew/2.6.html). Одна установка Roundup может обслуживать несколько трекеров, и этот сервер теперь также размещает трекеры задач для Jython и веб-сайта Python. В будущем он, безусловно, найдет и другие применения. Там, где это возможно, в этом выпуске «Что нового в Python» приводятся ссылки на соответствующие элементы ошибок/патчей для каждого изменения.5354Хостинг для баг-трекера Python любезно предоставлен компанией [Upfront Systems](https://python-all.ru/3.0/whatsnew/2.6.html) из Стелленбоша, ЮАР. Мартин фон Лёвис проделал большую работу по импорту существующих ошибок и патчей из SourceForge; его скрипты для этой операции находятся по адресу [http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.0/whatsnew/2.6.html) и могут быть полезны другим проектам, желающим перейти с SourceForge на Roundup.5556> **См. также**57>58> **[http://bugs.python.org](https://python-all.ru/3.0/whatsnew/2.6.html)**59>60> Система отслеживания ошибок Python.61>62> **[http://bugs.jython.org](https://python-all.ru/3.0/whatsnew/2.6.html):**63>64> Система отслеживания ошибок Jython.65>66> **[http://roundup.sourceforge.net/](https://python-all.ru/3.0/whatsnew/2.6.html)**67>68> Загрузки и документация Roundup.69>70> **[http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.0/whatsnew/2.6.html)**71>72> Скрипты конвертации Мартина фон Лёвиса.7374### Новый формат документации: reStructuredText с использованием Sphinx7576Документация Python писалась с использованием LaTeX с момента запуска проекта около 1989 года. В 1980-х и начале 1990-х большинство документации распечатывалось для последующего изучения, а не просматривалось онлайн. LaTeX широко использовался, поскольку он обеспечивал привлекательный печатный вывод, оставаясь при этом простым в написании после освоения основных правил разметки.7778Сегодня LaTeX всё ещё используется для написания публикаций, предназначенных для печати, но ландшафт инструментов программирования изменился. Мы больше не распечатываем кипы документации; вместо этого мы просматриваем её онлайн, и HTML стал самым важным форматом для поддержки. К сожалению, конвертация LaTeX в HTML довольно сложна, и Фред Л. Дрейк-младший, многолетний редактор документации Python, потратил много времени на поддержание процесса конвертации. Время от времени предлагали перевести документацию в SGML, а затем в XML, но выполнить хорошую конвертацию – большая задача, и никто не взял на себя необходимое для завершения работы время.7980В ходе цикла разработки 2.6 Георг Брандль вложил много усилий в создание нового инструментария для обработки документации. Получившийся пакет называется Sphinx и доступен по адресу [http://sphinx.pocoo.org/](https://python-all.ru/3.0/whatsnew/2.6.html).8182Sphinx ориентируется на вывод HTML, создавая привлекательно оформленный и современный HTML; печатный вывод по-прежнему поддерживается через конвертацию в LaTeX. Входной формат – reStructuredText, синтаксис разметки с поддержкой пользовательских расширений и директив, широко используемый в сообществе Python.8384Sphinx – это самостоятельный пакет, который можно использовать для написания документации, и почти два десятка других проектов ([перечислены на веб-сайте Sphinx](https://python-all.ru/3.0/whatsnew/2.6.html)) приняли Sphinx в качестве своего инструмента документирования.8586> **См. также**87>88> **[*Документирование Python*](https://python-all.ru/3.0/documenting/index.html#documenting-index)**89>90> Описывает, как писать документацию для Python.91>92> **[Sphinx](https://python-all.ru/3.0/whatsnew/2.6.html)**93>94> Документация и код для инструментария Sphinx.95>96> **[Docutils](https://python-all.ru/3.0/whatsnew/2.6.html)**97>98> Базовый парсер reStructuredText и набор инструментов.99100## PEP 343: Оператор ‘with’101102В предыдущей версии, Python 2.5, оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ был добавлен как опциональная возможность, включаемая директивой `from __future__ import with_statement`. В версии 2.6 этот оператор больше не требует специального включения, то есть [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) теперь всегда является ключевым словом. Остальная часть раздела представляет собой копию соответствующего раздела из документа «Что нового в Python 2.5»; если вы знакомы с оператором ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ из Python 2.5, этот раздел можно пропустить.103104Инструкция ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ делает код понятнее: ранее для гарантии выполнения кода очистки приходилось использовать блоки `try...finally`. В этом разделе я расскажу о том, как обычно используется эта инструкция. В следующем разделе я рассмотрю детали реализации и покажу, как создавать объекты для работы с этой инструкцией.105106Оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ – это управляющая конструкция, имеющая следующую базовую структуру:107108```python109with expression [as variable]:110    with-block111```112113Выражение вычисляется и должно дать объект, поддерживающий протокол управления контекстом (то есть имеющий методы [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__)).114115Метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) объекта вызывается до выполнения *блока with* и, следовательно, может выполнить код настройки. Он также может возвращать значение, которое при наличии *переменной* привязывается к этому имени. (Обратите внимание: *variable* – это *не* результат вычисления *expression*.)116117После завершения выполнения *блока with* вызывается метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) объекта, даже если блок возбудил исключение, и поэтому может выполнить код очистки.118119Некоторые стандартные объекты Python теперь поддерживают протокол управления контекстом и могут использоваться с инструкцией ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘. Файловые объекты – один из примеров:120121```python122with open('/etc/passwd', 'r') as f:123    for line in f:124        print line125        ... more processing code ...126```127128После выполнения этой инструкции файловый объект *f* будет автоматически закрыт, даже если цикл [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) возбудил исключение где-то посередине блока.129130> **Примечание**131>132> В этом случае *f* – это тот же объект, созданный [`open()`](https://python-all.ru/3.0/library/functions.html#open), поскольку `file.__enter__()` возвращает *self*.133134Блокировки и переменные условия модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) также поддерживают инструкцию ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘:135136```python137lock = threading.Lock()138with lock:139    # Критическая секция кода140    ...141```142143Блокировка захватывается перед выполнением блока и всегда освобождается после завершения блока.144145Функция `localcontext()` в модуле [`decimal`](https://python-all.ru/3.0/library/decimal.html#module-decimal) упрощает сохранение и восстановление текущего десятичного контекста, который задаёт желаемую точность и правила округления для вычислений:146147```python148from decimal import Decimal, Context, localcontext149150# Отображается с точностью по умолчанию в 28 знаков151v = Decimal('578')152print v.sqrt()153154with localcontext(Context(prec=16)):155    # Весь код в этом блоке использует точность в 16 знаков.156    # Исходный контекст восстанавливается при выходе из блока.157    print v.sqrt()158```159160### Написание контекстных менеджеров161162Внутреннее устройство инструкции ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ довольно сложное. Большинство людей будут использовать ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ только вместе с существующими объектами и не нуждаются в знании этих деталей, поэтому можно пропустить остальную часть этого раздела, если захочется. Авторам новых объектов потребуется разобраться в деталях реализации и стоит продолжить чтение.163164Объяснение протокола управления контекстом на высоком уровне:165166- Выражение вычисляется и должно дать объект, называемый «менеджер контекста». Менеджер контекста должен иметь методы [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__).167- Вызывается метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) менеджера контекста. Возвращённое значение присваивается *VAR*. Если конструкция `as VAR` отсутствует, значение просто игнорируется.168- Код внутри *блока* выполняется.169- Если в блоке *BLOCK* возникает исключение, вызывается метод `__exit__(type, value, traceback)()` с деталями исключения – теми же значениями, которые возвращает [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info). Возвращаемое значение метода определяет, будет ли исключение проброшено заново: любое ложное значение приводит к повторному возбуждению, а `True` – к его подавлению. Подавлять исключение нужно лишь в редких случаях, поскольку если это сделать, автор кода, содержащего оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘, никогда не узнает, что что-то пошло не так.170- Если *BLOCK* не возбудил исключение, метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) всё равно вызывается, но *type*, *value* и *traceback* равны `None`.171172Рассмотрим пример. Мы не будем приводить подробный код, а лишь в общих чертах опишем методы, необходимые для базы данных, поддерживающей транзакции.173174(Для тех, кто не знаком с терминологией баз данных: набор изменений в базе данных группируется в транзакцию. Транзакции могут быть либо зафиксированы (committed) – это означает, что все изменения записаны в базу данных, либо откачены (rolled back) – что означает, что все изменения отменены, а база данных не изменена. За дополнительной информацией обращайтесь к любому учебнику по базам данных.)175176Предположим, что существует объект, представляющий подключение к базе данных. Наша цель – позволить пользователю написать такой код:177178```python179db_connection = DatabaseConnection()180with db_connection as cursor:181    cursor.execute('insert into ...')182    cursor.execute('delete from ...')183    # ... дополнительные операции ...184```185186Транзакция должна быть зафиксирована, если код в блоке выполняется без ошибок, или откатана при возникновении исключения. Вот базовый интерфейс для `DatabaseConnection`, который я буду предполагать:187188```python189class DatabaseConnection:190    # Интерфейс базы данных191    def cursor(self):192        "Returns a cursor object and starts a new transaction"193    def commit(self):194        "Commits current transaction"195    def rollback(self):196        "Rolls back current transaction"197```198199Метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) довольно прост: ему нужно только начать новую транзакцию. Для данного приложения результирующий объект курсора был бы полезен, поэтому метод будет возвращать его. Затем пользователь может добавить `as cursor` в свою инструкцию ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘, чтобы привязать курсор к имени переменной.200201```python202class DatabaseConnection:203    ...204    def __enter__(self):205        # Code to start a new transaction206        cursor = self.cursor()207        return cursor208```209210Метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) самый сложный, потому что в нём должна выполняться основная работа. Метод должен проверить, произошло ли исключение. Если исключения не было, транзакция фиксируется. Если было исключение, транзакция откатывается.211212В приведённом ниже коде выполнение просто дойдёт до конца функции, вернув значение по умолчанию `None`. `None` – ложное значение, поэтому исключение будет автоматически возбуждено повторно. При желании можно сделать это явнее и добавить оператор [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return) в отмеченном месте.213214```python215class DatabaseConnection:216    ...217    def __exit__(self, type, value, tb):218        if tb is None:219            # No exception, so commit220            self.commit()221        else:222            # Exception occurred, so rollback.223            self.rollback()224            # return False225```226227### Модуль contextlib228229Модуль [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib) предоставляет несколько функций и декоратор, которые полезны при написании объектов для использования с оператором '[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)'.230231Декоратор называется `contextmanager()` и позволяет написать одну функцию-генератор вместо определения нового класса. Генератор должен выдать ровно одно значение. Код до [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) выполняется как метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__), а возвращаемое значение yield становится значением, которое будет связано с переменной в предложении [`as`](https://python-all.ru/3.0/reference/compound_stmts.html#with) оператора ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#as)‘ (если оно есть). Код после [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) выполняется в методе [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__). Любое исключение, возникшее в блоке, будет возбуждено оператором [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield).232233Используя этот декоратор, наш пример с базой данных из предыдущего раздела можно было бы записать так:234235```python236from contextlib import contextmanager237238@contextmanager239def db_transaction(connection):240    cursor = connection.cursor()241    try:242        yield cursor243    except:244        connection.rollback()245        raise246    else:247        connection.commit()248249db = DatabaseConnection()250with db_transaction(db) as cursor:251    ...252```253254В модуле [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib) также есть функция `nested(mgr1, mgr2, ...)()`, которая объединяет несколько менеджеров контекста, чтобы не писать вложенные операторы ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘. В этом примере один оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ одновременно начинает транзакцию базы данных и захватывает блокировку потока:255256```python257lock = threading.Lock()258with nested (db_transaction(db), lock) as (cursor, locked):259    ...260```261262Наконец, функция `closing(object)()` возвращает *object*, чтобы его можно было привязать к переменной, и вызывает `object.close` в конце блока.263264```python265import urllib, sys266from contextlib import closing267268with closing(urllib.urlopen('http://www.yahoo.com')) as f:269    for line in f:270        sys.stdout.write(line)271```272273> **См. также**274>275> **[**PEP 343**](https://python-all.ru/3.0/whatsnew/2.6.html) – Оператор «with»**276>277> PEP написан Гвидо ван Россумом и Ником Когланом; реализован Майком Блэндом, Гвидо ван Россумом и Нилом Норвицем. В PEP показан код, генерируемый для оператора ‘278>279> [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)280>281> ‘, что может быть полезно для понимания его работы.282>283> Документация к модулю [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib).284285## PEP 366: Явные относительные импорты из главного модуля286287Опция [*-m*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-m) в Python позволяет запускать модуль как сценарий. При запуске модуля, находящегося внутри пакета, относительные импорты работали некорректно.288289Исправление для Python 2.6 добавляет атрибут `__package__` к модулям. Если этот атрибут присутствует, относительные импорты будут выполняться относительно значения этого атрибута, а не атрибута `__name__`.290291Импортеры в стиле PEP 302 могут затем устанавливать `__package__` по мере необходимости. Модуль [`runpy`](https://python-all.ru/3.0/library/runpy.html#module-runpy), реализующий флаг [*-m*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-m), теперь делает это, так что относительные импорты теперь будут правильно работать в скриптах, запускаемых изнутри пакета.292293## PEP 370: Персональный каталог `site-packages`294295При запуске Python пути поиска модулей `sys.path` обычно включает каталог, путь которого заканчивается на `"site-packages"`. Этот каталог предназначен для хранения локально установленных пакетов, доступных всем пользователям машины или конкретной установки.296297Python 2.6 вводит соглашение о каталогах site, специфичных для пользователя. Каталог зависит от платформы:298299- Unix и Mac OS X: `~/.local/`300- Windows: `%APPDATA%/Python`301302Внутри этого каталога будут подкаталоги, специфичные для версий, такие как `lib/python2.6/site-packages` в Unix/Mac OS и `Python26/site-packages` в Windows.303304If you don’t like the default directory, it can be overridden by an environment variable. [**PYTHONUSERBASE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONUSERBASE) sets the root directory used for all Python versions supporting this feature. On Windows, the directory for application-specific data can be changed by setting the **APPDATA** environment variable. You can also modify the `site.py` file for your Python installation.305306Эту возможность можно полностью отключить, запустив Python с ключом [*-s*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-s) или установив переменную окружения [**PYTHONNOUSERSITE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONNOUSERSITE).307308> **См. также**309>310> **[**PEP 370**](https://python-all.ru/3.0/whatsnew/2.6.html) – Персональный каталог `site-packages`**311>312> PEP написан и реализован Кристианом Хеймсом.313314## PEP 371: Пакет `multiprocessing`315316Новый пакет [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) позволяет программам Python создавать новые процессы, которые будут выполнять вычисления и возвращать результат родительскому процессу. Родительский и дочерние процессы могут общаться с помощью очередей и каналов, синхронизировать свои операции с помощью блокировок и семафоров, а также могут совместно использовать простые массивы данных.317318Модуль [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) изначально был точной эмуляцией модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading), использующей процессы вместо потоков. Эта цель была отброшена на пути к Python 2.6, но общий подход модуля остаётся похожим. Основным классом является `Process`, которому передаётся вызываемый объект и набор аргументов. Метод `start()` запускает вызываемый объект в подпроцессе, после чего можно вызвать метод `is_alive()`, чтобы проверить, работает ли ещё подпроцесс, и метод `join()`, чтобы дождаться завершения процесса.319320Вот простой пример, где подпроцесс вычисляет факториал. Функция, выполняющая вычисление, написана так, что она работает значительно дольше, когда входной аргумент кратен 4.321322```python323import time324from multiprocessing import Process, Queue325326def factorial(queue, N):327    "Compute a factorial."328    # If N is a multiple of 4, this function will take much longer.329    if (N % 4) == 0:330        time.sleep(.05 * N/4)331332    # Calculate the result333    fact = 1L334    for i in range(1, N+1):335        fact = fact * i336337    # Put the result on the queue338    queue.put(fact)339340if __name__ == '__main__':341    queue = Queue()342343    N = 5344345    p = Process(target=factorial, args=(queue, N))346    p.start()347    p.join()348349    result = queue.get()350    print 'Factorial', N, '=', result351```352353`очередь` используется для передачи входного параметра *N* и результата. Объект `очередь` хранится в глобальной переменной. Дочерний процесс использует значение переменной, которое было на момент его создания; поскольку это `очередь`, родительский и дочерний процессы могут общаться через этот объект. (Если бы родительский процесс изменил значение глобальной переменной, значение дочернего процесса осталось бы неизменным, и наоборот.)354355Два других класса, `Pool` и `Manager`, предоставляют интерфейсы более высокого уровня. `Pool` создаёт фиксированное количество рабочих процессов, и затем запросы могут быть распределены между рабочими процессами вызовом `apply()` или `apply_async()` для добавления одного запроса, и [`map()`](https://python-all.ru/3.0/library/functions.html#map) или `map_async()` для добавления нескольких запросов. Следующий код использует `Pool` для распределения запросов между 5 рабочими процессами и получения списка результатов:356357```python358from multiprocessing import Pool359360def factorial(N, dictionary):361    "Compute a factorial."362    ...363p = Pool(5)364result = p.map(factorial, range(1, 1000, 10))365for v in result:366    print v367```368369Это даёт следующий вывод:370371```python37213733991680037451090942171709440000375822283865417792281772556288000000037633452526613163807108170062053440751665152000000000377...378```379380Другой интерфейс высокого уровня, класс `Manager`, создаёт отдельный серверный процесс, который может хранить главные копии структур данных Python. Другие процессы могут затем обращаться к этим структурам данных и изменять их с помощью прокси-объектов. Следующий пример создаёт общий словарь вызовом метода [`dict()`](https://python-all.ru/3.0/library/stdtypes.html#dict); затем рабочие процессы вставляют значения в словарь. (Блокировка не выполняется автоматически, что в этом примере не важно. Методы `Manager` также включают `Lock()`, `RLock()` и `Semaphore()` для создания общих блокировок.)381382```python383import time384from multiprocessing import Pool, Manager385386def factorial(N, dictionary):387    "Compute a factorial."388    # Calculate the result389    fact = 1L390    for i in range(1, N+1):391        fact = fact * i392393    # Store result in dictionary394    dictionary[N] = fact395396if __name__ == '__main__':397    p = Pool(5)398    mgr = Manager()399    d = mgr.dict()         # Create shared dictionary400401    # Run tasks using the pool402    for N in range(1, 1000, 10):403        p.apply_async(factorial, (N, d))404405# Mark pool as closed -- no more tasks can be added.406p.close()407408# Wait for tasks to exit409p.join()410411# Output results412for k, v in sorted(d.items()):413    print k, v414```415416Это выведет следующий результат:417418```python4191 142011 3991680042121 5109094217170944000042231 822283865417792281772556288000000042341 3345252661316380710817006205344075166515200000000042451 15511187532873822802242430164693032110632597200169861120000...425```426427> **См. также**428>429> Документация для модуля [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing).430>431> **[**PEP 371**](https://python-all.ru/3.0/whatsnew/2.6.html) – Добавление пакета multiprocessing**432>433> PEP написан Джесси Ноллером и Ричардом Удкерком; реализован Ричардом Удкерком и Джесси Ноллером.434435## PEP 3101: Расширенное форматирование строк436437В Python 3.0 оператор *%* дополнен более мощным методом форматирования строк [`format()`](https://python-all.ru/3.0/library/functions.html#format). Поддержка метода [`str.format()`](https://python-all.ru/3.0/library/stdtypes.html#str.format) была перенесена в Python 2.6.438439В версии 2.6 как 8-битные, так и строки Unicode имеют метод *.format()*, который рассматривает строку как шаблон и принимает аргументы для форматирования. Шаблон форматирования использует фигурные скобки (*{*, *}*) в качестве специальных символов:440441```python442>>> # Подставить позиционный аргумент 0 в строку443>>> "User ID: {0}".format("root")444'User ID: root'445>>> # Использовать именованные аргументы-ключевые слова446>>> "User ID: {uid}   Last seen: {last_login}".format(447...    uid="root",448...    last_login = "5 Mar 2008 07:20")449'User ID: root   Last seen: 5 Mar 2008 07:20'450```451452Фигурные скобки можно экранировать, удваивая их:453454```python455>>> "Empty dict: {{}}".format()456"Empty dict: {}"457```458459Имена полей могут быть целыми числами, указывающими на позиционные аргументы, например `{0}`, `{1}` и т.д., или именами именованных аргументов. Также можно указывать составные имена полей, которые читают атрибуты или получают доступ к ключам словаря:460461```python462>>> import sys463>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)464Platform: darwin465Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)466[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'467468>>> import mimetypes469>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)470'Content-type: video/mp4'471```472473Обратите внимание, что при использовании нотации в стиле словаря, например `[.mp4]`, не нужно заключать строку в кавычки; значение будет найдено по ключу `.mp4`. Строки, начинающиеся с цифры, преобразуются в целое число. Внутри строки формата нельзя писать более сложные выражения.474475До сих пор мы показывали, как указать, какое поле подставить в результирующую строку. Точное форматирование также можно контролировать, добавляя двоеточие и спецификатор формата. Например:476477```python478>>> # Поле 0: выравнивание влево, заполнить до 15 символов479>>> # Поле 1: выравнивание вправо, заполнить до 6 символов480>>> fmt = '{0:15} ${1:>6}'481>>> fmt.format('Registration', 35)482'Registration    $    35'483>>> fmt.format('Tutorial', 50)484'Tutorial        $    50'485>>> fmt.format('Banquet', 125)486'Banquet         $   125'487```488489Спецификаторы формата могут ссылаться на другие поля через вложение:490491```python492>>> fmt = '{0:{1}}'493>>> width = 15494>>> fmt.format('Invoice #1234', width)495'Invoice #1234  '496>>> width = 35497>>> fmt.format('Invoice #1234', width)498'Invoice #1234                      '499```500501Выравнивание поля в заданной ширине можно указать:502503| Символ | Эффект |504| --- | --- |505| \< (по умолчанию) | Выравнивание влево |506| \> | Выравнивание вправо |507| ^ | По центру |508| = | (Только для числовых типов) Заполнение после знака. |509510Спецификаторы формата также могут включать тип представления, который управляет форматированием значения. Например, числа с плавающей запятой могут быть отформатированы как обычное число или в экспоненциальной нотации:511512```python513>>> '{0:g}'.format(3.75)514'3.75'515>>> '{0:e}'.format(3.75)516'3.750000e+00'517```518519Доступны различные типы представления. Обратитесь к документации Python 2.6 за [*полным списком*](https://python-all.ru/3.0/library/string.html#formatstrings); вот пример:520521| `b` | Двоичный. Выводит число по основанию 2. |522| --- | --- |523| `c` | Символьный. Преобразует целое число в соответствующий символ Unicode перед выводом. |524| `d` | Десятичное целое. Выводит число в системе с основанием 10. |525| `o` | Восьмеричный формат. Выводит число в системе с основанием 8. |526| `x` | Шестнадцатеричный. Выводит число по основанию 16, используя строчные буквы для цифр старше 9. |527| `e` | Экспоненциальная запись. Выводит число в научной нотации с использованием буквы 'e' для обозначения экспоненты. |528| `g` | Общий формат. Выводит число в формате с фиксированной точкой, если только число не слишком велико, в этом случае переключается на экспоненциальную нотацию 'e'. |529| `n` | Число. Аналогично 'g' (для чисел с плавающей запятой) или 'd' (для целых чисел), но с использованием текущей локали для вставки соответствующих разделителей разрядов. |530| `%` | Проценты. Умножает число на 100 и выводит в фиксированном формате ('f'), с последующим знаком процента. |531532Классы и типы могут определить метод [`__format__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__format__), чтобы управлять тем, как они форматируются. Он получает один аргумент – спецификатор формата:533534```python535def __format__(self, format_spec):536    if isinstance(format_spec, unicode):537        return unicode(str(self))538    else:539        return str(self)540```541542Существует также встроенная функция [`format()`](https://python-all.ru/3.0/library/functions.html#format), которая форматирует одно значение. Она вызывает метод [`__format__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__format__) типа с указанным спецификатором:543544```python545>>> format(75.6564, '.2f')546'75.66'547```548549> **См. также**550>551> **[*Синтаксис строк форматирования*](https://python-all.ru/3.0/library/string.html#formatstrings)**552>553> Справочная документация по полям формата.554>555> **[**PEP 3101**](https://python-all.ru/3.0/whatsnew/2.6.html) - Расширенное форматирование строк**556>557> PEP написан Талином. Реализован Эриком Смитом.558559## PEP 3105: `print` как функция560561Инструкция `print` становится функцией [`print()`](https://python-all.ru/3.0/library/functions.html#print) в Python 3.0. Превращение [`print()`](https://python-all.ru/3.0/library/functions.html#print) в функцию позволяет заменить её, написав `def print(...)` или импортировав новую функцию откуда-то ещё.562563В Python 2.6 есть импорт `__future__`, который удаляет `print` как синтаксис языка, позволяя вместо этого использовать функциональную форму. Например:564565```python566>>> from __future__ import print_function567>>> print('# of entries', len(dictionary), file=sys.stderr)568```569570Сигнатура новой функции:571572```python573def print(*args, sep=' ', end='\n', file=None)574```575576Параметры:577578> - *args*: позиционные аргументы, значения которых будут выведены.579> - *sep*: разделитель, который будет выводиться между аргументами.580> - *end*: завершающий текст, который будет выведен после того, как все аргументы будут выведены.581> - *file*: файловый объект, в который будет отправлен вывод.582583> **См. также**584>585> **[**PEP 3105**](https://python-all.ru/3.0/whatsnew/2.6.html) - Сделать print функцией**586>587> PEP написан Георгом Брандлом.588589## PEP 3110: Изменения в обработке исключений590591Одна ошибка, которую иногда допускают программисты Python, – написание следующего кода:592593```python594try:595    ...596except TypeError, ValueError:  # Неверно!597    ...598```599600Вероятно, автор пытается перехватить исключения [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), но этот код на самом деле делает нечто иное: он перехватывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и связывает полученный объект исключения с локальным именем `"ValueError"`. Исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) не будет перехвачено вовсе. Правильный код указывает кортеж исключений:601602```python603try:604    ...605except (TypeError, ValueError):606    ...607```608609Эта ошибка возникает из-за неоднозначности использования запятой: обозначает ли она два разных узла в дереве разбора или один узел, являющийся кортежем?610611Python 3.0 устраняет эту неоднозначность, заменяя запятую словом «as». Чтобы перехватить исключение и сохранить объект исключения в переменной `exc`, нужно написать:612613```python614try:615    ...616except TypeError as exc:617    ...618```619620Python 3.0 будет поддерживать только использование «as» и, следовательно, интерпретирует первый пример как перехват двух разных исключений. Python 2.6 поддерживает как запятую, так и «as», поэтому существующий код продолжит работать. Поэтому рекомендуется использовать «as» при написании нового кода Python, который будет выполняться только в 2.6.621622> **См. также**623>624> **[**PEP 3110**](https://python-all.ru/3.0/whatsnew/2.6.html) - Перехват исключений в Python 3000**625>626> PEP написан и реализован Коллином Уинтером.627628## PEP 3112: Байтовые литералы629630Python 3.0 принимает Unicode в качестве основного строкового типа языка и обозначает 8-битные литералы иначе: либо как `b'string'`, либо с помощью конструктора [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes). Для обратной совместимости Python 2.6 добавляет [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) как синоним для типа [`str`](https://python-all.ru/3.0/library/functions.html#str), а также поддерживает нотацию `b''`.631632Тип [`str`](https://python-all.ru/3.0/library/functions.html#str) в 2.6 отличается от типа [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) в 3.0 по нескольким параметрам; самое заметное – конструктор совершенно другой. В 3.0 `bytes([65, 66, 67])` состоит из 3 элементов и содержит байты, соответствующие `ABC`; в 2.6 `bytes([65, 66, 67])` возвращает 12-байтовую строку, представляющую результат [`str()`](https://python-all.ru/3.0/library/functions.html#str) от списка.633634Основное применение [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) в Python 2.6 будет заключаться в написании проверок типа объекта, таких как `isinstance(x, bytes)`. Это поможет конвертеру 2to3, который не может определить, предполагается ли в коде 2.x, что строки содержат символы или 8-битные байты; теперь можно использовать либо [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes), либо [`str`](https://python-all.ru/3.0/library/functions.html#str), чтобы точно выразить своё намерение, и полученный код также будет корректен в Python 3.0.635636Существует также импорт `__future__`, который приводит к тому, что все строковые литералы становятся строками Unicode. Это означает, что управляющие последовательности `\u` можно использовать для включения символов Unicode:637638```python639from __future__ import unicode_literals640641s = ('\u751f\u3080\u304e\u3000\u751f\u3054'642     '\u3081\u3000\u751f\u305f\u307e\u3054')643644print len(s)               # 12 Unicode characters645```646647На уровне C Python 3.0 переименует существующий 8-битный строковый тип, называемый в Python 2.x `PyStringObject`, в [`PyBytesObject`](https://python-all.ru/3.0/c-api/bytes.html#PyBytesObject). Python 2.6 использует `#define`, чтобы поддерживать использование имён [`PyBytesObject`](https://python-all.ru/3.0/c-api/bytes.html#PyBytesObject), [`PyBytes_Check`](https://python-all.ru/3.0/c-api/bytes.html#PyBytes_Check), [`PyBytes_FromStringAndSize`](https://python-all.ru/3.0/c-api/bytes.html#PyBytes_FromStringAndSize) и всех остальных функций и макросов, используемых со строками.648649Экземпляры типа [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) неизменяемы, как и строки. Новый тип [`bytearray`](https://python-all.ru/3.0/library/functions.html#bytearray) хранит изменяемую последовательность байтов:650651```python652>>> bytearray([65, 66, 67])653bytearray(b'ABC')654>>> b = bytearray(u'\u21ef\u3244', 'utf-8')655>>> b656bytearray(b'\xe2\x87\xaf\xe3\x89\x84')657>>> b[0] = '\xe3'658>>> b659bytearray(b'\xe3\x87\xaf\xe3\x89\x84')660>>> unicode(str(b), 'utf-8')661u'\u31ef \u3244'662```663664Массивы байтов поддерживают большинство методов строковых типов, таких как `startswith()`/`endswith()`, `find()`/`rfind()`, а также некоторые методы списков, например `append()`, `pop()` и `reverse()`.665666```python667>>> b = bytearray('ABC')668>>> b.append('d')669>>> b.append(ord('e'))670>>> b671bytearray(b'ABCde')672```673674Существует также соответствующий C API с функциями [`PyByteArray_FromObject`](https://python-all.ru/3.0/c-api/bytearray.html#PyByteArray_FromObject), [`PyByteArray_FromStringAndSize`](https://python-all.ru/3.0/c-api/bytearray.html#PyByteArray_FromStringAndSize) и различными другими функциями.675676> **См. также**677>678> **[**PEP 3112**](https://python-all.ru/3.0/whatsnew/2.6.html) - Байтовые литералы в Python 3000**679>680> PEP написан Джейсоном Орендорфом; портирован в 2.6 Кристианом Хаймсом.681682## PEP 3116: Новая библиотека ввода-вывода683684Встроенные файловые объекты Python поддерживают множество методов, но файлоподобные объекты не обязательно поддерживают их все. Объекты, имитирующие файлы, обычно поддерживают `read()` и `write()`, но могут не поддерживать, например, `readline()`. Python 3.0 представляет многоуровневую библиотеку ввода-вывода в модуле [`io`](https://python-all.ru/3.0/library/io.html#module-io), которая разделяет функции буферизации и обработки текста и базовые операции чтения и записи.685686Модуль [`io`](https://python-all.ru/3.0/library/io.html#module-io) предоставляет три уровня абстрактных базовых классов:687688- `RawIOBase` определяет низкоуровневые операции ввода-вывода: `read()`, `readinto()`, `write()`, `seek()`, `tell()`, `truncate()` и `close()`. Большинство методов этого класса обычно отображаются на один системный вызов. Также есть методы `readable()`, `writable()` и `seekable()` для определения того, какие операции разрешены для данного объекта.689690  Python 3.0 имеет конкретные реализации этого класса для файлов и сокетов, но Python 2.6 не перестраивал свои файловые объекты и сокеты таким образом.691- `BufferedIOBase` – это абстрактный базовый класс, который буферизует данные в памяти, чтобы уменьшить количество используемых системных вызовов, делая обработку ввода-вывода более эффективной. Он поддерживает все методы `RawIOBase` и добавляет атрибут `raw`, содержащий базовый низкоуровневый объект.692693  Есть пять конкретных классов, реализующих этот ABC. `BufferedWriter` и `BufferedReader` предназначены для объектов, поддерживающих только запись или только чтение, которые имеют метод `seek()` для произвольного доступа. Объекты `BufferedRandom` поддерживают чтение и запись на одном и том же базовом потоке, а `BufferedRWPair` предназначен для таких объектов, как TTY, которые имеют операции чтения и записи, действующие на несвязанных потоках данных. Класс `BytesIO` поддерживает чтение, запись и позиционирование в буфере в памяти.694- `TextIOBase`: предоставляет функции для чтения и записи строк (помните, что в Python 3.0 строки будут в Юникоде), а также поддержку универсальных символов новой строки. `TextIOBase` определяет метод `readline()` и поддерживает итерацию по объектам.695696  Есть две конкретные реализации. `TextIOWrapper` оборачивает буферизованный объект ввода-вывода, поддерживая все методы для текстового ввода-вывода и добавляя атрибут `buffer` для доступа к базовому объекту. `StringIO` просто буферизует всё в памяти, никогда ничего не записывая на диск.697698  (В Python 2.6 [`io.StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) реализован на чистом Python, поэтому он довольно медленный. Поэтому пока следует придерживаться существующего модуля `StringIO` или `cStringIO`. Рано или поздно модуль [`io`](https://python-all.ru/3.0/library/io.html#module-io) Python 3.0 будет переписан на C для ускорения, и, возможно, реализация на C будет перенесена в версии 2.x.)699700В Python 2.6 базовые реализации не были перестроены, чтобы основываться на классах модуля [`io`](https://python-all.ru/3.0/library/io.html#module-io). Этот модуль предоставляется, чтобы упростить написание кода, совместимого с Python 3.0, и избавить разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.701702> **См. также**703>704> **[**PEP 3116**](https://python-all.ru/3.0/whatsnew/2.6.html) - Новый ввод-вывод**705>706> PEP написан Дэниелом Штуцбахом, Майком Вердоне и Гвидо ван Россумом. Код – Гвидо ван Россум, Георг Брандль, Вальтер Дёрвальд, Джереми Хилтон, Мартин фон Лёвис, Тони Лаундс и другие.707708## PEP 3118: Пересмотренный буферный протокол709710Протокол буфера – это C-уровневый API, который позволяет типам Python обмениваться указателями на свои внутренние представления. Например, файл, отображаемый в память, можно рассматривать как буфер символов, и это позволяет другому модулю, например [`re`](https://python-all.ru/3.0/library/re.html#module-re), обрабатывать такие файлы как строку символов для поиска.711712Основными пользователями буферного протокола являются пакеты для численных расчетов, такие как NumPy, которые предоставляют доступ к внутреннему представлению массивов, чтобы вызывающие могли записывать данные напрямую в массив, а не через более медленный API. Данный PEP обновляет буферный протокол с учетом опыта разработки NumPy, добавляя ряд новых возможностей, таких как указание формы массива или блокировка области памяти.713714Самая важная новая функция C API – это `PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)`, которая принимает объект и набор флагов и заполняет структуру `Py_buffer` информацией о представлении объекта в памяти. Объекты могут использовать эту операцию для блокировки памяти, пока внешний вызывающий код может изменять содержимое, поэтому существует соответствующая функция `PyBuffer_Release(Py_buffer *view)`, чтобы сообщить, что внешний вызывающий код завершил работу.715716Аргумент *flags* функции [`PyObject_GetBuffer`](https://python-all.ru/3.0/c-api/buffer.html#PyObject_GetBuffer) задаёт ограничения на возвращаемую память. Вот несколько примеров:717718> - `PyBUF_WRITABLE` указывает, что память должна быть доступна для записи.719> - `PyBUF_LOCK` запрашивает блокировку только для чтения или исключительную блокировку памяти.720> - `PyBUF_C_CONTIGUOUS` и `PyBUF_F_CONTIGUOUS` запрашивают C-непрерывный (последнее измерение изменяется быстрее всего) или Fortran-непрерывный (первое измерение изменяется быстрее всего) макет массива.721722Два новых кода аргументов для [`PyArg_ParseTuple`](https://python-all.ru/3.0/c-api/arg.html#PyArg_ParseTuple), `s*` и `z*`, возвращают заблокированные буферные объекты для параметра.723724> **См. также**725>726> **[**PEP 3118**](https://python-all.ru/3.0/whatsnew/2.6.html) - Пересмотр буферного протокола**727>728> PEP написан Трэвисом Олифантом и Карлом Бэнксом; реализован Трэвисом Олифантом.729730## PEP 3119: Абстрактные базовые классы731732Некоторые объектно-ориентированные языки, такие как Java, поддерживают интерфейсы, объявляя, что класс имеет заданный набор методов или поддерживает определённый протокол доступа. Абстрактные базовые классы (ABC) – это аналогичная возможность для Python. Поддержка ABC состоит из модуля [`abc`](https://python-all.ru/3.0/library/abc.html#module-abc), содержащего метакласс с именем `ABCMeta`, специальной обработки этого метакласса встроенными функциями [`isinstance()`](https://python-all.ru/3.0/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.0/library/functions.html#issubclass), а также набора базовых ABC, которые разработчики Python считают широко полезными. Будущие версии Python, вероятно, добавят больше ABC.733734Допустим, у вас есть некий класс, и вы хотите узнать, поддерживает ли он доступ в стиле словаря. Однако фраза «стиль словаря» расплывчата. Вероятно, это означает, что доступ к элементам через `obj[1]` работает. Подразумевает ли это, что присваивание элементов через `obj[2] = value` тоже работает? Или что объект будет иметь методы `keys()`, `values()` и `items()`? А итеративные варианты, такие как `iterkeys()`? `copy()` и `update()`? Итерация по объекту с помощью [`iter()`](https://python-all.ru/3.0/library/functions.html#iter)?735736Модуль [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections) в Python 2.6 содержит несколько разных ABC, отражающих эти различия. `Iterable` означает, что класс определяет [`__iter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__iter__), а `Container` – что класс определяет метод [`__contains__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__contains__) и, следовательно, поддерживает выражения `x in y`. Базовый интерфейс словаря – получение и установка элементов, а также `keys()`, `values()` и `items()` – определяется ABC `MutableMapping`.737738Можно наследовать свои классы от конкретной ABC, чтобы указать, что они поддерживают интерфейс этой ABC:739740```python741import collections742743class Storage(collections.MutableMapping):744    ...745```746747В качестве альтернативы можно написать класс без наследования от нужного ABC и вместо этого зарегистрировать класс, вызвав метод `register()` этого ABC:748749```python750import collections751752class Storage:753    ...754755collections.MutableMapping.register(Storage)756```757758Для классов, которые вы пишете, наследование от ABC, вероятно, понятнее. Метод `register()` полезен, когда вы написали новый ABC, который может описать существующий тип или класс, или если вы хотите объявить, что какой-то сторонний класс реализует ABC. Например, если вы определили ABC `PrintableType`, то вполне допустимо сделать так:759760```python761# Зарегистрировать типы Python762PrintableType.register(int)763PrintableType.register(float)764PrintableType.register(str)765```766767Классы должны следовать семантике, заданной ABC, но Python не может это проверить; автор класса должен сам понять требования ABC и реализовать код соответствующим образом.768769Чтобы проверить, поддерживает ли объект определённый интерфейс, можно теперь написать:770771```python772def func(d):773    if not isinstance(d, collections.MutableMapping):774        raise ValueError("Mapping object expected, not %r" % d)775```776777Не думайте, что теперь нужно начинать писать множество проверок, как в примере выше. У Python сложилась сильная традиция утиной типизации, где явная проверка типов никогда не выполняется, а код просто вызывает методы объекта, полагаясь, что эти методы существуют, и возбуждает исключение, если их нет. Будьте осмотрительны при проверке ABC и делайте это только в случае крайней необходимости.778779Можно создавать собственные ABC, используя `abc.ABCMeta` в качестве метакласса в определении класса:780781```python782from abc import ABCMeta, abstractmethod783784class Drawable():785    __metaclass__ = ABCMeta786787    @abstractmethod788    def draw(self, x, y, scale=1.0):789        pass790791    def draw_doubled(self, x, y):792        self.draw(x, y, scale=2.0)793794class Square(Drawable):795    def draw(self, x, y, scale):796        ...797```798799В приведённом выше ABC `Drawable` метод `draw_doubled()` отображает объект в двойном размере и может быть реализован через другие методы, описанные в `Drawable`. Поэтому классам, реализующим этот ABC, не нужно предоставлять собственную реализацию `draw_doubled()`, хотя они могут это сделать. Однако реализация `draw()` обязательна; ABC не может предоставить полезную общую реализацию.800801К методам, которые обязательно должны быть реализованы, можно применить декоратор `@abstractmethod`, например к `draw()`; тогда Python будет возбуждать исключение для классов, не определяющих этот метод. Обратите внимание, что исключение возбуждается только при попытке создать экземпляр подкласса, в котором отсутствует данный метод:802803```python804>>> class Circle(Drawable):805...     pass806...807>>> c = Circle()808Traceback (most recent call last):809  File "<stdin>", line 1, in <module>810TypeError: Can't instantiate abstract class Circle with abstract methods draw811>>>812```813814Абстрактные атрибуты данных можно объявить с помощью декоратора `@abstractproperty`:815816```python817from abc import abstractproperty818...819820@abstractproperty821def readonly(self):822   return self._x823```824825Подклассы затем должны определить свойство [`readonly()`](https://python-all.ru/3.0/c-api/buffer.html#readonly).826827> **См. также**828>829> **[**PEP 3119**](https://python-all.ru/3.0/whatsnew/2.6.html) – Введение абстрактных базовых классов**830>831> PEP написан Гвидо ван Россумом и Талином. Реализован Гвидо ван Россумом. Портирован в 2.6 Бенджамином Арангуреном при участии Алекса Мартелли.832833## PEP 3127: Поддержка и синтаксис целочисленных литералов834835Python 3.0 изменяет синтаксис восьмеричных (основание 8) целочисленных литералов, добавляя префикс «0o» или «0O» вместо ведущего нуля, а также добавляет поддержку двоичных (основание 2) целочисленных литералов с префиксом «0b» или «0B».836837Python 2.6 не отказывается от поддержки ведущего нуля для восьмеричных чисел, но добавляет поддержку «0o» и «0b»:838839```python840>>> 0o21, 2*8 + 1841(17, 17)842>>> 0b10111184347844```845846Встроенная функция [`oct()`](https://python-all.ru/3.0/library/functions.html#oct) по-прежнему возвращает числа с ведущим нулём, а новая встроенная функция [`bin()`](https://python-all.ru/3.0/library/functions.html#bin) возвращает двоичное представление числа:847848```python849>>> oct(42)850'052'851>>> future_builtins.oct(42)852'0o52'853>>> bin(173)854'0b10101101'855```856857Встроенные функции [`int()`](https://python-all.ru/3.0/library/functions.html#int) и `long()` теперь принимают префиксы “0o” и “0b” при запросе основания 8 или 2, или когда аргумент *base* равен нулю (что означает, что используемое основание должно определяться из строки):858859```python860>>> int ('0o52', 0)86142862>>> int('1101', 2)86313864>>> int('0b1101', 2)86513866>>> int('0b1101', 0)86713868```869870> **См. также**871>872> **[**PEP 3127**](https://python-all.ru/3.0/whatsnew/2.6.html) – Поддержка и синтаксис целочисленных литералов**873>874> PEP написан Патриком Мопином; портирован в 2.6 Эриком Смитом.875876## PEP 3129: Декораторы классов877878Декораторы были расширены с функций на классы. Теперь допустимо написать:879880```python881@foo882@bar883class A:884  pass885```886887Это эквивалентно:888889```python890class A:891  pass892893A = foo(bar(A))894```895896> **См. также**897>898> **[**PEP 3129**](https://python-all.ru/3.0/whatsnew/2.6.html) - Декораторы классов**899>900> PEP написан Коллином Уинтером.901902## PEP 3141: Иерархия типов для чисел903904Python 3.0 добавляет несколько абстрактных базовых классов для числовых типов, вдохновлённых числовой башней Scheme. Эти классы были перенесены в Python 2.6 как модуль [`numbers`](https://python-all.ru/3.0/library/numbers.html#module-numbers).905906Самый общий ABC – это `Number`. Он не определяет никаких операций и существует только для того, чтобы можно было проверить, является ли объект числом, с помощью `isinstance(obj, Number)`.907908`Complex` является подклассом `Number`. Комплексные числа поддерживают основные операции сложения, вычитания, умножения, деления и возведения в степень, а также позволяют получить действительную и мнимую части и сопряжённое число. Встроенный комплексный тип Python является реализацией `Complex`.909910`Real` является подклассом `Complex` и добавляет операции, которые работают только с вещественными числами: `floor()`, `trunc()`, округление, взятие остатка по модулю N, целочисленное деление и сравнения.911912Числа `Rational` происходят от `Real`, имеют свойства `numerator` и `denominator` и могут быть преобразованы в числа с плавающей запятой. Python 2.6 добавляет простой класс рациональных чисел `Fraction` в модуле [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions). (Он называется `Fraction`, а не `Rational`, чтобы избежать конфликта имён с [`numbers.Rational`](https://python-all.ru/3.0/library/numbers.html#numbers.Rational).)913914Целые числа `Integral` происходят от `Rational` и могут сдвигаться влево и вправо с помощью `<<` и `>>`, комбинироваться с помощью побитовых операций, таких как `&` и `|`, а также использоваться в качестве индексов массивов и границ срезов.915916В Python 3.0 PEP слегка переопределяет существующие встроенные функции [`round()`](https://python-all.ru/3.0/library/functions.html#round), [`math.floor()`](https://python-all.ru/3.0/library/math.html#math.floor), [`math.ceil()`](https://python-all.ru/3.0/library/math.html#math.ceil) и добавляет новую – [`math.trunc()`](https://python-all.ru/3.0/library/math.html#math.trunc), которая была перенесена в Python 2.6. [`math.trunc()`](https://python-all.ru/3.0/library/math.html#math.trunc) округляет к нулю, возвращая ближайшее `Integral`, которое находится между аргументом функции и нулём.917918> **См. также**919>920> **[**PEP 3141**](https://python-all.ru/3.0/whatsnew/2.6.html) – Иерархия типов для чисел**921>922> PEP написан Джеффри Яскиным.923>924> [Числовая башня Scheme](https://python-all.ru/3.0/whatsnew/2.6.html) из руководства по Guile.925>926> [Типы чисел Scheme](https://python-all.ru/3.0/whatsnew/2.6.html) из спецификации R5RS Scheme.927928### Модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions)929930Чтобы дополнить иерархию числовых типов, модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions) предоставляет класс рациональных чисел. Рациональные числа хранят свои значения в виде числителя и знаменателя, образующих дробь, и могут точно представлять такие числа, как `2/3`, которые числа с плавающей запятой могут лишь аппроксимировать.931932Конструктор `Fraction` принимает два целых значения `Integral`, которые будут числителем и знаменателем результирующей дроби.933934```python935>>> from fractions import Fraction936>>> a = Fraction(2, 3)937>>> b = Fraction(2, 5)938>>> float(a), float(b)939(0.66666666666666663, 0.40000000000000002)940>>> a+b941Fraction(16, 15)942>>> a/b943Fraction(5, 3)944```945946Для преобразования чисел с плавающей запятой в рациональные числа тип float теперь имеет метод `as_integer_ratio()`, который возвращает числитель и знаменатель дроби, равной тому же значению с плавающей запятой:947948```python949>>> (2.5) .as_integer_ratio()950(5, 2)951>>> (3.1415) .as_integer_ratio()952(7074029114692207L, 2251799813685248L)953>>> (1./3) .as_integer_ratio()954(6004799503160661L, 18014398509481984L)955```956957Обратите внимание: значения, которые могут быть лишь аппроксимированы числами с плавающей запятой, например 1./3, не упрощаются до аппроксимируемого числа; дробь пытается соответствовать значению с плавающей запятой **в точности**.958959Модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions) основан на реализации Шурда Мулендера (Sjoerd Mullender), которая долгое время находилась в каталоге `Demo/classes/` в Python. Эта реализация была значительно обновлена Джеффри Яскином (Jeffrey Yasskin).960961## Прочие изменения языка962963Некоторые небольшие изменения, внесённые в ядро языка Python:964965- Функция [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) перехватывала и игнорировала все ошибки, предполагая, что они означают, что метод [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__) каким-то образом не сработал и возвращаемое значение [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) поэтому будет `False`. Однако эту логику не следует применять к [`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt) и [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit); Python 2.6 больше не будет отбрасывать такие исключения, когда [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) сталкивается с ними. (Исправлено Бенджамином Петерсоном (Benjamin Peterson); [issue 2196](https://python-all.ru/3.0/whatsnew/2.6.html).)966- При вызове функции с использованием синтаксиса `**` для передачи именованных аргументов больше не требуется использовать словарь Python; теперь подойдёт любое отображение:967968  ```python969  >>> def f(**kw):970  ...    print sorted(kw)971  ...972  >>> ud=UserDict.UserDict()973  >>> ud['a'] = 1974  >>> ud['b'] = 'string'975  >>> f(**ud)976  ['a', 'b']977  ```978979  (Автор: Александр Белопольский (Alexander Belopolsky); [issue 1686487](https://python-all.ru/3.0/whatsnew/2.6.html).)980981  Также стало разрешено указывать именованные аргументы после аргумента `*args` в вызове функции.982983  ```python984  >>> def f(*args, **kw):985  ...     print args, kw986  ...987  >>> f(1,2,3, *(4,5,6), keyword=13)988  (1, 2, 3, 4, 5, 6) {'keyword': 13}989  ```990991  Раньше это приводило бы к синтаксической ошибке. (Автор: Амори Форжо д’Арк (Amaury Forgeot d’Arc); [issue 3473](https://python-all.ru/3.0/whatsnew/2.6.html).)992- Новая встроенная функция `next(iterator, [default])` возвращает следующий элемент из указанного итератора. Если указан аргумент *default*, то он будет возвращён, если *iterator* исчерпан; в противном случае будет возбуждено исключение [`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration). (Перенесено в [issue 2719](https://python-all.ru/3.0/whatsnew/2.6.html).)993- Теперь кортежи имеют методы `index()` и `count()`, соответствующие методам `index()` и `count()` списков:994995  ```python996  >>> t = (0,1,2,3,4,0,1,2)997  >>> t.index(3)998  3999  >>> t.count(0)1000  21001  ```10021003  (Автор: Рэймонд Хеттингер)1004- Встроенные типы теперь имеют улучшенную поддержку расширенного синтаксиса срезов, принимая различные комбинации `(start, stop, step)`. Раньше поддержка была частичной, и некоторые граничные случаи не работали. (Реализовано Томасом Воутерсом (Thomas Wouters).)1005- Свойства теперь имеют три атрибута: `getter`, `setter` и `deleter`, которые являются декораторами, предоставляющими удобные сокращения для добавления функции чтения, записи или удаления к существующему свойству. Использовать их можно так:10061007  ```python1008  class C(object):1009      @property1010      def x(self):1011          return self._x10121013      @x.setter1014      def x(self, value):1015          self._x = value10161017      @x.deleter1018      def x(self):1019          del self._x10201021  class D(C):1022      @C.x.getter1023      def x(self):1024          return self._x * 210251026      @x.setter1027      def x(self, value):1028          self._x = value / 21029  ```1030- Несколько методов встроенных типов множеств теперь принимают несколько итерируемых объектов: `intersection()`, `intersection_update()`, `union()`, `update()`, `difference()` и `difference_update()`.10311032  ```python1033  >>> s=set('1234567890')1034  >>> s.intersection('abc123', 'cdf246')  # Пересечение всех входных данных1035  set(['2'])1036  >>> s.difference('246', '789')1037  set(['1', '0', '3', '5'])1038  ```10391040  (Автор: Raymond Hettinger.)1041- Добавлено много возможностей для чисел с плавающей запятой. Функция [`float()`](https://python-all.ru/3.0/library/functions.html#float) теперь преобразует строку `nan` в значение IEEE 754 Not A Number, а `+inf` и `-inf` – в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.0/whatsnew/2.6.html).)10421043  Другие функции модуля [`math`](https://python-all.ru/3.0/library/math.html#module-math), `isinf()` и `isnan()`, возвращают true, если их аргумент с плавающей запятой является бесконечным или Not A Number. ([issue 1640](https://python-all.ru/3.0/whatsnew/2.6.html))10441045  Были добавлены функции преобразования чисел с плавающей запятой в шестнадцатеричные строки ([issue 3008](https://python-all.ru/3.0/whatsnew/2.6.html)). Эти функции преобразуют числа с плавающей запятой в строковое представление и обратно, не внося ошибок округления при преобразовании между десятичной и двоичной системами. Числа с плавающей запятой имеют метод [`hex()`](https://python-all.ru/3.0/library/functions.html#hex), возвращающий строковое представление, а метод `float.fromhex()` преобразует строку обратно в число:10461047  ```python1048  >>> a = 3.751049  >>> a.hex()1050  '0x1.e000000000000p+1'1051  >>> float.fromhex('0x1.e000000000000p+1')1052  3.751053  >>> b=1./31054  >>> b.hex()1055  '0x1.5555555555555p-2'1056  ```1057- Числовая тонкость: при создании комплексного числа из двух чисел с плавающей запятой в системах, поддерживающих знаковые нули (-0 и +0), конструктор [`complex()`](https://python-all.ru/3.0/library/functions.html#complex) теперь сохраняет знак нуля. (Исправлено Марком Т. Дикинсоном; [issue 1507](https://python-all.ru/3.0/whatsnew/2.6.html).)1058- Классы, которые наследуют метод [`__hash__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__hash__) от родительского класса, могут установить `__hash__ = None`, чтобы указать, что класс не является хешируемым. Это заставит `hash(obj)` вызывать исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), и класс не будет считаться реализующим ABC `Hashable`.10591060  Это следует делать, когда определён метод `__cmp__()` или [`__eq__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__eq__), который сравнивает объекты по значению, а не по идентичности. Все объекты имеют метод хеширования по умолчанию, использующий `id(obj)` в качестве хеш-значения. Не существует аккуратного способа удалить метод [`__hash__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__hash__), унаследованный от родительского класса, поэтому присваивание `None` было реализовано как переопределение. На уровне C расширения могут установить `tp_hash` в [`PyObject_HashNotImplemented`](https://python-all.ru/3.0/c-api/object.html#PyObject_HashNotImplemented). (Исправлено Ником Когланом и Амари Форжо д’Арк; [issue 2235](https://python-all.ru/3.0/whatsnew/2.6.html).)1061- В интерфейс `исключение` продолжают вноситься изменения, как того требует [**PEP 352**](https://python-all.ru/3.0/whatsnew/2.6.html). В версии 2.6 атрибут `message` объявлен устаревшим в пользу атрибута `args`.1062- Исключение [`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit) теперь наследуется от [`BaseException`](https://python-all.ru/3.0/library/exceptions.html#exceptions.BaseException) вместо [`Exception`](https://python-all.ru/3.0/library/exceptions.html#exceptions.Exception). Это означает, что обработчик исключений вида `except Exception:` не будет случайно перехватывать [`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit). (Предложено Чедом Остином; [issue 1537](https://python-all.ru/3.0/whatsnew/2.6.html).)1063- Объекты-генераторы теперь имеют атрибут `gi_code`, который ссылается на исходный объект кода, лежащий в основе генератора. (Предложено Коллином Уинтером; [issue 1473257](https://python-all.ru/3.0/whatsnew/2.6.html).)1064- Встроенная функция [`compile()`](https://python-all.ru/3.0/library/functions.html#compile) теперь принимает именованные аргументы, а также позиционные параметры. (Предложено Томасом Воутерсом; [issue 1444529](https://python-all.ru/3.0/whatsnew/2.6.html).)1065- Конструктор [`complex()`](https://python-all.ru/3.0/library/functions.html#complex) теперь принимает строки, содержащие комплексные числа в скобках, то есть `complex(repr(cplx))` теперь будет возвращать исходное значение. Например, `complex('(3+4j)')` теперь возвращает значение (3+4j). ([issue 1491866](https://python-all.ru/3.0/whatsnew/2.6.html))1066- Метод строки `translate()` теперь принимает `None` в качестве параметра таблицы перевода, который рассматривается как тождественное преобразование. Это упрощает выполнение операций, которые только удаляют символы. (Предложено Бенгтом Рихтером и реализовано Рэймондом Хеттингером; [issue 1193128](https://python-all.ru/3.0/whatsnew/2.6.html).)1067- Встроенная функция [`dir()`](https://python-all.ru/3.0/library/functions.html#dir) теперь проверяет наличие метода [`__dir__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__dir__) у получаемых объектов. Этот метод должен возвращать список строк, содержащих имена допустимых атрибутов объекта, и позволяет объекту контролировать значение, которое возвращает [`dir()`](https://python-all.ru/3.0/library/functions.html#dir). Объекты, имеющие методы [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattribute__), могут использовать это для рекламирования псевдоатрибутов, которые они будут поддерживать. ([issue 1591665](https://python-all.ru/3.0/whatsnew/2.6.html))1068- Объекты методов экземпляра имеют новые атрибуты для объекта и функции, составляющих метод; новый синоним для `im_self` – это `__self__`, а `im_func` также доступен как `__func__`. Старые имена по-прежнему поддерживаются в Python 2.6, но исчезли в 3.0.1069- An obscure change: when you use the the [`locals()`](https://python-all.ru/3.0/library/functions.html#locals) function inside a [`class`](https://python-all.ru/3.0/reference/compound_stmts.html#class) statement, the resulting dictionary no longer returns free variables. (Free variables, in this case, are variables referenced in the [`class`](https://python-all.ru/3.0/reference/compound_stmts.html#class) statement that aren’t attributes of the class.)10701071### Оптимизации10721073- Модуль [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) был переписан на C. Это позволяет вызывать предупреждения из парсера и может также ускорить запуск интерпретатора. (Предложено Нилом Норвитцем и Бреттом Кэнноном; [issue 1631171](https://python-all.ru/3.0/whatsnew/2.6.html).)1074- Объекты типов теперь имеют кэш методов, который может сократить работу, необходимую для поиска правильной реализации метода для конкретного класса; после кэширования интерпретатору не нужно обходить базовые классы, чтобы определить, какой метод вызвать. Кэш очищается, если базовый класс или сам класс изменяется, поэтому кэш должен оставаться корректным даже в условиях динамической природы Python. (Оригинальная оптимизация реализована Армином Риго, обновлена для Python 2.6 Кевином Джейкобсом; [issue 1700288](https://python-all.ru/3.0/whatsnew/2.6.html).)10751076  По умолчанию это изменение применяется только к типам, входящим в ядро Python. Модули расширения могут быть несовместимы с этим кэшем, поэтому они должны явно добавить `Py_TPFLAGS_HAVE_VERSION_TAG` в поле `tp_flags` модуля, чтобы включить кэш методов. (Чтобы быть совместимым с кэшем методов, код модуля расширения не должен напрямую обращаться и изменять член `tp_dict` любого из реализуемых типов. Большинство модулей этого не делают, но интерпретатор Python не может это определить. См. [issue 1878](https://python-all.ru/3.0/whatsnew/2.6.html) для обсуждения.)1077- Вызовы функций с именованными аргументами стали значительно быстрее за счет быстрого сравнения указателей, что обычно экономит время полного сравнения строк. (Предложено Рэймондом Хеттингером после первоначальной реализации Антуана Питу; [issue 1819](https://python-all.ru/3.0/whatsnew/2.6.html).)1078- Все функции модуля [`struct`](https://python-all.ru/3.0/library/struct.html#module-struct) были переписаны на C благодаря работе на спринте Need For Speed. (Предложено Рэймондом Хеттингером.)1079- Некоторые стандартные встроенные типы теперь устанавливают бит в своих объектах типа. Это ускоряет проверку, является ли объект подклассом одного из этих типов. (Автор: Neal Norwitz.)1080- Строки Unicode теперь используют более быстрый код для обнаружения пробельных символов и разрывов строк; это ускоряет метод `split()` примерно на 25% и `splitlines()` на 35%. (Предложено Антуаном Питу.) Использование памяти сокращено за счет применения pymalloc для данных строк Unicode.1081- Инструкция `with` теперь сохраняет метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) в стеке, что дает небольшое ускорение. (Реализовано Джеффри Яскиным.)1082- Для уменьшения использования памяти сборщик мусора теперь очищает внутренние списки свободных блоков при сборке мусора самого старшего поколения объектов. Это может вернуть память операционной системе быстрее.10831084### Изменения в интерпретаторе10851086Два параметра командной строки зарезервированы для использования другими реализациями Python. Переключатель *-J* зарезервирован для Jython для Jython-специфичных опций, таких как переключатели, передаваемые базовой JVM. *-X* зарезервирован для опций, специфичных для конкретной реализации Python, такой как CPython, Jython или IronPython. Если любой из этих параметров используется с Python 2.6, интерпретатор сообщит, что данный параметр в настоящее время не используется.10871088Теперь Python можно запретить запись файлов `.pyc` или `.pyo`, указав интерпретатору ключ [*-B*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-B) или установив переменную окружения [**PYTHONDONTWRITEBYTECODE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Эта настройка доступна программам Python как переменная `sys.dont_write_bytecode`, и код Python может изменить её значение, чтобы повлиять на поведение интерпретатора. (Предложено Нилом Норвицем и Георгом Брандлем.)10891090Кодировку, используемую для стандартного ввода, вывода и ошибок, можно задать, установив переменную окружения [**PYTHONIOENCODING**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONIOENCODING) перед запуском интерпретатора. Значение должно быть строкой вида `<encoding>` или `<encoding>:<errorhandler>`. Часть *encoding* задаёт имя кодировки, например `utf-8` или `latin-1`; необязательная часть *errorhandler* задаёт, что делать с символами, которые не могут быть обработаны данной кодировкой, и должна быть одним из значений: “error”, “ignore” или “replace”. (Предложено Мартином фон Лёвисом.)10911092## Новые, улучшенные и устаревшие модули10931094Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее заметных изменений, отсортированный по алфавиту по именам модулей. Обратитесь к файлу `Misc/NEWS` в дереве исходных кодов для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.10951096- (Режим предупреждений о 3.0) В Python 3.0 будет реорганизована стандартная библиотека: многие устаревшие модули будут удалены, а другие переименованы. Python 2.6, запущенный в режиме предупреждений о 3.0, будет выдавать предупреждения об этих модулях при их импорте.10971098  Список устаревших модулей: `audiodev`, `bgenlocations`, `buildtools`, `bundlebuilder`, `Canvas`, `compiler`, `dircache`, `dl`, `fpformat`, `gensuitemodule`, `ihooks`, `imageop`, `imgfile`, `linuxaudiodev`, `mhlib`, `mimetools`, `multifile`, `new`, `pure`, `statvfs`, `sunaudiodev`, `test.testall`, и `toaiff`.1099- Модули [`asyncore`](https://python-all.ru/3.0/library/asyncore.html#module-asyncore) и [`asynchat`](https://python-all.ru/3.0/library/asynchat.html#module-asynchat) снова активно поддерживаются, и было применено несколько патчей и исправлений ошибок. (Поддерживается Джозией Карлсоном; см. [issue 1736190](https://python-all.ru/3.0/whatsnew/2.6.html) для одного патча.)1100- У модуля `bsddb` также появился новый мейнтейнер – Хесус Сеа, и теперь пакет доступен как самостоятельный. Веб-страница пакета: [www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/3.0/whatsnew/2.6.html). Планируется удалить пакет из стандартной библиотеки в Python 3.0, так как он выпускается гораздо чаще, чем Python.11011102  Модуль `bsddb.dbshelve` теперь использует самый высокий доступный протокол сериализации вместо того, чтобы ограничиваться протоколом 1. (Предложено У. Барнсом; [issue 1551443](https://python-all.ru/3.0/whatsnew/2.6.html).)1103- Модуль [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi) теперь будет читать переменные из строки запроса HTTP POST запроса. Это позволяет использовать действия формы с URL, содержащими строки запроса, например “/cgi-bin/add.py?category=1”. (Предложено Александром Фиори и Нубисом; [issue 1817](https://python-all.ru/3.0/whatsnew/2.6.html).)11041105  Функции `parse_qs()` и `parse_qsl()` были перенесены из модуля [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi) в модуль `urlparse`. Версии, все еще доступные в модуле [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi), будут вызывать сообщения [`PendingDeprecationWarning`](https://python-all.ru/3.0/library/exceptions.html#exceptions.PendingDeprecationWarning) в 2.6 ([issue 600362](https://python-all.ru/3.0/whatsnew/2.6.html)).1106- Модуль [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) подвергся значительной доработке, предложенной Марком Дикинсоном и Кристианом Хаймсом. Было добавлено пять новых функций:11071108  - `polar()` преобразует комплексное число в полярную форму, возвращая модуль и аргумент комплексного числа.1109  - `rect()` делает обратное, преобразуя пару модуль, аргумент обратно в соответствующее комплексное число.1110  - `phase()` возвращает аргумент (также называемый углом) комплексного числа.1111  - `isnan()` возвращает True, если либо вещественная, либо мнимая часть его аргумента является NaN.1112  - `isinf()` возвращает True, если либо вещественная, либо мнимая часть его аргумента бесконечна.11131114  Ревизии также улучшили числовую надёжность модуля [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath). Для всех функций вещественная и мнимая части результатов точны до нескольких единиц последнего разряда (ulps), когда это возможно. Подробности см. в [issue 1381](https://python-all.ru/3.0/whatsnew/2.6.html). Также исправлены разрезы ветвей для `asinh()`, `atanh()` и `atan()`.11151116  Тесты для модуля были существенно расширены; почти 2000 новых тестов проверяют алгебраические функции.11171118  На платформах IEEE 754 модуль [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) теперь обрабатывает специальные значения IEEE 754 и исключения с плавающей запятой в соответствии с Приложением ‘G’ стандарта C99.1119- Новый тип данных в модуле [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections): `namedtuple(typename, fieldnames)` – это фабричная функция, которая создаёт подклассы стандартного кортежа, поля которых доступны как по имени, так и по индексу. Например:11201121  ```python1122  >>> var_type = collections.namedtuple('variable',1123  ...             'id name type size')1124  >>> # Имена разделяются пробелами или запятыми1125  >>> # 'id, name, type, size' также будет работать1126  >>> var_type._fields1127  ('id', 'name', 'type', 'size')11281129  >>> var = var_type(1, 'frequency', 'int', 4)1130  >>> print var[0], var.id    # Эквивалентно1131  1 11132  >>> print var[2], var.type  # Эквивалентно1133  int int1134  >>> var._asdict()1135  {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}1136  >>> v2 = var._replace(name='amplitude')1137  >>> v21138  variable(id=1, name='amplitude', type='int', size=4)1139  ```11401141  Некоторые места в стандартной библиотеке, которые возвращали кортежи, были изменены так, чтобы возвращать экземпляры `namedtuple`. Например, метод `Decimal.as_tuple()` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11421143  (Автор: Raymond Hettinger.)1144- Ещё одно изменение в модуле [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections): тип `deque` теперь поддерживает необязательный параметр *maxlen*; если он указан, размер дека будет ограничен не более чем *maxlen* элементами. Добавление новых элементов в полный дек приводит к отбрасыванию старых.11451146  ```python1147  >>> from collections import deque1148  >>> dq=deque(maxlen=3)1149  >>> dq1150  deque([], maxlen=3)1151  >>> dq.append(1) ; dq.append(2) ; dq.append(3)1152  >>> dq1153  deque([1, 2, 3], maxlen=3)1154  >>> dq.append(4)1155  >>> dq1156  deque([2, 3, 4], maxlen=3)1157  ```11581159  (Автор: Raymond Hettinger.)1160- Объекты `Morsel` модуля `Cookie` теперь поддерживают атрибут `httponly`. В некоторых браузерах куки с этим атрибутом недоступны для чтения или изменения через JavaScript. (Автор: Arvin Schnell; [issue 1638033](https://python-all.ru/3.0/whatsnew/2.6.html).)1161- Новый метод окна в модуле [`curses`](https://python-all.ru/3.0/library/curses.html#module-curses), `chgat()`, изменяет атрибуты отображения для заданного числа символов на одной строке. (Автор: Fabian Kreutz.)11621163  ```python1164  # Текст жирным шрифтом, начинающийся с y=0, x=211165  # и влияющий на остальную часть строки1166  stdscr.chgat(0, 21, curses.A_BOLD)1167  ```11681169  Класс `Textbox` в модуле [`curses.textpad`](https://python-all.ru/3.0/library/curses.html#module-curses.textpad) теперь поддерживает редактирование как в режиме вставки, так и в режиме замены. Режим вставки включается передачей истинного значения для параметра *insert\_mode* при создании экземпляра `Textbox`.1170- Методы `strftime()` модуля [`datetime`](https://python-all.ru/3.0/library/datetime.html#module-datetime) теперь поддерживают код формата `%f`, который разворачивается в количество микросекунд в объекте, дополненное слева нулями до шести знаков. (Автор: Skip Montanaro; [issue 1158](https://python-all.ru/3.0/whatsnew/2.6.html).)1171- Модуль [`decimal`](https://python-all.ru/3.0/library/decimal.html#module-decimal) был обновлён до версии 1.66 [Общей спецификации десятичных чисел](https://python-all.ru/3.0/whatsnew/2.6.html). Новые возможности включают некоторые методы для основных математических функций, таких как `exp()` и `log10()`:11721173  ```python1174  >>> Decimal(1).exp()1175  Decimal("2.718281828459045235360287471")1176  >>> Decimal("2.7182818").ln()1177  Decimal("0.9999999895305022877376682436")1178  >>> Decimal(1000).log10()1179  Decimal("3")1180  ```11811182  Метод `as_tuple()` объектов `Decimal` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11831184  (Реализовано Facundo Batista и Mark Dickinson. Поддержка именованных кортежей добавлена Raymond Hettinger.)1185- Класс `SequenceMatcher` модуля [`difflib`](https://python-all.ru/3.0/library/difflib.html#module-difflib) теперь возвращает именованные кортежи, представляющие совпадения, с атрибутами `a`, `b` и `size`. (Автор: Raymond Hettinger.)1186- В конструктор класса [`ftplib.FTP`](https://python-all.ru/3.0/library/ftplib.html#ftplib.FTP), а также в метод `connect()`, был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.) Кроме того, методы `storbinary()` и `storlines()` класса `FTP` теперь принимают необязательный параметр *колбэк*, который будет вызываться с каждым блоком данных после его отправки. (Автор: Phil Schwartz; [issue 1221598](https://python-all.ru/3.0/whatsnew/2.6.html).)1187- Встроенная функция `reduce()` также доступна в модуле [`functools`](https://python-all.ru/3.0/library/functools.html#module-functools). В Python 3.0 эта встроенная функция была удалена, и `reduce()` доступна только из [`functools`](https://python-all.ru/3.0/library/functools.html#module-functools); в настоящее время нет планов удалять эту встроенную функцию в серии 2.x. (Исправлено Кристианом Хаймсом; [issue 1739906](https://python-all.ru/3.0/whatsnew/2.6.html).)1188- Когда это возможно, модуль [`getpass`](https://python-all.ru/3.0/library/getpass.html#module-getpass) теперь использует `/dev/tty` для вывода приглашения и чтения пароля, при необходимости переключаясь на стандартный поток ошибок и стандартный ввод. Если пароль может отображаться на терминале, перед показом приглашения выводится предупреждение. (Автор: Gregory P. Smith.)1189- Функция [`glob.glob()`](https://python-all.ru/3.0/library/glob.html#glob.glob) теперь может возвращать имена файлов в Unicode, если использовался путь в Unicode и в каталоге есть соответствующие имена в Unicode. ([issue 1001604](https://python-all.ru/3.0/whatsnew/2.6.html))1190- Модуль `gopherlib` был удалён.1191- Новая функция в модуле [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq), `merge(iter1, iter2, ...)`, принимает любое количество итерируемых объектов, возвращающих данные в отсортированном порядке, и возвращает новый генератор, который выдает содержимое всех итераторов, также в отсортированном порядке. Например:11921193  ```python1194  >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))1195  [1, 2, 3, 5, 8, 9, 16]1196  ```11971198  Ещё одна новая функция, `heappushpop(heap, item)`, добавляет *item* в *heap*, затем извлекает и возвращает наименьший элемент. Это эффективнее, чем последовательный вызов `heappush()` и `heappop()`.11991200  [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq) теперь реализован так, что использует только сравнение «меньше», вместо ранее использовавшегося сравнения «меньше или равно». Это приводит к тому, что использование [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq) для типа совпадает с поведением метода `list.sort()`. (Автор: Raymond Hettinger.)1201- В конструкторы классов `httplib.HTTPConnection` и `HTTPSConnection` был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.)1202- Большинство функций модуля [`inspect`](https://python-all.ru/3.0/library/inspect.html#module-inspect), таких как `getmoduleinfo()` и `getargs()`, теперь возвращают именованные кортежи. Помимо поведения как у кортежей, элементы возвращаемого значения также можно получить как атрибуты. (Автор: Raymond Hettinger.)12031204  Некоторые новые функции в модуле включают `isgenerator()`, `isgeneratorfunction()`, и `isabstract()`.1205- Модуль [`itertools`](https://python-all.ru/3.0/library/itertools.html#module-itertools) приобрёл несколько новых функций.12061207  `izip_longest(iter1, iter2, ...[, fillvalue])` создаёт кортежи из каждого из элементов; если некоторые итерируемые объекты короче других, недостающие значения устанавливаются в *fillvalue*. Например:12081209  ```python1210  >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))1211  ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))1212  ```12131214  `product(iter1, iter2, ..., [repeat=N])` возвращает декартово произведение переданных итерируемых объектов – набор кортежей, содержащих все возможные комбинации элементов, возвращаемых каждым итерируемым объектом.12151216  ```python1217  >>> list(itertools.product([1,2,3], [4,5,6]))1218  [(1, 4), (1, 5), (1, 6),1219   (2, 4), (2, 5), (2, 6),1220   (3, 4), (3, 5), (3, 6)]1221  ```12221223  Необязательный именованный аргумент *repeat* используется для вычисления произведения итерируемого объекта или набора итерируемых объектов самих на себя, повторённого *N* раз. С одним итерируемым аргументом возвращаются кортежи из *N* элементов:12241225  ```python1226  >>> list(itertools.product([1,2], repeat=3))1227  [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),1228   (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]1229  ```12301231  С двумя итерируемыми объектами возвращаются кортежи из *2N* элементов.12321233  ```python1234  >>> list(itertools.product([1,2], [3,4], repeat=2))1235  [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),1236   (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),1237   (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),1238   (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]1239  ```12401241  `combinations(iterable, r)` возвращает подпоследовательности длины *r* из элементов *iterable*.12421243  ```python1244  >>> list(itertools.combinations('123', 2))1245  [('1', '2'), ('1', '3'), ('2', '3')]1246  >>> list(itertools.combinations('123', 3))1247  [('1', '2', '3')]1248  >>> list(itertools.combinations('1234', 3))1249  [('1', '2', '3'), ('1', '2', '4'),1250   ('1', '3', '4'), ('2', '3', '4')]1251  ```12521253  `permutations(iter[, r])` возвращает все перестановки длины *r* из элементов итерируемого объекта. Если *r* не указан, по умолчанию берётся количество элементов, производимых итерируемым объектом.12541255  ```python1256  >>> list(itertools.permutations([1,2,3,4], 2))1257  [(1, 2), (1, 3), (1, 4),1258   (2, 1), (2, 3), (2, 4),1259   (3, 1), (3, 2), (3, 4),1260   (4, 1), (4, 2), (4, 3)]1261  ```12621263  `itertools.chain(*iterables)` – существующая функция в [`itertools`](https://python-all.ru/3.0/library/itertools.html#module-itertools), которая получила новый конструктор в Python 2.6. `itertools.chain.from_iterable(iterable)` принимает один итерируемый объект, который должен возвращать другие итерируемые объекты. `chain()` затем вернёт все элементы первого итерируемого объекта, затем все элементы второго и так далее.12641265  ```python1266  >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))1267  [1, 2, 3, 4, 5, 6]1268  ```12691270  (Всё добавлено Рэймондом Хеттингером.)1271- Класс `FileHandler` модуля [`logging`](https://python-all.ru/3.0/library/logging.html#module-logging) и его подклассы `WatchedFileHandler`, `RotatingFileHandler` и `TimedRotatingFileHandler` теперь имеют необязательный параметр *delay* в своих конструкторах. Если *delay* равен true, открытие файла журнала откладывается до первого вызова `emit()`. (Автор: Vinay Sajip.)12721273  `TimedRotatingFileHandler` также имеет параметр конструктора *utc*. Если аргумент равен true, при определении момента полуночи и генерации имён файлов будет использоваться время UTC; в противном случае – местное время.1274- В модуль [`math`](https://python-all.ru/3.0/library/math.html#module-math) было добавлено несколько новых функций:12751276  - [`isinf()`](https://python-all.ru/3.0/library/math.html#math.isinf) и [`isnan()`](https://python-all.ru/3.0/library/math.html#math.isnan) определяют, является ли заданное число с плавающей точкой положительной или отрицательной бесконечностью или NaN (Not a Number – не числом) соответственно.1277  - [`copysign()`](https://python-all.ru/3.0/library/math.html#math.copysign) копирует знаковый бит числа IEEE 754, возвращая абсолютное значение *x*, объединённое со знаковым битом *y*. Например, `math.copysign(1, -0.0)` возвращает -1.0. (Автор: Christian Heimes.)1278  - [`factorial()`](https://python-all.ru/3.0/library/math.html#math.factorial) вычисляет факториал числа. (Автор: Raymond Hettinger; [issue 2138](https://python-all.ru/3.0/whatsnew/2.6.html).)1279  - [`fsum()`](https://python-all.ru/3.0/library/math.html#math.fsum) суммирует поток чисел из итерируемого объекта, стараясь избежать потери точности за счёт использования частичных сумм. (Авторы: Jean Brouwers, Raymond Hettinger и Mark Dickinson; [issue 2819](https://python-all.ru/3.0/whatsnew/2.6.html).)1280  - [`acosh()`](https://python-all.ru/3.0/library/math.html#math.acosh), [`asinh()`](https://python-all.ru/3.0/library/math.html#math.asinh) и [`atanh()`](https://python-all.ru/3.0/library/math.html#math.atanh) вычисляют обратные гиперболические функции.1281  - [`log1p()`](https://python-all.ru/3.0/library/math.html#math.log1p) возвращает натуральный логарифм от *1+x* (по основанию *e*).1282  - `trunc()` округляет число в сторону нуля, возвращая ближайшее `Integral`, находящееся между аргументом функции и нулём. Добавлено в рамках обратного портирования [иерархии типов чисел из PEP 3141](https://python-all.ru/3.0/whatsnew/2.6.html#pep-3141).1283- Модуль [`math`](https://python-all.ru/3.0/library/math.html#module-math) был улучшен для более согласованного поведения на разных платформах, особенно в части обработки исключений с плавающей точкой и специальных значений IEEE 754.12841285  По возможности модуль следует рекомендациям стандарта C99 относительно специальных значений IEEE 754. Например, `sqrt(-1.)` теперь почти на всех платформах должно вызывать [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), в то время как `sqrt(float('NaN'))` должно возвращать NaN на всех платформах IEEE 754. Там, где приложение F стандарта C99 рекомендует сигнализировать «деление на ноль» или «недопустимая операция», Python будет вызывать [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError). Там, где приложение F рекомендует сигнализировать «переполнение», Python будет вызывать [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError). (См. [issue 711019](https://python-all.ru/3.0/whatsnew/2.6.html) и [issue 1640](https://python-all.ru/3.0/whatsnew/2.6.html).)12861287  (Добавлено Кристианом Хаймсом и Марком Дикинсоном.)1288- Модули `MimeWriter` и `mimify` устарели; вместо них используйте пакет [`email`](https://python-all.ru/3.0/library/email.html#module-email).1289- Модуль `md5` устарел; используйте модуль [`hashlib`](https://python-all.ru/3.0/library/hashlib.html#module-hashlib).1290- Объекты `mmap` теперь имеют метод `rfind()`, который ищет подстроку, начиная с конца строки и двигаясь назад. Метод `find()` также получил параметр *end*, указывающий индекс, на котором нужно остановить поиск. (Предложено Джоном Лентоном.)1291- Модуль [`operator`](https://python-all.ru/3.0/library/operator.html#module-operator) получил функцию `methodcaller()`, которая принимает имя и необязательный набор аргументов и возвращает вызываемый объект, который будет вызывать именованную функцию с переданными ему аргументами. Например:12921293  ```python1294  >>> # Эквивалентно lambda s: s.replace('old', 'new')1295  >>> replacer = operator.methodcaller('replace', 'old', 'new')1296  >>> replacer('old wine in old bottles')1297  'new wine in new bottles'1298  ```12991300  (Добавлено Георгом Брандлом по предложению Грегори Петросяна.)13011302  Функция `attrgetter()` теперь принимает имена с точками и выполняет соответствующий поиск атрибутов:13031304  ```python1305  >>> inst_name = operator.attrgetter(1306  ...        '__class__.__name__')1307  >>> inst_name('')1308  'str'1309  >>> inst_name(help)1310  '_Helper'1311  ```13121313  (Добавлено Георгом Брандлом по предложению Барри Уорсо.)1314- Модуль [`os`](https://python-all.ru/3.0/library/os.html#module-os) теперь включает в себя несколько новых системных вызовов. `fchmod(fd, mode)` и `fchown(fd, uid, gid)` изменяют режим и владельца открытого файла, а `lchmod(path, mode)` изменяет режим символической ссылки. (Авторы: Georg Brandl и Christian Heimes.)13151316  `chflags()` и `lchflags()` являются обёртками для соответствующих системных вызовов (где они доступны) и изменяют флаги файла. Константы значений флагов определены в модуле [`stat`](https://python-all.ru/3.0/library/stat.html#module-stat); некоторые возможные значения включают `UF_IMMUTABLE`, указывающий, что файл нельзя изменять, и `UF_APPEND`, указывающий, что данные можно только добавлять в файл. (Автор: M. Levinson.)13171318  `os.closerange(low, high)` эффективно закрывает все файловые дескрипторы от *low* до *high*, игнорируя любые ошибки и не включая сам *high*. Эта функция теперь используется модулем [`subprocess`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess) для ускорения запуска процессов. (Автор: Georg Brandl; [issue 1663329](https://python-all.ru/3.0/whatsnew/2.6.html).)1319- Метод `clear()` объекта `os.environ` теперь будет не только очищать ключи объекта, но и сбрасывать переменные окружения с помощью [`os.unsetenv()`](https://python-all.ru/3.0/library/os.html#os.unsetenv). (Автор: Martin Horcicka; [issue 1181](https://python-all.ru/3.0/whatsnew/2.6.html).)1320- Функция [`os.walk()`](https://python-all.ru/3.0/library/os.html#os.walk) теперь имеет параметр `followlinks`. Если он установлен в True, функция будет следовать символическим ссылкам на каталоги и обходить их содержимое. Для обратной совместимости значение по умолчанию этого параметра – false. Учтите, что функция может войти в бесконечную рекурсию, если есть символическая ссылка, указывающая на родительский каталог. ([issue 1273829](https://python-all.ru/3.0/whatsnew/2.6.html))1321- В модуле [`os.path`](https://python-all.ru/3.0/library/os.path.html#module-os.path) функция `splitext()` была изменена, чтобы не разделять по ведущим точкам. Это даёт лучшие результаты при работе с точечными файлами Unix. Например, `os.path.splitext('.ipython')` теперь возвращает `('.ipython', '')` вместо `('', '.ipython')`. ([issue 115886](https://python-all.ru/3.0/whatsnew/2.6.html))13221323  Новая функция `os.path.relpath(path, start='.')` возвращает относительный путь от пути `start` (если он указан) или от текущего рабочего каталога к целевому пути `path`. (Автор: Richard Barran; [issue 1339796](https://python-all.ru/3.0/whatsnew/2.6.html).)13241325  В Windows [`os.path.expandvars()`](https://python-all.ru/3.0/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения, заданные в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Автор: Josiah Carlson; [issue 957650](https://python-all.ru/3.0/whatsnew/2.6.html).)1326- Отладчик Python, предоставляемый модулем [`pdb`](https://python-all.ru/3.0/library/pdb.html#module-pdb), получил новую команду: «run» перезапускает отлаживаемую программу Python и может опционально принимать новые аргументы командной строки для программы. (Автор: Rocky Bernstein; [issue 1393667](https://python-all.ru/3.0/whatsnew/2.6.html).)1327- Модуль `posixfile` устарел; [`fcntl.lockf()`](https://python-all.ru/3.0/library/fcntl.html#fcntl.lockf) обеспечивает лучшую блокировку.13281329  Функция `post_mortem()`, используемая для начала отладки трассировки стека, теперь будет использовать трассировку, возвращаемую [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info), если трассировка не предоставлена. (Предложено Факундо Батистой; [issue 1106316](https://python-all.ru/3.0/whatsnew/2.6.html).)1330- Модуль [`pickletools`](https://python-all.ru/3.0/library/pickletools.html#module-pickletools) теперь имеет функцию `optimize()`, которая принимает строку, содержащую pickle, и удаляет некоторые неиспользуемые коды операций, возвращая более короткий pickle, содержащий ту же структуру данных. (Автор: Raymond Hettinger.)1331- Модуль `popen2` устарел; используйте модуль [`подпроцесс`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess).1332- В модуль [`pkgutil`](https://python-all.ru/3.0/library/pkgutil.html#module-pkgutil) была добавлена функция `get_data()`, которая возвращает содержимое ресурсных файлов, входящих в установленный пакет Python. Например:13331334  ```python1335  >>> import pkgutil1336  >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')1337  BaseException1338   +-- SystemExit1339   +-- KeyboardInterrupt1340   +-- GeneratorExit1341   +-- Exception1342        +-- StopIteration1343        +-- StandardError1344   ...1345  ```13461347  (Автор: Paul Moore; [issue 2439](https://python-all.ru/3.0/whatsnew/2.6.html).)1348- Объекты `Parser` модуля `pyexpat` теперь позволяют устанавливать свой атрибут `buffer_size` для изменения размера буфера, используемого для хранения символьных данных. (Автор: Achim Gaedke; [issue 1137](https://python-all.ru/3.0/whatsnew/2.6.html).)1349- Модуль `Queue` теперь предоставляет варианты очередей, которые извлекают элементы в разном порядке. Класс `PriorityQueue` хранит элементы очереди в куче и извлекает их в порядке приоритета, а `LifoQueue` извлекает сначала наиболее недавно добавленные элементы, то есть ведёт себя как стек. (Автор: Raymond Hettinger.)1350- Объекты `Random` модуля [`random`](https://python-all.ru/3.0/library/random.html#module-random) теперь можно упаковывать с помощью pickle на 32-битной системе и распаковывать на 64-битной, и наоборот. К сожалению, это изменение также означает, что объекты `Random` из Python 2.6 невозможно правильно распаковать в более ранних версиях Python. (Автор: Shawn Ligocki; [задача 1727780](https://python-all.ru/3.0/whatsnew/2.6.html).)13511352  Новая функция `triangular(low, high, mode)` возвращает случайные числа, подчиняющиеся треугольному распределению. Возвращаемые значения находятся между *low* и *high* (не включая сам *high*), а *mode* – наиболее часто встречающееся значение в распределении. (Авторы: Wladmir van der Laan и Raymond Hettinger; [issue 1681432](https://python-all.ru/3.0/whatsnew/2.6.html).)1353- Длительные поиски по регулярному выражению, выполняемые модулем [`re`](https://python-all.ru/3.0/library/re.html#module-re) будут проверять доставку сигналов, поэтому продолжительные поиски теперь можно прерывать. (Предложено Джошем Хойтом и Ральфом Шмиттом; [issue 846388](https://python-all.ru/3.0/whatsnew/2.6.html).)13541355  Модуль регулярных выражений реализован путём компиляции байт-кода для крошечной виртуальной машины, специфичной для регулярных выражений. Недоверенный код может напрямую создавать вредоносные строки байт-кода и вызывать сбои, поэтому Python 2.6 включает верификатор байт-кода регулярных выражений. (Предложено Гвидо ван Россумом на основе работы для Google App Engine; [issue 3487](https://python-all.ru/3.0/whatsnew/2.6.html).)1356- Модуль `rgbimg` был удалён.1357- Модуль [`rlcompleter`](https://python-all.ru/3.0/library/rlcompleter.html#module-rlcompleter), его метод `Completer.complete()` теперь будет игнорировать исключения, возникающие при вычислении имени. (Исправлено Лоренцем Кваком; [issue 2250](https://python-all.ru/3.0/whatsnew/2.6.html).)1358- Экземпляры `scheduler` модуля [`sched`](https://python-all.ru/3.0/library/sched.html#module-sched) теперь имеют атрибут `queue` только для чтения, который возвращает содержимое очереди планировщика, представленное в виде списка именованных кортежей с полями `(time, priority, action, argument)`. (Предложено Рэймондом Хеттингером; [issue 1861](https://python-all.ru/3.0/whatsnew/2.6.html).)1359- Модуль [`select`](https://python-all.ru/3.0/library/select.html#module-select) теперь содержит функции-обёртки для системных вызовов Linux `epoll` и BSD `kqueue`. В существующие объекты `poll` был добавлен метод `modify()`; `pollobj.modify(fd, eventmask)` принимает файловый дескриптор или файловый объект и маску событий, изменяя сохранённую маску событий для этого файла. (Предложено Кристианом Хаймсом; [issue 1657](https://python-all.ru/3.0/whatsnew/2.6.html).)1360- Модуль `sets` объявлен устаревшим; лучше использовать встроенные типы [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset).1361- Модуль `sha` устарел; вместо него используйте модуль [`hashlib`](https://python-all.ru/3.0/library/hashlib.html#module-hashlib).1362- Функция [`shutil.copytree()`](https://python-all.ru/3.0/library/shutil.html#shutil.copytree) теперь имеет необязательный аргумент *ignore*, который принимает вызываемый объект. Этот вызываемый объект будет получать путь к каждому каталогу и список его содержимого и возвращать список имён, которые будут игнорироваться, а не копироваться.13631364  Модуль [`shutil`](https://python-all.ru/3.0/library/shutil.html#module-shutil) также предоставляет функцию `ignore_patterns()` для использования с этим новым параметром. `ignore_patterns()` принимает произвольное количество шаблонов в стиле glob и возвращает вызываемый объект, который будет игнорировать все файлы и каталоги, соответствующие любому из этих шаблонов. Следующий пример копирует дерево каталогов, но пропускает как каталоги `.svn`, так и резервные файлы Emacs, имена которых заканчиваются на '~':13651366  ```python1367  shutil.copytree('Doc/library', '/tmp/library',1368                  ignore=shutil.ignore_patterns('*~', '.svn'))1369  ```13701371  (Предложено Тареком Зиаде; [issue 2663](https://python-all.ru/3.0/whatsnew/2.6.html).)1372- Интеграция обработки сигналов с циклами событий GUI, такими как используемые в Tkinter или GTk+, долгое время была проблемой; большинство программ в итоге прибегают к опросу, пробуждаясь каждую долю секунды, чтобы проверить, произошли ли какие-либо события GUI. Модуль [`signal`](https://python-all.ru/3.0/library/signal.html#module-signal) теперь может сделать это более эффективно. Вызов `signal.set_wakeup_fd(fd)` устанавливает файловый дескриптор для использования; когда получен сигнал, в этот файловый дескриптор записывается один байт. Существует также функция на уровне C, [`PySignal_SetWakeupFd`](https://python-all.ru/3.0/c-api/exceptions.html#PySignal_SetWakeupFd), для установки дескриптора.13731374  Циклы событий будут использовать это, открывая канал для создания двух дескрипторов: один для чтения и один для записи. Дескриптор записи будет передан `set_wakeup_fd()`, а дескриптор чтения будет добавлен в список дескрипторов, отслеживаемых циклом событий через `select` или `poll`. При получении сигнала будет записан один байт, и основной цикл событий будет разбужен, что позволяет избежать необходимости опроса.13751376  (Предложено Адамом Олсеном; [issue 1583](https://python-all.ru/3.0/whatsnew/2.6.html).)13771378  Функция `siginterrupt()` теперь доступна из кода Python и позволяет изменять, могут ли сигналы прерывать системные вызовы. (Предложено Ральфом Шмиттом.)13791380  Функции `setitimer()` и `getitimer()` также были добавлены (там, где они доступны). `setitimer()` позволяет устанавливать интервальные таймеры, которые вызовут отправку сигнала процессу по истечении заданного времени, измеряемого в реальном времени, затраченном процессорном времени или суммарном времени процесса и системы. (Предложено Гильерме Поло; [issue 2240](https://python-all.ru/3.0/whatsnew/2.6.html).)1381- Модуль [`smtplib`](https://python-all.ru/3.0/library/smtplib.html#module-smtplib) теперь поддерживает SMTP через SSL благодаря добавлению класса `SMTP_SSL`. Этот класс поддерживает интерфейс, идентичный существующему классу `SMTP`. (Предложено Монти Тейлором.) Оба конструктора классов также имеют необязательный параметр `timeout`, задающий тайм-аут для начальной попытки подключения, измеряемый в секундах. (Предложено Факундо Батистой.)13821383  В модуль также была добавлена реализация протокола LMTP ([**RFC 2033**](https://python-all.ru/3.0/whatsnew/2.6.html)). LMTP используется вместо SMTP при передаче электронной почты между агентами, которые не управляют почтовой очередью. (LMTP реализован Лейфом Хедстрёмом; [issue 957003](https://python-all.ru/3.0/whatsnew/2.6.html).)13841385  SMTP.starttls() теперь соответствует [**RFC 3207**](https://python-all.ru/3.0/whatsnew/2.6.html) и забывает любые знания, полученные от сервера, но не полученные в результате самого согласования TLS. (Патч предоставлен Биллом Феннером; [issue 829951](https://python-all.ru/3.0/whatsnew/2.6.html).)1386- Модуль [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) теперь поддерживает TIPC ([http://tipc.sf.net](https://python-all.ru/3.0/whatsnew/2.6.html)), высокопроизводительный протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса TIPC представляют собой кортежи из 4 или 5 элементов. (Автор: Alberto Bertogli; [issue 1646](https://python-all.ru/3.0/whatsnew/2.6.html).)13871388  Новая функция `create_connection()` принимает адрес\\nи подключается к нему, используя необязательное значение тайм-аута, возвращая\\nподключённый объект сокета.1389- Базовые классы модуля `SocketServer` теперь поддерживают вызов метода `handle_timeout()` после периода бездействия, заданного атрибутом сервера `timeout`. (Предложено Майклом Помранингом.) Метод `serve_forever()` теперь принимает необязательный интервал опроса, измеряемый в секундах, определяющий, как часто сервер будет проверять запрос на завершение работы. (Предложено Педро Вернеком и Джеффри Яскиным; [issue 742598](https://python-all.ru/3.0/whatsnew/2.6.html), [issue 1193577](https://python-all.ru/3.0/whatsnew/2.6.html).)1390- Модуль [`sqlite3`](https://python-all.ru/3.0/library/sqlite3.html#module-sqlite3), поддерживаемый Герхардом Херингом, обновлён с версии 2.3.2 в Python 2.5 до версии 2.4.1.1391- Модуль [`struct`](https://python-all.ru/3.0/library/struct.html#module-struct) теперь поддерживает тип C99 `_Bool`, с использованием символа формата `'?'`. (Предложено Дэвидом Ремалем.)1392- Объекты `Popen`, предоставляемые модулем [`subprocess`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess),\\nтеперь имеют методы `terminate()`, `kill()` и `send_signal()`.\\nВ Windows `send_signal()` поддерживает только сигнал `SIGTERM`,\\nи все эти методы являются псевдонимами функции Win32 API\\n`TerminateProcess`.\\n(Автор: Christian Heimes.)1393- Новая переменная в модуле [`sys`](https://python-all.ru/3.0/library/sys.html#module-sys), `float_info`, представляет собой объект, содержащий информацию, полученную из файла `float.h` о поддержке чисел с плавающей точкой на платформе. Атрибуты этого объекта включают `mant_dig` (количество цифр в мантиссе), `epsilon` (наименьшая разница между 1.0 и следующим представимым большим значением) и несколько других. (Предложено Кристианом Хаймсом; [issue 1534](https://python-all.ru/3.0/whatsnew/2.6.html).)13941395  Ещё одна новая переменная, `dont_write_bytecode`, управляет тем, будет ли Python записывать файлы `.pyc` или `.pyo` при импорте модуля. Если эта переменная истинна, скомпилированные файлы не записываются. Переменная изначально устанавливается при запуске путём указания ключа [*-B*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-B) интерпретатору Python или установкой переменной окружения [**PYTHONDONTWRITEBYTECODE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Код Python может впоследствии изменить значение этой переменной, чтобы управлять записью файлов байт-кода. (Предложено Нилом Норвицем и Георгом Брандлем.)13961397  Информация об аргументах командной строки, переданных интерпретатору Python, доступна через чтение атрибутов именованного кортежа, доступного как `sys.flags`. Например, атрибут `verbose` истинен, если Python был запущен в подробном режиме, `debug` истинен в режиме отладки и т.д. Все эти атрибуты доступны только для чтения. (Предложено Кристианом Хаймсом.)13981399  Новая функция `getsizeof()` принимает объект Python и возвращает объём памяти, используемый объектом, измеряемый в байтах. Встроенные объекты возвращают корректные результаты; сторонние расширения могут этого не делать, но могут определить метод `__sizeof__()` для возврата размера объекта. (Предложено Робертом Шуппенисом; [issue 2898](https://python-all.ru/3.0/whatsnew/2.6.html).)14001401  Теперь можно определить текущие функции профилировщика и трассировщика, вызвав [`sys.getprofile()`](https://python-all.ru/3.0/library/sys.html#sys.getprofile) и [`sys.gettrace()`](https://python-all.ru/3.0/library/sys.html#sys.gettrace). (Предложено Георгом Брандлем; [issue 1648](https://python-all.ru/3.0/whatsnew/2.6.html).)1402- Модуль [`tarfile`](https://python-all.ru/3.0/library/tarfile.html#module-tarfile) теперь поддерживает tar-файлы POSIX.1-2001 (pax) в дополнение к уже поддерживаемым форматам POSIX.1-1988 (ustar) и GNU tar. Формат по умолчанию – GNU tar; укажите параметр `format`, чтобы открыть файл в другом формате:14031404  ```python1405  tar = tarfile.open("output.tar", "w",1406                     format=tarfile.PAX_FORMAT)1407  ```14081409  Новые параметры `encoding` и `errors` задают кодировку и схему обработки ошибок для преобразования символов. `'strict'`, `'ignore'` и `'replace'` – три стандартных способа обработки ошибок в Python; `'utf-8'` – специальное значение, которое заменяет плохие символы их представлением в UTF-8. (Преобразование символов происходит потому, что формат PAX поддерживает имена файлов в Юникоде, по умолчанию используется кодировка UTF-8.)14101411  Метод `TarFile.add()` теперь принимает аргумент `exclude`, который является функцией, используемой для исключения определённых имён файлов из архива. Функция должна принимать имя файла и возвращать true, если файл следует исключить, или false, если его следует архивировать. Функция применяется как к имени, изначально переданному `add()`, так и к именам файлов в рекурсивно добавляемых каталогах.14121413  (Все изменения выполнены Lars Gustäbel.)1414- Необязательный параметр `timeout` был добавлен в конструктор класса [`telnetlib.Telnet`](https://python-all.ru/3.0/library/telnetlib.html#telnetlib.Telnet), задающий тайм-аут в секундах. (Добавлено Факундо Батистой.)1415- Класс [`tempfile.NamedTemporaryFile`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile) обычно удаляет созданный временный файл при закрытии. Теперь это поведение можно изменить, передав `delete=False` конструктору. (Предложено Дэмиеном Миллером; [issue 1537850](https://python-all.ru/3.0/whatsnew/2.6.html).)14161417  Новый класс `SpooledTemporaryFile` ведёт себя как временный файл, но хранит данные в памяти до превышения максимального размера. При достижении этого предела содержимое записывается во временный файл на диске. (Автор: Dustin J. Mitchell.)14181419  Классы `NamedTemporaryFile` и `SpooledTemporaryFile` оба работают как контекстные менеджеры, поэтому можно написать `with tempfile.NamedTemporaryFile() as tmp: ...`. (Автор: Alexander Belopolsky; [issue 2021](https://python-all.ru/3.0/whatsnew/2.6.html).)1420- Модуль `test.test_support` получил несколько контекстных менеджеров, полезных для написания тестов. `EnvironmentVarGuard()` – это контекстный менеджер, который временно изменяет переменные окружения и автоматически восстанавливает их старые значения.14211422  Ещё один контекстный менеджер, `TransientResource`, может обрамлять вызовы ресурсов, которые могут быть недоступны; он перехватывает и игнорирует указанный список исключений. Например, сетевой тест может игнорировать определённые ошибки при подключении к внешнему веб-сайте:14231424  ```python1425  with test_support.TransientResource(IOError,1426                                  errno=errno.ETIMEDOUT):1427      f = urllib.urlopen('https://sf.net')1428      ...1429  ```14301431  Наконец, `check_warnings()` сбрасывает фильтры предупреждений модуля `warning` и возвращает объект, который будет записывать все возникающие предупреждения ([issue 3781](https://python-all.ru/3.0/whatsnew/2.6.html)):14321433  ```python1434  with test_support.check_warnings() as wrec:1435      warnings.simplefilter("always")1436      # ... код, вызывающий предупреждение ...1437      assert str(wrec.message) == "function is outdated"1438      assert len(wrec.warnings) == 1, "Multiple warnings raised"1439  ```14401441  (Автор: Бретт Кэннон.)1442- Модуль [`textwrap`](https://python-all.ru/3.0/library/textwrap.html#module-textwrap) теперь может сохранять существующие пробелы в начале и конце новых строк, если указать `drop_whitespace=False` в качестве аргумента:14431444  ```python1445  >>> S = """This  sentence  has a bunch   of1446  ...   extra   whitespace."""1447  >>> print textwrap.fill(S, width=15)1448  This  sentence1449  has a bunch1450  of    extra1451  whitespace.1452  >>> print textwrap.fill(S, drop_whitespace=False, width=15)1453  This  sentence1454    has a bunch1455     of    extra1456     whitespace.1457  >>>1458  ```14591460  (Автор: Dwayne Bailey; [issue 1581073](https://python-all.ru/3.0/whatsnew/2.6.html).)1461- API модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) изменяется для использования свойств, таких как `daemon`, вместо методов `setDaemon()` и `isDaemon()`, а некоторые методы переименованы с использованием подчёркиваний вместо верблюжьего регистра; например, метод `activeCount()` переименован в `active_count()`. Версии модуля 2.6 и 3.0 поддерживают одни и те же свойства и переименованные методы, но старые методы не удаляются. Дата устаревания старых API в Python 3.x не установлена; старые API не будут удалены ни в одной версии 2.x. (Реализовано несколькими людьми, в первую очередь Бенджамином Петерсоном.)14621463  Потоковые объекты `Thread` модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) получили свойство `ident`, возвращающее идентификатор потока – ненулевое целое число. (Автор: Gregory P. Smith; [issue 2871](https://python-all.ru/3.0/whatsnew/2.6.html).)1464- Модуль [`timeit`](https://python-all.ru/3.0/library/timeit.html#module-timeit) теперь принимает как вызываемые объекты, так и строки для измеряемого выражения и кода настройки. Были добавлены две вспомогательные функции для создания экземпляров `Timer`: `repeat(stmt, setup, time, repeat, number)` и `timeit(stmt, setup, time, number)` создают экземпляр и вызывают соответствующий метод. (Автор: Erik Demaine; [issue 1533909](https://python-all.ru/3.0/whatsnew/2.6.html).)1465- Модуль `Tkinter` теперь принимает списки и кортежи для опций, разделяя элементы пробелами перед передачей результирующего значения в Tcl/Tk. (Автор: Guilherme Polo; [issue 2906](https://python-all.ru/3.0/whatsnew/2.6.html).)1466- Модуль [`turtle`](https://python-all.ru/3.0/library/turtle.html#module-turtle) для черепашьей графики был значительно улучшен Gregor Lingl. Новые возможности модуля включают:14671468  - Улучшенная анимация движения и поворота черепахи.1469  - Управление движением черепахи с помощью новых методов `delay()`, `tracer()` и `speed()`.1470  - Возможность задавать новые формы для черепахи и определять новую систему координат.1471  - Черепахи теперь имеют метод `undo()`, который может отменять действия.1472  - Простая поддержка реакции на события ввода, такие как активность мыши и клавиатуры, что позволяет писать простые игры.1473  - Файл `turtle.cfg` можно использовать для настройки начального вида экрана черепахи.1474  - Докстринги модуля могут быть заменены новыми докстрингами, переведёнными на другой язык.14751476  ([issue 1513695](https://python-all.ru/3.0/whatsnew/2.6.html))1477- Необязательный параметр `timeout` был добавлен в функцию `urllib.urlopen()` и конструктор класса `urllib.ftpwrapper`, а также в функцию `urllib2.urlopen()`. Параметр задаёт тайм-аут в секундах. Например:14781479  ```python1480  >>> u = urllib2.urlopen("http://slow.example.com",1481                          timeout=3)1482  Traceback (most recent call last):1483    ...1484  urllib2.URLError: <urlopen error timed out>1485  >>>1486  ```14871488  (Добавлено Facundo Batista.)1489- База данных Юникода, предоставляемая модулем [`unicodedata`](https://python-all.ru/3.0/library/unicodedata.html#module-unicodedata), обновлена до версии 5.1.0. (Обновлено Мартином фон Лёвисом; [issue 3811](https://python-all.ru/3.0/whatsnew/2.6.html).)1490- Функции `formatwarning()` и `showwarning()` модуля [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) получили необязательный аргумент *line*, который можно использовать для передачи строки исходного кода. (Добавлено в рамках [issue 1631171](https://python-all.ru/3.0/whatsnew/2.6.html), в котором часть модуля [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) была переписана на C.)14911492  Новая функция `catch_warnings()` – это контекстный менеджер, предназначенный для тестирования, позволяющий временно изменять фильтры предупреждений, а затем восстанавливать их исходные значения ([issue 3781](https://python-all.ru/3.0/whatsnew/2.6.html)).1493- Классы XML-RPC `SimpleXMLRPCServer` и `DocXMLRPCServer` теперь можно предотвратить от немедленного открытия и привязки к своему сокету, передав True в качестве параметра конструктора `bind_and_activate`. Это можно использовать для изменения атрибута экземпляра `allow_reuse_address` перед вызовом методов `server_bind()` и `server_activate()` для открытия сокета и начала прослушивания соединений. (Автор: Peter Parente; [issue 1599845](https://python-all.ru/3.0/whatsnew/2.6.html).)14941495  `SimpleXMLRPCServer` также имеет атрибут `_send_traceback_header`; если он истинен, исключение и форматированная трассировка возвращаются в виде HTTP-заголовков «X-Exception» и «X-Traceback». Эта функция предназначена только для отладки и не должна использоваться на производственных серверах, так как трассировки могут раскрыть пароли или другую конфиденциальную информацию. (Автор: Alan McIntyre в рамках его проекта для Google Summer of Code 2007.)1496- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразования не всегда была корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и `time`. ([issue 1330538](https://python-all.ru/3.0/whatsnew/2.6.html)) Код также может обрабатывать даты до 1900 года (предложено Ральфом Шмиттом; [issue 2014](https://python-all.ru/3.0/whatsnew/2.6.html)) и 64-битные целые числа, представленные с помощью `<i8>` в XML-RPC ответах (предложено Рику Линдбладом; [issue 2985](https://python-all.ru/3.0/whatsnew/2.6.html)).1497- Класс `ZipFile` модуля [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile) теперь имеет методы `extract()` и `extractall()`, которые распаковывают один файл или все файлы архива в текущий каталог или в указанный каталог:14981499  ```python1500  z = zipfile.ZipFile('python-251.zip')15011502  # Распаковать один файл, записывая его относительно1503  # в каталог /tmp.1504  z.extract('Python/sysmodule.c', '/tmp')15051506  # Распаковать все файлы из архива.1507  z.extractall()1508  ```15091510  (Автор: Alan McIntyre; [issue 467924](https://python-all.ru/3.0/whatsnew/2.6.html).)15111512  Методы [`open()`](https://python-all.ru/3.0/library/functions.html#open), `read()` и `extract()` теперь могут принимать как имя файла, так и объект `ZipInfo`. Это полезно, если архив случайно содержит дублирующееся имя файла. (Автор: Graham Horler; [issue 1775025](https://python-all.ru/3.0/whatsnew/2.6.html).)15131514  Наконец, [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile) теперь поддерживает имена файлов в Unicode для архивов. (Автор: Alexey Borzenkov; [issue 1734346](https://python-all.ru/3.0/whatsnew/2.6.html).)15151516### Модуль [`ast`](https://python-all.ru/3.0/library/ast.html#module-ast)15171518Модуль [`ast`](https://python-all.ru/3.0/library/ast.html#module-ast) предоставляет представление Python-кода в виде абстрактного синтаксического дерева (AST), и Armin Ronacher добавил набор вспомогательных функций, выполняющих различные распространённые задачи. Они будут полезны для пакетов HTML-шаблонов, анализаторов кода и подобных инструментов, обрабатывающих код Python.15191520Функция `parse()` принимает выражение и возвращает AST. Функция `dump()` выводит представление дерева, подходящее для отладки:15211522```python1523import ast15241525t = ast.parse("""1526d = {}1527for i in 'abcdefghijklm':1528    d[i + i] = ord(i) - ord('a') + 11529print d1530""")1531print ast.dump(t)1532```15331534Это выводит глубоко вложенное дерево:15351536```python1537Module(body=[1538  Assign(targets=[1539    Name(id='d', ctx=Store())1540   ], value=Dict(keys=[], values=[]))1541  For(target=Name(id='i', ctx=Store()),1542      iter=Str(s='abcdefghijklm'), body=[1543    Assign(targets=[1544      Subscript(value=1545        Name(id='d', ctx=Load()),1546          slice=1547          Index(value=1548            BinOp(left=Name(id='i', ctx=Load()), op=Add(),1549             right=Name(id='i', ctx=Load()))), ctx=Store())1550     ], value=1551     BinOp(left=1552      BinOp(left=1553       Call(func=1554        Name(id='ord', ctx=Load()), args=[1555          Name(id='i', ctx=Load())1556         ], keywords=[], starargs=None, kwargs=None),1557       op=Sub(), right=Call(func=1558        Name(id='ord', ctx=Load()), args=[1559          Str(s='a')1560         ], keywords=[], starargs=None, kwargs=None)),1561       op=Add(), right=Num(n=1)))1562    ], orelse=[])1563   Print(dest=None, values=[1564     Name(id='d', ctx=Load())1565   ], nl=True)1566 ])1567```15681569Метод `literal_eval()` принимает строку или AST, представляющее литеральное выражение, анализирует и вычисляет его, а затем возвращает полученное значение. Литеральное выражение – это выражение Python, содержащее только строки, числа, словари и т.д., но без инструкций или вызовов функций. Если нужно вычислить выражение, но нельзя принять риск безопасности при использовании [`eval()`](https://python-all.ru/3.0/library/functions.html#eval), `literal_eval()` выполнит это безопасно:15701571```python1572>>> literal = '("a", "b", {2:4, 3:8, 1:2})'1573>>> print ast.literal_eval(literal)1574('a', 'b', {1: 2, 2: 4, 3: 8})1575>>> print ast.literal_eval('"a" + "b"')1576Traceback (most recent call last):1577  ...1578ValueError: malformed string1579```15801581The module also includes `NodeVisitor` and `NodeTransformer` classes for traversing and modifying an AST, and functions for common transformations such as changing line numbers.15821583### Модуль `future_builtins`15841585Python 3.0 вносит множество изменений в набор встроенных функций, и большинство из них нельзя перенести в серию Python 2.x, так как это нарушит совместимость. Модуль `future_builtins` предоставляет версии этих встроенных функций, которые можно импортировать при написании кода, совместимого с Python 3.0.15861587Функции в этом модуле в настоящее время включают:15881589- `ascii(obj)`: эквивалентно [`repr()`](https://python-all.ru/3.0/library/functions.html#repr). В Python 3.0 [`repr()`](https://python-all.ru/3.0/library/functions.html#repr) будет возвращать строку Unicode, а [`ascii()`](https://python-all.ru/3.0/library/functions.html#ascii) будет возвращать чистую ASCII-байтовую строку.1590- `filter(predicate, iterable)`,\\n`map(func, iterable1, ...)`: версии 3.0\\nвозвращают итераторы, в отличие от встроенных функций 2.x, которые возвращают списки.1591- `hex(value)`, `oct(value)`: вместо вызова методов `__hex__()` или `__oct__()` эти версии будут вызывать метод [`__index__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__index__) и преобразовывать результат в шестнадцатеричное или восьмеричное представление. [`oct()`](https://python-all.ru/3.0/library/functions.html#oct) будет использовать новую нотацию `0o` для своего результата.15921593### Модуль [`json`](https://python-all.ru/3.0/library/json.html#module-json): JavaScript Object Notation15941595Новый модуль [`json`](https://python-all.ru/3.0/library/json.html#module-json) поддерживает кодирование и декодирование типов Python в JSON (Javascript Object Notation). JSON – это легковесный формат обмена данными, часто используемый в веб-приложениях. Дополнительную информацию о JSON можно найти по адресу [http://www.json.org](https://python-all.ru/3.0/whatsnew/2.6.html).15961597[`json`](https://python-all.ru/3.0/library/json.html#module-json) поддерживает декодирование и кодирование большинства встроенных типов Python.\\nСледующий пример кодирует и декодирует словарь:15981599```python1600>>> import json1601>>> data = {"spam" : "foo", "parrot" : 42}1602>>> in_json = json.dumps(data) # Закодировать данные1603>>> in_json1604'{"parrot": 42, "spam": "foo"}'1605>>> json.loads(in_json) # Декодировать в объект Python1606{"spam" : "foo", "parrot" : 42}1607```16081609Также можно написать собственные декодеры и кодеры для поддержки большего количества типов. Также поддерживается pretty-printing JSON-строк.16101611[`json`](https://python-all.ru/3.0/library/json.html#module-json) (изначально назывался simplejson) был написан Бобом Ипполито.16121613### Модуль [`plistlib`](https://python-all.ru/3.0/library/plistlib.html#module-plistlib): парсер Property-List16141615Формат `.plist` широко используется в Mac OS X для хранения базовых типов данных (чисел, строк, списков и словарей) путём их сериализации в XML-подобный формат. Он напоминает сериализацию типов данных XML-RPC.16161617Несмотря на то, что этот формат в основном используется в Mac OS X, в нём нет ничего специфичного для Mac, и реализация на Python работает на любой платформе, которую поддерживает Python, поэтому модуль [`plistlib`](https://python-all.ru/3.0/library/plistlib.html#module-plistlib) был перенесён в стандартную библиотеку.16181619Использовать модуль просто:16201621```python1622import sys1623import plistlib1624import datetime16251626# Создать структуру данных1627data_struct = dict(lastAccessed=datetime.datetime.now(),1628                   version=1,1629                   categories=('Personal','Shared','Private'))16301631# Создать строку, содержащую XML.1632plist_str = plistlib.writePlistToString(data_struct)1633new_struct = plistlib.readPlistFromString(plist_str)1634print data_struct1635print new_struct16361637# Записать структуру данных в файл и прочитать её обратно.1638plistlib.writePlist(data_struct, '/tmp/customizations.plist')1639new_struct = plistlib.readPlist('/tmp/customizations.plist')16401641# read/writePlist принимает как файлоподобные объекты, так и пути.1642plistlib.writePlist(data_struct, sys.stdout)1643```16441645### Улучшения ctypes16461647Томас Хеллер продолжал поддерживать и улучшать модуль [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes).16481649[`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) теперь поддерживает тип данных `c_bool`, представляющий тип C99 `bool`. (Предложено Дэвидом Ремалем; [issue 1649190](https://python-all.ru/3.0/whatsnew/2.6.html).)16501651Типы строк, буферов и массивов [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) получили улучшенную поддержку расширенного синтаксиса срезов, где можно указывать различные комбинации `(start, stop, step)`. (Реализовано Томасом Ваутерсом.)16521653Все типы данных [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) теперь поддерживают методы `from_buffer()` и `from_buffer_copy()`, которые создают экземпляр ctypes на основе предоставленного буферного объекта. `from_buffer_copy()` копирует содержимое объекта, а `from_buffer()` использует ту же область памяти.16541655Новое соглашение о вызовах указывает [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) очищать переменные `errno` или Win32 LastError при каждом обёрнутом вызове. (Реализовано Томасом Хеллером; [issue 1798](https://python-all.ru/3.0/whatsnew/2.6.html).)16561657Теперь можно получить значение переменной Unix `errno` после вызова функции. При создании обёрнутой функции можно передать `use_errno=True` в качестве именованного параметра функции `DLL()`, а затем вызывать методы модуля `set_errno()` и `get_errno()` для установки и получения значения ошибки.16581659Переменная Win32 LastError аналогичным образом поддерживается функциями `DLL()`, `OleDLL()` и `WinDLL()`. Необходимо передать `use_last_error=True` в качестве именованного параметра, а затем вызывать методы модуля `set_last_error()` и `get_last_error()`.16601661Функция `byref()`, используемая для получения указателя на экземпляр ctypes, теперь имеет необязательный параметр *offset*, который представляет собой количество байтов, добавляемое к возвращаемому указателю.16621663### Улучшенная поддержка SSL16641665Билл Янссен внёс значительные улучшения в поддержку Secure Sockets Layer в Python 2.6, добавив новый модуль [`ssl`](https://python-all.ru/3.0/library/ssl.html#module-ssl), построенный на основе библиотеки [OpenSSL](https://python-all.ru/3.0/whatsnew/2.6.html). Этот новый модуль предоставляет более тонкий контроль над согласованным протоколом, используемыми сертификатами X.509 и лучше поддерживает написание SSL-серверов (в отличие от клиентов) на Python. Существующая поддержка SSL в модуле [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) не была удалена и продолжает работать, хотя она будет удалена в Python 3.0.16661667Чтобы использовать новый модуль, сначала необходимо обычным способом создать TCP-соединение, а затем передать его функции [`ssl.wrap_socket()`](https://python-all.ru/3.0/library/ssl.html#ssl.wrap_socket). Можно указать, требуется ли сертификат, и получить информацию о сертификате, вызвав метод `getpeercert()`.16681669> **См. также**1670>1671> Документация по модулю [`ssl`](https://python-all.ru/3.0/library/ssl.html#module-ssl).16721673## Изменения в сборке и C API16741675Изменения процесса сборки Python и C API включают:16761677- Теперь Python должен компилироваться компиляторами C89 (спустя 19\\nлет!). Это означает, что дерево исходного кода Python отказалось от собственных\\nреализаций `memmove` и `strerror`, которые\\nвходят в стандартную библиотеку C89.1678- Python 2.6 можно собрать с помощью Microsoft Visual Studio 2008 (версия 9.0), и это новый компилятор по умолчанию. Файлы сборки находятся в каталоге `PCbuild`. (Реализовано Кристианом Хаймсом.)1679- На Mac OS X Python 2.6 можно скомпилировать как универсальную сборку с четырьмя архитектурами. Скрипт **configure** принимает ключ *--with-universal-archs=\[32-bit|64-bit|all\]*, который определяет, собирать ли двоичные файлы для 32-разрядных архитектур (x86, PowerPC), 64-разрядных (x86-64 и PPC-64) или для обеих. (Предложено Рональдом Оссуреном.)1680- Модуль BerkeleyDB теперь имеет объект C API, доступный как\\n`bsddb.db.api`. Этот объект может использоваться другими расширениями C,\\nкоторые хотят использовать модуль `bsddb` для своих целей.\\n(Автор: Duncan Grisby; [issue 1551895](https://python-all.ru/3.0/whatsnew/2.6.html).)1681- Новый интерфейс буферов, описанный ранее в\\n[разделе PEP 3118](https://python-all.ru/3.0/whatsnew/2.6.html#pep-3118-revised-buffer-protocol),\\nдобавляет [`PyObject_GetBuffer`](https://python-all.ru/3.0/c-api/buffer.html#PyObject_GetBuffer) и [`PyBuffer_Release`](https://python-all.ru/3.0/c-api/buffer.html#PyBuffer_Release),\\nа также несколько других функций.1682- Использование Python библиотеки C stdio теперь потокобезопасно, по крайней мере\\nнастолько, насколько потокобезопасна сама нижележащая библиотека. Ранее потенциальная\\nошибка возникала, если один поток закрывал файловый объект, в то время как другой поток\\nчитал из него или записывал в него. В 2.6 файловые объекты\\nимеют счётчик ссылок, которым управляют функции\\n`PyFile_IncUseCount` и `PyFile_DecUseCount`.\\nФайловые объекты нельзя закрыть, пока счётчик ссылок\\nне равен нулю. `PyFile_IncUseCount` следует вызывать, пока GIL\\nвсё ещё удерживается, перед выполнением операции ввода-вывода с использованием\\nуказателя `FILE *`, а `PyFile_DecUseCount` следует вызывать\\nсразу после повторного захвата GIL.\\n(Авторы: Antoine Pitrou и Gregory P. Smith.)1683- Одновременный импорт модулей в двух разных потоках больше не приводит к взаимоблокировке; теперь будет возбуждаться [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError). Новая функция API,\\n[`PyImport_ImportModuleNoBlock`](https://python-all.ru/3.0/c-api/import.html#PyImport_ImportModuleNoBlock), сначала ищет модуль в\\n`sys.modules`, а затем пытается импортировать его после\\nполучения блокировки импорта. Если блокировка импорта удерживается другим\\nпотоком, возбуждается [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError).\\n(Автор: Christian Heimes.)1684- Несколько функций возвращают информацию о поддержке чисел с плавающей запятой на платформе.\\n[`PyFloat_GetMax`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetMax) возвращает\\nмаксимальное представимое значение с плавающей запятой,\\nа [`PyFloat_GetMin`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetMin) возвращает минимальное\\nположительное значение. [`PyFloat_GetInfo`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetInfo) возвращает объект,\\nсодержащий дополнительную информацию из файла `float.h`, такую как\\n`"mant_dig"` (количество цифр в мантиссе), `"epsilon"`\\n(наименьшая разница между 1.0 и следующим большим представимым значением),\\nи некоторые другие.\\n(Автор: Christian Heimes; [issue 1534](https://python-all.ru/3.0/whatsnew/2.6.html).)1685- C-функции и методы, использующие\\n[`PyComplex_AsCComplex`](https://python-all.ru/3.0/c-api/complex.html#PyComplex_AsCComplex), теперь будут принимать аргументы, у которых\\nесть метод [`__complex__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__complex__). В частности, функции модуля\\n[`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) теперь будут принимать объекты с этим методом.\\nЭто обратный перенос изменения из Python 3.0.\\n(Автор: Mark Dickinson; [issue 1675423](https://python-all.ru/3.0/whatsnew/2.6.html).)1686- C API Python теперь включает две функции для сравнения строк без учёта регистра: `PyOS_stricmp(char*, char*)` и `PyOS_strnicmp(char*, char*, Py_ssize_t)`. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.0/whatsnew/2.6.html).)1687- Многие расширения на C определяют собственные маленькие макросы для добавления целых чисел и строк в словарь модуля в функции `init*`. Python 2.6 наконец-то определяет стандартные макросы для добавления значений в модуль: [`PyModule_AddStringMacro`](https://python-all.ru/3.0/c-api/module.html#PyModule_AddStringMacro) и [`PyModule_AddIntMacro()`](https://python-all.ru/3.0/c-api/module.html#PyModule_AddIntMacro). (Предложено Кристианом Хаймсом.)1688- Некоторые макросы были переименованы как в Python 3.0, так и в 2.6, чтобы яснее показать, что это макросы, а не функции. `Py_Size()` стал `Py_SIZE()`, `Py_Type()` стал `Py_TYPE()`, а `Py_Refcnt()` стал `Py_REFCNT()`. Макросы со смешанным регистром по-прежнему доступны в Python 2.6 для обратной совместимости. ([issue 1629](https://python-all.ru/3.0/whatsnew/2.6.html))1689- Distutils теперь помещает расширения на C, которые он собирает, в другой каталог при работе с отладочной версией Python. (Предложено Коллином Уинтером; [issue 1530959](https://python-all.ru/3.0/whatsnew/2.6.html).)1690- Некоторые базовые типы данных, такие как целые числа и строки, поддерживают внутренние списки свободных объектов, которые можно повторно использовать. Структуры данных для этих списков теперь следуют соглашению об именовании: переменная всегда называется `free_list`, счётчик всегда называется `numfree`, и всегда определяется макрос `Py<typename>_MAXFREELIST`.1691- Новая цель Makefile, «make patchcheck», подготавливает исходное дерево Python к созданию патча: исправляет завершающие пробелы во всех изменённых файлах `.py`, проверяет, была ли изменена документация, и сообщает, обновлены ли файлы `Misc/ACKS` и `Misc/NEWS`. (Предложено Бреттом Кэнноном.)16921693  Еще одна новая цель, «make profile-opt», компилирует двоичный файл Python с использованием профильно-ориентированной оптимизации GCC. Она компилирует Python с включенным профилированием, запускает набор тестов для получения набора результатов профилирования, а затем компилирует с использованием этих результатов для оптимизации. (Автор: Грегори П. Смит.)16941695### Изменения для конкретных платформ: Windows16961697- Поддержка Windows 95, 98, ME и NT4 прекращена. Python 2.6 требует по крайней мере Windows 2000 SP4.1698- Новым компилятором по умолчанию на Windows стал Visual Studio 2008 (версия 9.0). Каталоги сборки для Visual Studio 2003 (версия 7.1) и 2005 (версия 8.0) были перемещены в каталог PC/. Новый каталог `PCbuild` поддерживает кросс-компиляцию для X64, отладочные сборки и профильную оптимизацию (PGO). Сборки с PGO примерно на 10% быстрее обычных. (Предложено Кристианом Хаймсом с помощью Амаури Форжо д'Арк и Мартина фон Лёвиса.)1699- Модуль [`msvcrt`](https://python-all.ru/3.0/library/msvcrt.html#module-msvcrt) теперь поддерживает как обычные, так и широкосимвольные варианты консольного I/O API. Функция `getwch()` считывает нажатие клавиши и возвращает значение Unicode, так же как и функция `getwche()`. Функция `putwch()` принимает символ Unicode и выводит его на консоль. (Предложено Кристианом Хаймсом.)1700- [`os.path.expandvars()`](https://python-all.ru/3.0/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Предложено Джозайей Карлсоном; [issue 957650](https://python-all.ru/3.0/whatsnew/2.6.html).)1701- Объекты сокетов модуля [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) теперь имеют метод\\n`ioctl()`, который предоставляет ограниченный интерфейс к\\nсистемному интерфейсу `WSAIoctl`.1702- Модуль `_winreg` теперь имеет функцию `ExpandEnvironmentStrings()`, которая раскрывает ссылки на переменные окружения, такие как `%NAME%`, во входной строке. Объекты-дескрипторы, предоставляемые этим модулем, теперь поддерживают протокол контекста, поэтому их можно использовать в операторах [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with). (Предложено Кристианом Хаймсом.)17031704  `_winreg` также имеет лучшую поддержку систем x64, предоставляя функции `DisableReflectionKey()`, `EnableReflectionKey()` и `QueryReflectionKey()`, которые включают и отключают отражение реестра для 32-разрядных процессов, работающих в 64-разрядных системах. ([issue 1753245](https://python-all.ru/3.0/whatsnew/2.6.html))1705- Объект `Record` модуля [`msilib`](https://python-all.ru/3.0/library/msilib.html#module-msilib) получил методы `GetInteger()` и `GetString()`, которые возвращают значения полей как целое число или строку. (Предложено Флорисом Брюнноге; [issue 2125](https://python-all.ru/3.0/whatsnew/2.6.html).)17061707### Изменения для конкретных платформ: Mac OS X17081709- При компиляции фреймворк-сборки Python теперь можно указать имя фреймворка, передав опцию *--with-framework-name=* скрипту **configure**.1710- Модуль `macfs` был удалён. Это, в свою очередь, потребовало удаления функции `macostools.touched()`, поскольку она зависела от модуля `macfs`. ([issue 1490190](https://python-all.ru/3.0/whatsnew/2.6.html))1711- Многие другие модули Mac OS объявлены устаревшими и будут удалены в Python 3.0: `_builtinSuites`, `aepack`, `aetools`, `aetypes`, `applesingle`, `appletrawmain`, `appletrunner`, `argvemulator`, `Audio_mac`, `autoGIL`, `Carbon`, `cfmfile`, `CodeWarrior`, `ColorPicker`, `EasyDialogs`, `Explorer`, `Finder`, `FrameWork`, `findertools`, `ic`, `icglue`, `icopen`, `macerrors`, `MacOS`, `macfs`, `macostools`, `macresource`, `MiniAEFrame`, `Nav`, `Netscape`, `OSATerminology`, `pimp`, `PixMapWrapper`, `StdSuites`, `SystemEvents`, `Terminal` и `terminalcommand`.17121713### Изменения для конкретных портов: IRIX17141715Ряд старых модулей, специфичных для IRIX, объявлены устаревшими и будут удалены в Python 3.0: `al` и `AL`, `cd`, `cddb`, `cdplayer`, `CL` и `cl`, `DEVICE`, `ERRNO`, `FILE`, `FL` и `fl`, `flp`, `fm`, `GET`, `GLWS`, `GL` и `gl`, `IN`, `IOCTL`, `jpeg`, `panelparser`, `readcd`, `SV` и `sv`, `torgb`, `videoreader` и `WAIT`.17161717## Перенос на Python 2.617181719В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:17201721- Классы, которые не должны быть хешируемыми, должны устанавливать `__hash__ = None` в своих определениях, чтобы указать на этот факт.1722- Строковые исключения удалены. Попытка их использовать вызывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).1723- Метод [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__) класса [`collections.deque`](https://python-all.ru/3.0/library/collections.html#collections.deque) теперь очищает все существующие содержимое deque перед добавлением элементов из итерируемого объекта. Это изменение приводит поведение в соответствие с `list.__init__()`.1724- [`object.__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__) ранее принимал произвольные позиционные и именованные аргументы, игнорируя их. В Python 2.6 это больше не допускается и приводит к [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). Это повлияет на методы [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__), которые в конечном итоге вызывают соответствующий метод у [`object`](https://python-all.ru/3.0/library/functions.html#object) (возможно, через использование [`super()`](https://python-all.ru/3.0/library/functions.html#super)). См. обсуждение в [issue 1683368](https://python-all.ru/3.0/whatsnew/2.6.html).1725- Конструктор `Decimal` теперь принимает начальные и конечные пробелы при передаче строки. Ранее он возбуждал исключение `InvalidOperation`. С другой стороны, метод `create_decimal()` объектов `Context` теперь явно запрещает лишние пробелы, возбуждая исключение `ConversionSyntax`.1726- Из-за случайности в реализации, при передаче пути к файлу встроенной функции [`__import__()`](https://python-all.ru/3.0/library/functions.html#__import__) она фактически импортировала указанный файл. Однако это никогда не предполагалось работать, и теперь реализация явно проверяет этот случай и возбуждает [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError).1727- C API: функции [`PyImport_Import`](https://python-all.ru/3.0/c-api/import.html#PyImport_Import) и [`PyImport_ImportModule`](https://python-all.ru/3.0/c-api/import.html#PyImport_ImportModule)\\nтеперь по умолчанию выполняют абсолютный импорт, а не относительный.\\nЭто повлияет на расширения C, которые импортируют другие модули.1728- C API: типы данных расширений, которые не должны быть хэшируемыми,\\nдолжны определять свой слот `tp_hash` как\\n[`PyObject_HashNotImplemented`](https://python-all.ru/3.0/c-api/object.html#PyObject_HashNotImplemented).1729- В модуле [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) исключение [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error) теперь наследуется от [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError). Ранее оно не было подклассом `StandardError`, но теперь им стало через [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError). (Реализовано Грегори П. Смитом; [issue 1706815](https://python-all.ru/3.0/whatsnew/2.6.html).)1730- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразования не обязательно была корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и `time` . ([issue 1330538](https://python-all.ru/3.0/whatsnew/2.6.html))1731- (Режим предупреждения 3.0) Класс `Exception` теперь выдаёт предупреждение\\nпри доступе с помощью среза или индекса; поведение `Exception`\\nкак кортежа постепенно прекращается.1732- (Режим предупреждений для версии 3.0) Сравнения на неравенство между двумя словарями или двумя объектами, не реализующими методы сравнения, теперь выводят предупреждения. `dict1 == dict2` всё ещё работает, но `dict1 < dict2` постепенно убирается.17331734  Сравнения между ячейками (cells), которые являются деталью реализации правил области видимости Python, также вызывают предупреждения, поскольку такие сравнения полностью запрещены в 3.0.17351736## Благодарности17371738Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.1739