Содержание страницы
Что нового в Python 2.6¶What’s New in Python 2.6
- Автор
А. М. Кухлинг (amk at amk.ca)
В этой статье описываются новые возможности Python 2.6, выпущенного 1 октября 2008 года. График выпуска описан в PEP 361.
Основная тема Python 2.6 – подготовка пути к миграции на Python 3.0, крупное перепроектирование языка. По возможности Python 2.6 включает новые возможности и синтаксис из версии 3.0, оставаясь совместимым с существующим кодом за счёт того, что не удаляет старые возможности или синтаксис. Когда это невозможно, Python 2.6 старается сделать всё возможное, добавляя функции совместимости в модуле future_builtins и ключ -3 для предупреждения об использовании, которое станет неподдерживаемым в версии 3.0.
В стандартную библиотеку были добавлены некоторые важные новые пакеты, такие как модули multiprocessing и json, но новых возможностей, не связанных так или иначе с Python 3.0, не так много.
Python 2.6 также содержит ряд улучшений и исправлений ошибок по всему исходному коду. Поиск по журналам изменений показывает, что между Python 2.5 и 2.6 было применено 259 патчей и исправлено 612 ошибок. Обе цифры, вероятно, занижены.
Эта статья не пытается дать полную спецификацию новых возможностей, а вместо этого предоставляет удобный обзор. За подробностями обращайтесь к документации Python 2.6. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности. По возможности «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.
Python 3.0¶
Цикл разработки версий Python 2.6 и 3.0 был синхронизирован: альфа- и бета-релизы для обеих версий выходили в одни и те же дни. Разработка версии 3.0 повлияла на многие возможности в версии 2.6.
Python 3.0 – это масштабное перепроектирование Python, которое нарушает совместимость с серией 2.x. Это означает, что существующий код Python потребует некоторой конвертации, чтобы работать на Python 3.0. Однако не все изменения в 3.0 обязательно нарушают совместимость. В тех случаях, когда новые возможности не приводят к нарушению существующего кода, они были перенесены в 2.6 и описаны в этом документе в соответствующих разделах. Некоторые из возможностей, заимствованных из 3.0:
Метод
__complex__()для преобразования объектов в комплексное число.Альтернативный синтаксис для перехвата исключений:
except TypeError as exc.Добавление
functools.reduce()как синонима для встроенной функцииreduce().
Python 3.0 добавляет несколько новых встроенных функций и изменяет семантику некоторых существующих. Функции, новые в 3.0, такие как bin(), были просто добавлены в Python 2.6, но существующие встроенные функции не были изменены; вместо этого модуль future_builtins содержит версии с новой семантикой 3.0. Код, написанный для совместимости с 3.0, может при необходимости делать from future_builtins import hex, map.
Новый ключ командной строки -3 включает предупреждения о возможностях, которые будут удалены в Python 3.0. Вы можете запускать код с этим ключом, чтобы увидеть, сколько работы потребуется для переноса кода на 3.0. Значение этого ключа доступно в коде Python как логическая переменная sys.py3kwarning, а в коде расширений C – как Py_Py3kWarningFlag.
Изменения в процессе разработки¶Changes to the Development Process
Во время разработки 2.6 процесс разработки Python претерпел два существенных изменения: мы перешли с системы отслеживания ошибок SourceForge на настраиваемую установку Roundup, а документация была преобразована из LaTeX в reStructuredText.
Новая система отслеживания ошибок: Roundup¶New Issue Tracker: Roundup
Долгое время разработчики Python были всё более недовольны системой отслеживания ошибок SourceForge. Решение SourceForge, предоставляемое как услуга, не допускает значительной настройки; например, невозможно было настроить жизненный цикл задач.
Поэтому комитет по инфраструктуре Python Software Foundation объявил конкурс на системы отслеживания ошибок, попросив добровольцев настроить различные продукты и импортировать некоторые ошибки и патчи из SourceForge. Были рассмотрены четыре различные системы: Jira, Launchpad, Roundup и Trac. В конечном итоге комитет остановился на Jira и Roundup как на двух кандидатах. Jira – коммерческий продукт, который бесплатно предоставляет размещённые экземпляры для проектов свободного программного обеспечения; Roundup – проект с открытым исходным кодом, требующий добровольцев для его администрирования и сервера для его размещения.
После объявления призыва добровольцев была установлена новая установка Roundup по адресу https://bugs.python.org. Одна установка Roundup может обслуживать несколько систем отслеживания, и этот сервер теперь также размещает системы отслеживания ошибок для Jython и для веб-сайта Python. В будущем он, несомненно, найдёт и другое применение. Там, где это возможно, это издание «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.
Хостинг для баг-трекера Python любезно предоставлен компанией Upfront Systems из Стелленбоша, ЮАР. Мартин фон Лёвис проделал большую работу по импорту существующих ошибок и патчей из SourceForge; его скрипты для этой операции находятся по адресу http://svn.python.org/view/tracker/importer/ и могут быть полезны другим проектам, желающим перейти с SourceForge на Roundup.
См. также
- https://bugs.python.org
Система отслеживания ошибок Python.
- http://bugs.jython.org:
Система отслеживания ошибок Jython.
- http://roundup.sourceforge.net/
Загрузки и документация Roundup.
- http://svn.python.org/view/tracker/importer/
Скрипты конвертации Мартина фон Лёвиса.
Новый формат документации: reStructuredText с использованием Sphinx¶New Documentation Format: reStructuredText Using Sphinx
Документация Python писалась с использованием LaTeX с момента запуска проекта около 1989 года. В 1980-х и начале 1990-х большинство документации распечатывалось для последующего изучения, а не просматривалось онлайн. LaTeX широко использовался, поскольку он обеспечивал привлекательный печатный вывод, оставаясь при этом простым в написании после освоения основных правил разметки.
Сегодня LaTeX всё ещё используется для написания публикаций, предназначенных для печати, но ландшафт инструментов программирования изменился. Мы больше не распечатываем кипы документации; вместо этого мы просматриваем её онлайн, и HTML стал самым важным форматом для поддержки. К сожалению, конвертация LaTeX в HTML довольно сложна, и Фред Л. Дрейк-младший, многолетний редактор документации Python, потратил много времени на поддержание процесса конвертации. Время от времени предлагали перевести документацию в SGML, а затем в XML, но выполнить хорошую конвертацию – большая задача, и никто не взял на себя необходимое для завершения работы время.
В ходе цикла разработки 2.6 Георг Брандль приложил много усилий для создания новой цепочки инструментов для обработки документации. Полученный пакет называется Sphinx и доступен по адресу http://sphinx-doc.org/.
Sphinx ориентируется на вывод HTML, создавая привлекательно оформленный и современный HTML; печатный вывод по-прежнему поддерживается через конвертацию в LaTeX. Входной формат – reStructuredText, синтаксис разметки с поддержкой пользовательских расширений и директив, широко используемый в сообществе Python.
Sphinx – это самостоятельный пакет, который можно использовать для написания документации, и почти два десятка других проектов (перечислены на веб-сайте Sphinx) приняли Sphinx в качестве своего инструмента документирования.
См. также
- Документирование Python
Описывает, как писать документацию для Python.
- Sphinx
Документация и код для инструментария Sphinx.
- Docutils
Базовый парсер reStructuredText и набор инструментов.
PEP 343: Оператор ‘with’¶PEP 343: The ‘with’ statement
Предыдущая версия, Python 2.5, добавила оператор ‘with’ как опциональную возможность, включаемую директивой from __future__
import with_statement. В версии 2.6 оператор больше не требует специального включения; это означает, что with теперь всегда является ключевым словом. Остальная часть этого раздела является копией соответствующего раздела из документа «What’s New in Python 2.5»; если вы знакомы с оператором ‘with’ из Python 2.5, можете пропустить этот раздел.
Оператор ‘with’ делает код понятнее, который ранее использовал блоки try...finally для гарантии выполнения кода очистки. В этом разделе я расскажу об операторе в его обычном использовании. В следующем разделе я рассмотрю детали реализации и покажу, как писать объекты для использования с этим оператором.
Оператор ‘with’ – это управляющая структура, базовая структура которой:
with expression [as variable]:
with-block
Выражение вычисляется, и в результате должен получиться объект, поддерживающий протокол управления контекстом (то есть имеющий методы __enter__() и __exit__()).
Метод __enter__() объекта вызывается перед выполнением блока with и поэтому может выполнять код настройки. Он также может возвращать значение, которое связывается с именем переменная, если оно указано. (Обратите внимание, что переменная не присваивается результат выражения.)
После завершения выполнения блока with вызывается метод __exit__() объекта, даже если блок вызвал исключение, и поэтому он может выполнить код очистки.
Некоторые стандартные объекты Python теперь поддерживают протокол управления контекстом и могут использоваться с оператором ‘with’. Файловые объекты – один из примеров:
with open('/etc/passwd', 'r') as f:
for line in f:
print line
... more processing code ...
После выполнения этого оператора файловый объект f будет автоматически закрыт, даже если цикл for вызвал исключение в середине блока.
Примечание
В этом случае f – это тот же объект, созданный open(), потому что file.__enter__() возвращает self.
Блокировки и переменные условия модуля threading также поддерживают оператор ‘with’:
lock = threading.Lock()
with lock:
# Критическая секция кода
...
Блокировка захватывается перед выполнением блока и всегда освобождается после завершения блока.
Функция localcontext() в модуле decimal упрощает
сохранение и восстановление текущего десятичного контекста, который инкапсулирует желаемые
характеристики точности и округления для вычислений:
from decimal import Decimal, Context, localcontext
# Отображается с точностью по умолчанию в 28 знаков
v = Decimal('578')
print v.sqrt()
with localcontext(Context(prec=16)):
# Весь код в этом блоке использует точность в 16 знаков.
# Исходный контекст восстанавливается при выходе из блока.
print v.sqrt()
Написание контекстных менеджеров¶Writing Context Managers
Под капотом оператор ‘with’ довольно сложен. Большинство людей будут использовать ‘with’ только с существующими объектами и не нуждаются в знании этих деталей, поэтому вы можете пропустить остальную часть этого раздела, если захотите. Авторам новых объектов потребуется понять детали базовой реализации, и им стоит продолжить чтение.
Объяснение протокола управления контекстом на высоком уровне:
Выражение вычисляется и должно дать объект, называемый «контекстный менеджер». Контекстный менеджер должен иметь методы
__enter__()и__exit__().Вызывается метод
__enter__()контекстного менеджера. Возвращённое значение присваивается VAR. Если конструкцияas VARотсутствует, значение просто игнорируется.Код внутри блока выполняется.
Если блок вызывает исключение, метод
__exit__()контекстного менеджера вызывается с тремя аргументами: сведениями об исключении (type, value, traceback, те же значения, которые возвращаетsys.exc_info(), а также могут бытьNone, если исключение не произошло). Возвращаемое значение метода определяет, будет ли исключение возбуждено повторно: любое ложное значение вызывает повторное возбуждение, аTrueприведёт к его подавлению. Подавлять исключение нужно редко, потому что если это сделать, автор кода, содержащего оператор 'with', никогда не узнает, что что-то пошло не так.Если блок не вызвал исключения, метод
__exit__()всё равно вызывается, но type, value и traceback равныNone.
Рассмотрим пример. Мы не будем приводить подробный код, а лишь в общих чертах опишем методы, необходимые для базы данных, поддерживающей транзакции.
(Для тех, кто не знаком с терминологией баз данных: набор изменений в базе данных группируется в транзакцию. Транзакции могут быть либо зафиксированы (committed) – это означает, что все изменения записаны в базу данных, либо откачены (rolled back) – что означает, что все изменения отменены, а база данных не изменена. За дополнительной информацией обращайтесь к любому учебнику по базам данных.)
Предположим, что существует объект, представляющий подключение к базе данных. Наша цель – позволить пользователю написать такой код:
db_connection = DatabaseConnection()
with db_connection as cursor:
cursor.execute('insert into ...')
cursor.execute('delete from ...')
# ... дополнительные операции ...
Транзакция должна быть зафиксирована, если код в блоке выполняется без ошибок, или откачена, если возникает исключение. Вот базовый интерфейс для DatabaseConnection, который мы будем предполагать:
class DatabaseConnection:
# Интерфейс базы данных
def cursor(self):
"Returns a cursor object and starts a new transaction"
def commit(self):
"Commits current transaction"
def rollback(self):
"Rolls back current transaction"
Метод __enter__() довольно прост: ему нужно только начать новую транзакцию. В данном приложении результирующий объект курсора будет полезным результатом, поэтому метод вернёт его. Затем пользователь может добавить as cursor к своему оператору 'with', чтобы привязать курсор к имени переменной.
class DatabaseConnection:
...
def __enter__(self):
# Код для запуска новой транзакции
cursor = self.cursor()
return cursor
Метод __exit__() – самый сложный, потому что именно в нём должна выполняться большая часть работы. Метод должен проверить, произошло ли исключение. Если исключения не было, транзакция фиксируется. Если было – откатывается.
В приведённом ниже коде выполнение просто дойдёт до конца функции, вернув значение по умолчанию None. Значение None ложно, поэтому исключение будет автоматически возбуждено повторно. При желании можно сделать это более явно и добавить оператор return в отмеченном месте.
class DatabaseConnection:
...
def __exit__(self, type, value, tb):
if tb is None:
# Исключения нет, поэтому фиксация
self.commit()
else:
# Произошло исключение, поэтому откат
self.rollback()
# return False
Модуль contextlib ¶The contextlib module
Модуль contextlib предоставляет несколько функций и декоратор, которые полезны при написании объектов для использования с оператором 'with'.
Декоратор называется contextmanager() и позволяет написать одну функцию-генератор вместо определения нового класса. Генератор должен генерировать ровно одно значение. Код до yield будет выполнен как метод __enter__(), а сгенерированное значение станет возвращаемым значением метода, которое будет связано с переменной в конструкции as оператора ‘with’, если она присутствует. Код после yield будет выполнен в методе __exit__(). Любое исключение, возникшее в блоке, будет возбуждено оператором yield.
Используя этот декоратор, наш пример с базой данных из предыдущего раздела можно было бы записать так:
from contextlib import contextmanager
@contextmanager
def db_transaction(connection):
cursor = connection.cursor()
try:
yield cursor
except:
connection.rollback()
raise
else:
connection.commit()
db = DatabaseConnection()
with db_transaction(db) as cursor:
...
Модуль contextlib также содержит функцию nested(mgr1, mgr2, ...), которая объединяет несколько контекстных менеджеров, чтобы не приходилось писать вложенные операторы 'with'. В этом примере один оператор 'with' одновременно запускает транзакцию базы данных и захватывает блокировку потока:
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
...
Наконец, функция closing() возвращает свой аргумент, чтобы его можно было привязать к переменной, и вызывает метод .close() переданного аргумента в конце блока.
import urllib, sys
from contextlib import closing
with closing(urllib.urlopen('http://www.yahoo.com')) as f:
for line in f:
sys.stdout.write(line)
См. также
- PEP 343 – Оператор «with»
PEP написан Гвидо ван Россумом и Ником Когланом; реализован Майком Бландом, Гвидо ван Россумом и Нилом Норвицем. В PEP показан код, генерируемый для оператора '
with', что может быть полезно для понимания того, как работает этот оператор.
Документация для модуля contextlib.
PEP 366: Явные относительные импорты из главного модуля ¶PEP 366: Explicit Relative Imports From a Main Module
Параметр командной строки -m Python позволяет запускать модуль как скрипт. Когда вы запускали модуль, находящийся внутри пакета, относительные импорты работали некорректно.
Исправление для Python 2.6 добавляет атрибут __package__ в модули. Когда этот атрибут присутствует, относительные импорты будут разрешаться относительно его значения, а не атрибута __name__.
Импортёры в стиле PEP 302 могут затем устанавливать __package__ по мере необходимости. Модуль runpy, реализующий параметр -m, теперь делает это, так что относительные импорты теперь будут корректно работать в скриптах, запускаемых изнутри пакета.
PEP 370: Персональный каталог site-packages¶PEP 370: Per-user site-packages Directory
При запуске Python путь поиска модулей sys.path обычно
включает каталог, путь к которому заканчивается на "site-packages". Этот
каталог предназначен для хранения локально установленных пакетов, доступных
всем пользователям на данной машине или в конкретной установке сайта.
Python 2.6 вводит соглашение о каталогах site, специфичных для пользователя. Каталог зависит от платформы:
Unix и Mac OS X:
~/.local/Windows:
%APPDATA%/Python
Внутри этого каталога будут подкаталоги, зависящие от версии, например lib/python2.6/site-packages в Unix/Mac OS и Python26/site-packages в Windows.
Если стандартный каталог не устраивает, его можно переопределить с помощью
переменной окружения. PYTHONUSERBASE задаёт корневой
каталог, используемый всеми версиями Python, поддерживающими эту возможность. В
Windows каталог для данных приложений можно изменить, установив
переменную окружения APPDATA. Также можно
изменить файл site.py для вашей установки Python.
Эту возможность можно полностью отключить, запустив Python с параметром -s или установив переменную окружения PYTHONNOUSERSITE.
См. также
- PEP 370 – Персональный каталог
site-packages PEP написан и реализован Кристианом Хеймсом.
PEP 371: multiprocessing Пакет¶PEP 371: The multiprocessing Package
Новый пакет multiprocessing позволяет программам Python создавать новые процессы, которые будут выполнять вычисления и возвращать результат родительскому процессу. Родительский и дочерние процессы могут обмениваться данными через очереди и каналы, синхронизировать свои операции с помощью блокировок и семафоров, а также совместно использовать простые массивы данных.
Модуль multiprocessing изначально был точной эмуляцией
модуля threading, использующей процессы вместо потоков. Эта
цель была отброшена на пути к Python 2.6, но общий
подход модуля остаётся похожим. Основным классом
является Process, которому передаётся вызываемый объект и
набор аргументов. Метод start()
запускает вызываемый объект в подпроцессе, после чего можно вызвать
метод is_alive(), чтобы проверить, работает ли подпроцесс,
и метод join(), чтобы дождаться завершения процесса.
Вот простой пример, где подпроцесс вычисляет факториал. Функция, выполняющая вычисление, написана так, что она работает значительно дольше, когда входной аргумент кратен 4.
import time
from multiprocessing import Process, Queue
def factorial(queue, N):
"Compute a factorial."
# Если N кратно 4, эта функция будет выполняться намного дольше
if (N % 4) == 0:
time.sleep(.05 * N/4)
# Вычислить результат
fact = 1L
for i in range(1, N+1):
fact = fact * i
# Поместить результат в очередь
queue.put(fact)
if __name__ == '__main__':
queue = Queue()
N = 5
p = Process(target=factorial, args=(queue, N))
p.start()
p.join()
result = queue.get()
print 'Factorial', N, '=', result
Для передачи результата вычисления факториала используется Queue. Объект Queue хранится в глобальной переменной. Дочерний процесс будет использовать значение переменной на момент своего создания; поскольку это Queue, родительский и дочерний процессы могут обмениваться данными через этот объект. (Если бы родитель изменил значение глобальной переменной, значение дочернего процесса не изменилось бы, и наоборот.)
Два других класса, Pool и Manager, предоставляют
интерфейсы более высокого уровня. Pool создаёт фиксированное количество
рабочих процессов, и запросы затем можно распределять между рабочими процессами
с помощью вызова apply() или apply_async() для добавления одного запроса
и map() или map_async() для добавления нескольких
запросов. В следующем коде используется Pool для распределения запросов
по 5 рабочим процессам и получения списка результатов:
from multiprocessing import Pool
def factorial(N, dictionary):
"Compute a factorial."
...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
print v
Это даёт следующий вывод:
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
Другой интерфейс высокого уровня, класс Manager, создаёт
отдельный серверный процесс, который может хранить главные копии структур данных
Python. Другие процессы затем могут получать доступ и изменять эти структуры
данных с помощью прокси-объектов. В следующем примере создаётся
общий словарь вызовом метода dict(); рабочие
процессы затем вставляют значения в словарь. (Блокировка не
выполняется автоматически, что в данном примере не имеет значения.
Методы Manager также включают Lock(), RLock(),
и Semaphore() для создания общих блокировок.)
import time
from multiprocessing import Pool, Manager
def factorial(N, dictionary):
"Compute a factorial."
# Вычислить результат
fact = 1L
for i in range(1, N+1):
fact = fact * i
# Сохранить результат в словаре
dictionary[N] = fact
if __name__ == '__main__':
p = Pool(5)
mgr = Manager()
d = mgr.dict() # Создать общий словарь
# Запустить задачи с помощью пула
for N in range(1, 1000, 10):
p.apply_async(factorial, (N, d))
# Отметить пул как закрытый – больше задач добавить нельзя
p.close()
# Ожидать завершения задач
p.join()
# Вывести результаты
for k, v in sorted(d.items()):
print k, v
Это выведет следующий результат:
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
См. также
Документация модуля multiprocessing.
- PEP 371 – Добавление пакета multiprocessing
PEP написан Джесси Ноллером и Ричардом Удкерком; реализован Ричардом Удкерком и Джесси Ноллером.
PEP 3101: Расширенное форматирование строк¶PEP 3101: Advanced String Formatting
В Python 3.0 оператор % дополнен более мощным методом форматирования строк format(). Поддержка метода str.format() была перенесена в Python 2.6.
В версии 2.6 как 8-битные, так и строки Unicode имеют метод .format(), который рассматривает строку как шаблон и принимает аргументы для форматирования. Шаблон форматирования использует фигурные скобки ({, }) в качестве специальных символов:
>>> # Подставить позиционный аргумент 0 в строку
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # Использовать именованные аргументы-ключевые слова
>>> "User ID: {uid} Last seen: {last_login}".format(
... uid="root",
... last_login = "5 Mar 2008 07:20")
'User ID: root Last seen: 5 Mar 2008 07:20'
Фигурные скобки можно экранировать, удваивая их:
>>> "Empty dict: {{}}".format()
"Empty dict: {}"
Имена полей могут быть целыми числами, указывающими на позиционные аргументы, например {0}, {1} и т.д., или именами именованных аргументов. Также можно указывать составные имена полей, которые читают атрибуты или получают доступ к ключам словаря:
>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar 5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'
>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'
Обратите внимание, что при использовании нотации в стиле словаря, такой как [.mp4], не нужно заключать строку в кавычки; будет выполнено обращение к значению по ключу .mp4. Строки, начинающиеся с цифры, будут преобразованы в целое число. В строке формата нельзя писать более сложные выражения.
До сих пор мы показывали, как указать, какое поле подставить в результирующую строку. Точное форматирование также можно контролировать, добавляя двоеточие и спецификатор формата. Например:
>>> # Поле 0: выравнивание влево, заполнить до 15 символов
>>> # Поле 1: выравнивание вправо, заполнить до 6 символов
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration $ 35'
>>> fmt.format('Tutorial', 50)
'Tutorial $ 50'
>>> fmt.format('Banquet', 125)
'Banquet $ 125'
Спецификаторы формата могут ссылаться на другие поля через вложение:
>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
Выравнивание поля в заданной ширине можно указать:
Символ |
Эффект |
|---|---|
< (по умолчанию) |
Выравнивание влево |
> |
Выравнивание вправо |
^ |
По центру |
= |
(Только для числовых типов) Заполнение после знака. |
Спецификаторы формата также могут включать тип представления, который управляет форматированием значения. Например, числа с плавающей запятой могут быть отформатированы как обычное число или в экспоненциальной нотации:
>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
Доступны различные типы представления. Обратитесь к документации Python 2.6 за полным списком; вот пример:
|
Двоичный. Выводит число по основанию 2. |
|
Символьный. Преобразует целое число в соответствующий символ Unicode перед выводом. |
|
Десятичное целое. Выводит число в системе с основанием 10. |
|
Восьмеричный формат. Выводит число в системе с основанием 8. |
|
Шестнадцатеричный. Выводит число по основанию 16, используя строчные буквы для цифр старше 9. |
|
Экспоненциальная запись. Выводит число в научной нотации с использованием буквы 'e' для обозначения экспоненты. |
|
Общий формат. Выводит число в формате с фиксированной точкой, если только число не слишком велико, в этом случае переключается на экспоненциальную нотацию 'e'. |
|
Число. Аналогично 'g' (для чисел с плавающей запятой) или 'd' (для целых чисел), но с использованием текущей локали для вставки соответствующих разделителей разрядов. |
|
Проценты. Умножает число на 100 и выводит в фиксированном формате ('f'), с последующим знаком процента. |
Классы и типы могут определять метод __format__() для управления тем, как они
форматируются. Он принимает единственный аргумент – спецификатор формата:
def __format__(self, format_spec):
if isinstance(format_spec, unicode):
return unicode(str(self))
else:
return str(self)
Также существует встроенная функция format(), которая форматирует одно
значение. Она вызывает метод __format__() типа с переданным спецификатором:
>>> format(75.6564, '.2f')
'75.66'
См. также
- Синтаксис строк форматирования
Справочная документация по полям формата.
- PEP 3101 - Расширенное форматирование строк
PEP написан Талином. Реализован Эриком Смитом.
PEP 3105: print как функция¶PEP 3105: print As a Function
Оператор print в Python 3.0 становится функцией print().
Превращение print() в функцию позволяет заменить эту функцию,
написав def print(...) или импортировав новую функцию откуда-то ещё.
В Python 2.6 есть импорт __future__, который удаляет print как синтаксис
языка, позволяя вместо этого использовать функциональную форму. Например:
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
Сигнатура новой функции:
def print(*args, sep=' ', end='\n', file=None)
Параметры:
args: позиционные аргументы, значения которых будут выведены.
sep: разделитель, который будет выводиться между аргументами.
end: завершающий текст, который будет выведен после того, как все аргументы будут выведены.
file: файловый объект, в который будет отправлен вывод.
См. также
- PEP 3105 - Сделать print функцией
PEP написан Георгом Брандлом.
PEP 3110: Изменения в обработке исключений¶PEP 3110: Exception-Handling Changes
Одна ошибка, которую иногда допускают программисты Python, – написание следующего кода:
try:
...
except TypeError, ValueError: # Неверно!
...
Автор, вероятно, пытается перехватить оба исключения TypeError и
ValueError, но этот код на самом деле делает кое-что другое:
он перехватит TypeError и свяжет полученный объект исключения
с локальным именем "ValueError". Исключение ValueError не будет
перехвачено вообще. Правильный код задает кортеж исключений:
try:
...
except (TypeError, ValueError):
...
Эта ошибка возникает из-за неоднозначности использования запятой: обозначает ли она два разных узла в дереве разбора или один узел, являющийся кортежем?
Python 3.0 устраняет эту неоднозначность, заменяя запятую словом
«as». Чтобы перехватить исключение и сохранить объект исключения
в переменную exc, необходимо написать:
try:
...
except TypeError as exc:
...
Python 3.0 будет поддерживать только использование «as» и, следовательно, интерпретирует первый пример как перехват двух разных исключений. Python 2.6 поддерживает как запятую, так и «as», поэтому существующий код продолжит работать. Поэтому рекомендуется использовать «as» при написании нового кода Python, который будет выполняться только в 2.6.
См. также
- PEP 3110 - Перехват исключений в Python 3000
PEP написан и реализован Коллином Уинтером.
PEP 3112: Байтовые литералы¶PEP 3112: Byte Literals
Python 3.0 принимает Unicode в качестве основного строкового типа языка и
обозначает 8-битные литералы иначе: либо как b'string',
либо с помощью конструктора bytes. Для обратной совместимости
Python 2.6 добавляет bytes как синоним типа str,
а также поддерживает нотацию b''.
Тип str в 2.6 отличается от типа bytes в 3.0 по ряду
причин; наиболее заметно, что конструктор совершенно разный. В 3.0
bytes([65, 66, 67]) имеет длину 3 элемента и содержит байты, представляющие
ABC; в 2.6 bytes([65, 66, 67]) возвращает 12-байтовую строку,
представляющую str() списка.
Основное применение bytes в 2.6 будет заключаться в написании тестов
типа объекта, таких как isinstance(x, bytes). Это поможет конвертеру 2to3,
который не может определить, предназначены ли строки в коде 2.x для
содержания символов или 8-битных байтов; теперь можно использовать
bytes или str для точного выражения намерения,
и результирующий код также будет корректным в Python 3.0.
Также существует импорт __future__, который приводит к тому, что все строковые
литералы становятся строками Unicode. Это означает, что escape-последовательности
\u можно использовать для включения символов Unicode:
from __future__ import unicode_literals
s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
'\u3081\u3000\u751f\u305f\u307e\u3054')
print len(s) # 12 символов Unicode
На уровне C Python 3.0 переименует существующий 8-битный строковый тип,
называемый PyStringObject в Python 2.x, в PyBytesObject. Python 2.6 использует
#define для поддержки использования имён PyBytesObject(),
PyBytes_Check(), PyBytes_FromStringAndSize()
и всех остальных функций и макросов, используемых со строками.
Экземпляры типа bytes неизменяемы, как и строки. Новый тип bytearray хранит изменяемую последовательность байтов:
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
Байтовые массивы поддерживают большинство методов строковых типов, таких как
startswith()/endswith(), find()/rfind(),
и некоторые методы списков, такие как append(),
pop() и reverse().
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
Существует также соответствующий C API с функциями PyByteArray_FromObject(), PyByteArray_FromStringAndSize() и различными другими.
См. также
- PEP 3112 - Байтовые литералы в Python 3000
PEP написан Джейсоном Орендорфом; портирован в 2.6 Кристианом Хаймсом.
PEP 3116: Новая библиотека ввода-вывода¶PEP 3116: New I/O Library
Встроенные файловые объекты Python поддерживают ряд методов, но
файлоподобные объекты не обязательно поддерживают их все. Объекты,
имитирующие файлы, обычно поддерживают read() и write(), но они
могут не поддерживать readline(), например. Python 3.0 вводит
многоуровневую библиотеку ввода-вывода в модуле io, которая отделяет
буферизацию и обработку текста от основных операций чтения и записи.
Модуль io предоставляет три уровня абстрактных базовых классов:
RawIOBaseопределяет сырые операции ввода-вывода:read(),readinto(),write(),seek(),tell(),truncate()иclose(). Большинство методов этого класса часто соответствуют одному системному вызову. Также есть методыreadable(),writable()иseekable()для определения того, какие операции разрешены для данного объекта.Python 3.0 имеет конкретные реализации этого класса для файлов и сокетов, но Python 2.6 не перестраивал свои файловые объекты и сокеты таким образом.
BufferedIOBase– это абстрактный базовый класс, который буферизует данные в памяти, чтобы уменьшить количество используемых системных вызовов, делая обработку ввода-вывода более эффективной. Он поддерживает все методыRawIOBaseи добавляет атрибутraw, содержащий базовый сырой объект.Существует пять конкретных классов, реализующих этот ABC.
BufferedWriterиBufferedReaderпредназначены для объектов, поддерживающих только запись или только чтение и имеющих методseek()для произвольного доступа. ОбъектыBufferedRandomподдерживают чтение и запись в одном и том же базовом потоке, аBufferedRWPair– для таких объектов, как TTY, у которых операции чтения и записи действуют на несвязанные потоки данных. КлассBytesIOподдерживает чтение, запись и позиционирование в буфере в памяти.TextIOBase: Предоставляет функции для чтения и записи строк (помните, что в Python 3.0 строки будут в Unicode) и поддерживает универсальные символы новой строки.TextIOBaseопределяет методreadline()и поддерживает итерацию по объектам.Существует две конкретные реализации.
TextIOWrapperоборачивает буферизованный объект ввода-вывода, поддерживая все методы для текстового ввода-вывода и добавляя атрибутbufferдля доступа к нижележащему объекту.StringIOпросто буферизует все в памяти, никогда ничего не записывая на диск.(В Python 2.6
io.StringIOреализован на чистом Python, поэтому он довольно медленный. Поэтому пока лучше придерживаться существующего модуляStringIOилиcStringIO. В какой-то момент модульioPython 3.0 будет переписан на C для ускорения, и, возможно, реализация на C будет портирована на версии 2.x.)
В Python 2.6 базовые реализации не были перестроены поверх классов модуля io. Модуль предоставляется для упрощения написания кода, совместимого с будущими версиями (3.0), и для избавления разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.
См. также
- PEP 3116 - Новый ввод-вывод
PEP написан Дэниелом Штуцбахом, Майком Вердоне и Гвидо ван Россумом. Код – Гвидо ван Россум, Георг Брандль, Вальтер Дёрвальд, Джереми Хилтон, Мартин фон Лёвис, Тони Лаундс и другие.
PEP 3118: Пересмотренный буферный протокол¶PEP 3118: Revised Buffer Protocol
Буферный протокол – это C-уровневый API, который позволяет типам Python обмениваться указателями на свои внутренние представления. Например, файл, отображенный в память, можно рассматривать как буфер символов, и это позволяет другому модулю, например re, обрабатывать такие файлы как строку символов для поиска.
Основными пользователями буферного протокола являются пакеты для численных расчетов, такие как NumPy, которые предоставляют доступ к внутреннему представлению массивов, чтобы вызывающие могли записывать данные напрямую в массив, а не через более медленный API. Данный PEP обновляет буферный протокол с учетом опыта разработки NumPy, добавляя ряд новых возможностей, таких как указание формы массива или блокировка области памяти.
Важнейшая новая функция C API – PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags), которая принимает объект и набор флагов и заполняет структуру Py_buffer информацией о представлении памяти объекта. Объекты могут использовать эту операцию для блокировки памяти на месте, пока внешний вызывающий может изменять содержимое, поэтому существует соответствующая PyBuffer_Release(Py_buffer *view), чтобы указать, что внешний вызывающий завершил работу.
Аргумент flags для PyObject_GetBuffer() задает ограничения на возвращаемую память. Вот несколько примеров:
PyBUF_WRITABLEуказывает, что память должна быть доступна для записи.
PyBUF_LOCKзапрашивает блокировку только для чтения или исключительную блокировку памяти.
PyBUF_C_CONTIGUOUSиPyBUF_F_CONTIGUOUSзапрашивают C-непрерывный (последнее измерение изменяется быстрее всего) или Fortran-непрерывный (первое измерение изменяется быстрее всего) макет массива.
Два новых кода аргументов для PyArg_ParseTuple(), s* и z*, возвращают заблокированные буферные объекты для параметра.
См. также
- PEP 3118 - Пересмотр буферного протокола
PEP написан Трэвисом Олифантом и Карлом Бэнксом; реализован Трэвисом Олифантом.
PEP 3119: Абстрактные базовые классы¶PEP 3119: Abstract Base Classes
Некоторые объектно-ориентированные языки, такие как Java, поддерживают интерфейсы, объявляя, что класс имеет определенный набор методов или поддерживает определенный протокол доступа. Абстрактные базовые классы (ABC) – это аналогичная возможность для Python. Поддержка ABC состоит из модуля abc, содержащего метакласс ABCMeta, специальной обработки этого метакласса встроенными функциями isinstance() и issubclass(), а также набора базовых ABC, которые, по мнению разработчиков Python, будут широко полезны. Будущие версии Python, вероятно, добавят больше ABC.
Допустим, у вас есть некий класс, и вы хотите узнать, поддерживает ли он
доступ в стиле словаря. Однако фраза «в стиле словаря» расплывчата.
Вероятно, это означает, что доступ к элементам через obj[1] работает.
Подразумевает ли это, что установка элементов через obj[2] = value работает?
Или что объект будет иметь методы keys(), values() и items()?
А как насчёт итеративных вариантов, таких как iterkeys()? copy()
и update()? Итерация по объекту с помощью iter()?
Модуль collections в Python 2.6 включает несколько различных
ABC, которые представляют эти различия. Iterable
указывает, что класс определяет __iter__(), а
Container означает, что класс определяет метод __contains__()
и, следовательно, поддерживает выражения x in y. Базовый
интерфейс словаря (получение элементов, установка элементов, и
keys(), values() и items()) определяется
MutableMapping ABC.
Можно наследовать свои классы от конкретной ABC, чтобы указать, что они поддерживают интерфейс этой ABC:
import collections
class Storage(collections.MutableMapping):
...
Альтернативно, можно написать класс без наследования от
нужной ABC и вместо этого зарегистрировать класс, вызвав
метод register() этой ABC:
import collections
class Storage:
...
collections.MutableMapping.register(Storage)
Для классов, которые вы пишете, наследование от ABC, вероятно, понятнее.
Метод register() полезен, когда вы написали новую
ABC, которая может описывать существующий тип или класс, или если хотите
объявить, что некоторый сторонний класс реализует ABC.
Например, если определена ABC PrintableType,
допустимо сделать:
# Зарегистрировать типы Python
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
Классы должны следовать семантике, заданной ABC, но Python не может это проверить; автор класса должен сам понять требования ABC и реализовать код соответствующим образом.
Чтобы проверить, поддерживает ли объект определённый интерфейс, можно теперь написать:
def func(d):
if not isinstance(d, collections.MutableMapping):
raise ValueError("Mapping object expected, not %r" % d)
Не думайте, что теперь нужно начинать писать множество проверок, как в примере выше. У Python сложилась сильная традиция утиной типизации, где явная проверка типов никогда не выполняется, а код просто вызывает методы объекта, полагаясь, что эти методы существуют, и возбуждает исключение, если их нет. Будьте осмотрительны при проверке ABC и делайте это только в случае крайней необходимости.
Можно создавать собственные ABC, используя abc.ABCMeta в качестве
метакласса в определении класса:
from abc import ABCMeta, abstractmethod
class Drawable():
__metaclass__ = ABCMeta
@abstractmethod
def draw(self, x, y, scale=1.0):
pass
def draw_doubled(self, x, y):
self.draw(x, y, scale=2.0)
class Square(Drawable):
def draw(self, x, y, scale):
...
В приведённой выше ABC Drawable метод draw_doubled()
отображает объект в двойном размере и может быть реализован на основе
других методов, описанных в Drawable. Поэтому классы, реализующие
эту ABC, не обязаны предоставлять собственную реализацию
draw_doubled(), хотя могут это сделать. Однако реализация
draw() обязательна; ABC не может предоставить полезную общую реализацию.
Можно применить декоратор @abstractmethod к методам, таким как
draw(), которые должны быть реализованы; тогда Python будет возбуждать исключение
для классов, не определяющих этот метод.
Обратите внимание: исключение возбуждается только при попытке
создать экземпляр подкласса, в котором отсутствует метод:
>>> class Circle(Drawable):
... pass
...
>>> c = Circle()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
Абстрактные атрибуты данных можно объявить с помощью
декоратора @abstractproperty:
from abc import abstractproperty
...
@abstractproperty
def readonly(self):
return self._x
Подклассы тогда должны определить свойство readonly().
См. также
- PEP 3119 – Введение абстрактных базовых классов
PEP написан Гвидо ван Россумом и Талином. Реализован Гвидо ван Россумом. Портирован в 2.6 Бенджамином Арангуреном при участии Алекса Мартелли.
PEP 3127: Поддержка и синтаксис целочисленных литералов¶PEP 3127: Integer Literal Support and Syntax
Python 3.0 изменяет синтаксис восьмеричных (основание 8) целочисленных литералов, добавляя префикс «0o» или «0O» вместо ведущего нуля, а также добавляет поддержку двоичных (основание 2) целочисленных литералов с префиксом «0b» или «0B».
Python 2.6 не отказывается от поддержки ведущего нуля для восьмеричных чисел, но добавляет поддержку «0o» и «0b»:
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
Встроенная функция oct() по-прежнему возвращает числа
с ведущим нулём, а новая встроенная функция bin()
возвращает двоичное представление числа:
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
Встроенные функции int() и long() теперь принимают префиксы «0o»
и «0b» при запросе основания 8 или 2, а также когда аргумент
base равен нулю (что указывает на то, что используемое основание должно быть
определено из строки):
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
См. также
- PEP 3127 – Поддержка и синтаксис целочисленных литералов
PEP написан Патриком Мопином; портирован в 2.6 Эриком Смитом.
PEP 3129: Декораторы классов¶PEP 3129: Class Decorators
Декораторы были расширены с функций на классы. Теперь допустимо написать:
@foo
@bar
class A:
pass
Это эквивалентно:
class A:
pass
A = foo(bar(A))
См. также
- PEP 3129 - Декораторы классов
PEP написан Коллином Уинтером.
PEP 3141: Иерархия типов для чисел¶PEP 3141: A Type Hierarchy for Numbers
Python 3.0 добавляет несколько абстрактных базовых классов для числовых типов,
вдохновлённых числовой башней Scheme. Эти классы были портированы в
2.6 как модуль numbers.
Самая общая ABC – это Number. Она не определяет никаких операций
и существует только для того, чтобы можно было проверить, является ли объект числом, с помощью
isinstance(obj, Number).
Complex является подклассом Number. Комплексные числа
могут подвергаться основным операциям: сложению, вычитанию,
умножению, делению и возведению в степень; также можно получить
действительную и мнимую части и взять сопряжённое число. Встроенный тип complex в Python
– это реализация Complex.
Real далее наследует от Complex и добавляет
операции, которые работают только с действительными числами: floor(), trunc(),
округление, взятие остатка по модулю N, целочисленное деление,
и сравнения.
Числа Rational наследуют от Real, имеют
свойства numerator и denominator и могут быть
преобразованы в числа с плавающей запятой. Python 2.6 добавляет простой класс рациональных чисел
Fraction в модуле fractions. (Он называется
Fraction вместо Rational, чтобы избежать
конфликта имён с numbers.Rational.)
Числа Integral наследуют от Rational и
могут сдвигаться влево и вправо с помощью << и >>,
комбинироваться с использованием побитовых операций, таких как & и |,
и могут использоваться в качестве индексов массивов и границ срезов.
В Python 3.0 PEP слегка переопределяет существующие встроенные функции
round(), math.floor(), math.ceil() и добавляет новую
– math.trunc(), которая была портирована в Python 2.6.
math.trunc() округляет к нулю, возвращая ближайшее
Integral, которое находится между аргументом функции и нулём.
См. также
- PEP 3141 – Иерархия типов для чисел
PEP написан Джеффри Яскиным.
Числовая башня Scheme из руководства по Guile.
Типы чисел Scheme из спецификации R5RS Scheme.
Модуль fractions¶The fractions Module
Чтобы дополнить иерархию числовых типов, модуль fractions
предоставляет класс рациональных чисел. Рациональные числа хранят свои
значения в виде числителя и знаменателя, образующих дробь, и могут
точно представлять такие числа, как 2/3, которые числа с плавающей запятой
могут лишь аппроксимировать.
Конструктор Fraction принимает два значения Integral,
которые будут числителем и знаменателем результирующей дроби.
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
Для преобразования чисел с плавающей запятой в рациональные
тип float теперь имеет метод as_integer_ratio(), который возвращает
числитель и знаменатель дроби, равной тому же
значению с плавающей запятой:
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
Обратите внимание: значения, которые могут быть лишь аппроксимированы числами с плавающей запятой, например 1./3, не упрощаются до аппроксимируемого числа; дробь пытается соответствовать значению с плавающей запятой в точности.
Модуль fractions основан на реализации Сьорда
Мюллендера, которая долгое время находилась в каталоге Python Demo/classes/.
Джеффри Яскин существенно обновил эту реализацию.
Прочие изменения языка ¶Other Language Changes
Некоторые небольшие изменения, внесённые в ядро языка Python:
Каталоги и zip-архивы, содержащие файл
__main__.py, теперь можно выполнять напрямую, передавая их имя интерпретатору. Каталог или zip-архив автоматически вставляется как первая запись в sys.path. (Предложение и начальный патч от Энди Чу, впоследствии доработан Филиппом Дж. Иби и Ником Когланом; bpo-1739468.)Функция
hasattr()перехватывала и игнорировала все ошибки, полагая, что они означают, что метод__getattr__()потерпел неудачу, и поэтому возвращаемое значениеhasattr()будетFalse. Однако эту логику не следует применять кKeyboardInterruptиSystemExit; Python 2.6 больше не будет отбрасывать такие исключения, когдаhasattr()с ними сталкивается. (Исправлено Бенджамином Петерсоном; bpo-2196.)При вызове функции с использованием синтаксиса
**для передачи именованных аргументов больше не требуется использовать словарь Python; теперь подойдёт любое отображение:>>> def f(**kw): ... print sorted(kw) ... >>> ud=UserDict.UserDict() >>> ud['a'] = 1 >>> ud['b'] = 'string' >>> f(**ud) ['a', 'b']
(Автор: Александр Белопольский; bpo-1686487.)
Также стало допустимо передавать именованные аргументы после аргумента
*argsпри вызове функции.>>> def f(*args, **kw): ... print args, kw ... >>> f(1,2,3, *(4,5,6), keyword=13) (1, 2, 3, 4, 5, 6) {'keyword': 13}
Ранее это вызывало бы синтаксическую ошибку. (Автор: Амори Форжео д’Арк; bpo-3473.)
Новая встроенная функция
next(iterator, [default])возвращает следующий элемент из указанного итератора. Если передан аргумент default, он будет возвращён, если iterator исчерпан; в противном случае будет возбуждено исключениеStopIteration. (Портировано в bpo-2719.)Кортежи теперь имеют методы
index()иcount(), соответствующие методам списковindex()иcount():>>> t = (0,1,2,3,4,0,1,2) >>> t.index(3) 3 >>> t.count(0) 2
(Автор: Рэймонд Хеттингер)
Встроенные типы теперь имеют улучшенную поддержку расширенного синтаксиса срезов, принимая различные комбинации
(start, stop, step). Ранее поддержка была частичной, и некоторые крайние случаи не работали. (Реализовано Томасом Воутерсом.)Свойства теперь имеют три атрибута:
getter,setterиdeleter, которые являются декораторами, предоставляющими удобные сокращения для добавления функции получения, установки или удаления к существующему свойству. Используются они так:class C(object): @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x class D(C): @C.x.getter def x(self): return self._x * 2 @x.setter def x(self, value): self._x = value / 2
Несколько методов встроенных типов множеств теперь принимают несколько итерируемых объектов:
intersection(),intersection_update(),union(),update(),difference()иdifference_update().>>> s=set('1234567890') >>> s.intersection('abc123', 'cdf246') # Пересечение всех входных данных set(['2']) >>> s.difference('246', '789') set(['1', '0', '3', '5'])
(Автор: Raymond Hettinger.)
Было добавлено много функций для чисел с плавающей запятой. Функция
float()теперь преобразует строкуnanв значение NaN (не число) по стандарту IEEE 754, а+infи-inf– в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Автор: Кристиан Хаймс; bpo-1635.)Другие функции модуля
math,isinf()иisnan(), возвращают true, если их аргумент с плавающей запятой является бесконечностью или NaN. (bpo-1640)Были добавлены функции преобразования чисел с плавающей запятой в шестнадцатеричные строки (bpo-3008). Эти функции преобразуют числа с плавающей запятой в строковое представление и обратно, не внося ошибок округления, возникающих при преобразовании между десятичной и двоичной системами. Числа с плавающей запятой имеют метод
hex(), возвращающий строковое представление, а методfloat.fromhex()преобразует строку обратно в число:>>> a = 3.75 >>> a.hex() '0x1.e000000000000p+1' >>> float.fromhex('0x1.e000000000000p+1') 3.75 >>> b=1./3 >>> b.hex() '0x1.5555555555555p-2'
Числовая тонкость: при создании комплексного числа из двух чисел с плавающей запятой в системах, поддерживающих знаковые нули (-0 и +0), конструктор
complex()теперь сохраняет знак нуля. (Исправлено Марком Т. Дикинсоном; bpo-1507.)Классы, наследующие метод
__hash__()от родительского класса, могут установить__hash__ = None, чтобы указать, что класс не является хешируемым. Это заставитhash(obj)возбуждатьTypeError, и класс не будет помечен как реализующий абстрактный базовый классHashable.Это следует делать, когда вы определили метод
__cmp__()или__eq__(), который сравнивает объекты по значению, а не по идентичности. Все объекты имеют метод хеширования по умолчанию, использующийid(obj)в качестве хеш-значения. Нет аккуратного способа удалить метод__hash__(), унаследованный от родительского класса, поэтому присваиваниеNoneбыло реализовано как переопределение. На уровне C расширения могут установитьtp_hashвPyObject_HashNotImplemented(). (Исправлено Ником Когланом и Амори Форжео д’Арк; bpo-2235.)Исключение
GeneratorExitтеперь является подклассомBaseExceptionвместоException. Это означает, что обработчик исключений, выполняющийexcept Exception:, не будет случайно перехватыватьGeneratorExit. (Автор: Чад Остин; bpo-1537.)Объекты-генераторы теперь имеют атрибут
gi_code, который ссылается на исходный объект кода, лежащий в основе генератора. (Автор: Коллин Уинтер; bpo-1473257.)Встроенная функция
compile()теперь принимает как именованные, так и позиционные аргументы. (Автор: Thomas Wouters; bpo-1444529.)Конструктор
complex()теперь принимает строки, содержащие комплексные числа в скобках, то естьcomplex(repr(cplx))теперь будет сохранять значения при преобразовании. Например,complex('(3+4j)')теперь возвращает значение (3+4j). (bpo-1491866)Строковый метод
translate()теперь принимаетNoneв качестве параметра таблицы перевода, который рассматривается как тождественное преобразование. Это упрощает выполнение операций, которые только удаляют символы. (Автор: Bengt Richter, реализация: Raymond Hettinger; bpo-1193128.)Встроенная функция
dir()теперь проверяет наличие метода__dir__()у получаемых объектов. Этот метод должен возвращать список строк с именами допустимых атрибутов объекта и позволяет объекту управлять значением, которое возвращаетdir(). Объекты, у которых есть методы__getattr__()или__getattribute__(), могут использовать это для объявления псевдоатрибутов, которые они будут поддерживать. (bpo-1591665)Объекты методов экземпляров имеют новые атрибуты для объекта и функции, составляющих метод; новый синоним для
im_self– это__self__, иim_funcтакже доступен как__func__. Старые имена по-прежнему поддерживаются в Python 2.6, но отсутствуют в 3.0.Малоизвестное изменение: при использовании функции
locals()внутри инструкцииclassрезультирующий словарь больше не возвращает свободные переменные. (В данном случае свободные переменные – это переменные, на которые ссылается инструкцияclass, но которые не являются атрибутами класса.)
Оптимизации¶Optimizations
Модуль
warningsпереписан на C. Это позволяет вызывать предупреждения из парсера, а также может ускорить запуск интерпретатора. (Авторы: Neal Norwitz и Brett Cannon; bpo-1631171.)Объекты типов теперь имеют кеш методов, который сокращает работу по поиску правильной реализации метода для конкретного класса; после кеширования интерпретатору не нужно обходить базовые классы, чтобы определить, какой метод вызвать. Кеш очищается при изменении базового класса или самого класса, поэтому он должен оставаться корректным даже в условиях динамической природы Python. (Оригинальная оптимизация реализована Armin Rigo, обновлена для Python 2.6 Kevin Jacobs; bpo-1700288.)
По умолчанию это изменение применяется только к типам, входящим в ядро Python. Модули расширения могут быть несовместимы с этим кешем, поэтому они должны явно добавить
Py_TPFLAGS_HAVE_VERSION_TAGв полеtp_flagsмодуля, чтобы включить кеш методов. (Для совместимости с кешем методов код модуля расширения не должен напрямую обращаться и изменять членtp_dictни одного из реализуемых им типов. Большинство модулей так не делают, но интерпретатор Python не может это определить. См. bpo-1878 для обсуждения.)Вызовы функций с именованными аргументами стали значительно быстрее за счет быстрого сравнения указателей, что обычно экономит время полного сравнения строк. (Автор: Raymond Hettinger, на основе первоначальной реализации Antoine Pitrou; bpo-1819.)
Все функции модуля
structпереписаны на C благодаря работе на спринте Need For Speed. (Автор: Raymond Hettinger.)Некоторые стандартные встроенные типы теперь устанавливают бит в своих объектах типа. Это ускоряет проверку, является ли объект подклассом одного из этих типов. (Автор: Neal Norwitz.)
Строки Unicode теперь используют более быстрый код для обнаружения пробелов и разрывов строк; это ускоряет метод
split()примерно на 25%, аsplitlines()на 35%. (Автор: Antoine Pitrou.) Использование памяти уменьшено за счет применения pymalloc для данных строки Unicode.Инструкция
withтеперь сохраняет метод__exit__()в стеке, что дает небольшое ускорение. (Реализовано Jeffrey Yasskin.)Для уменьшения использования памяти сборщик мусора теперь очищает внутренние списки свободных блоков при сборке мусора самого старшего поколения объектов. Это может вернуть память операционной системе быстрее.
Изменения в интерпретаторе¶Interpreter Changes
Два параметра командной строки зарезервированы для других реализаций Python. Ключ -J зарезервирован для Jython для специфических опций Jython, таких как ключи, передаваемые базовой JVM. -X зарезервирован для опций, специфичных для конкретной реализации Python, такой как CPython, Jython или IronPython. Если любой из этих параметров используется с Python 2.6, интерпретатор сообщит, что параметр в настоящее время не используется.
Теперь можно запретить Python записывать файлы .pyc или .pyo, указав ключ -B интерпретатору Python или установив переменную окружения PYTHONDONTWRITEBYTECODE перед запуском интерпретатора. Эта настройка доступна программам Python как переменная sys.dont_write_bytecode, и код Python может изменить значение, чтобы изменить поведение интерпретатора. (Авторы: Neal Norwitz и Georg Brandl.)
Кодировка, используемая для стандартного ввода, вывода и стандартного вывода ошибок, может быть задана установкой переменной окружения PYTHONIOENCODING перед запуском интерпретатора. Значение должно быть строкой вида <encoding> или <encoding>:<errorhandler>. Часть encoding задаёт имя кодировки, например utf-8 или latin-1; необязательная часть errorhandler определяет, что делать с символами, которые не может обработать кодировка, и должна быть одним из значений: "error", "ignore" или "replace". (Предложено Martin von Loewis.)
Новые и улучшенные модули¶New and Improved Modules
Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее заметных изменений, отсортированный по имени модуля в алфавитном порядке. Обратитесь к файлу Misc/NEWS в дереве исходного кода для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.
Модули
asyncoreиasynchatснова активно поддерживаются, и был применен ряд патчей и исправлений ошибок. (Поддерживаются Josiah Carlson; см. bpo-1736190 для одного из патчей.)У модуля
bsddbтакже появился новый сопровождающий – Jesús Cea Avion, и пакет теперь доступен как отдельный пакет. Веб-страница пакета: www.jcea.es/programacion/pybsddb.htm. Планируется удалить пакет из стандартной библиотеки в Python 3.0, поскольку темп его выпусков гораздо чаще, чем у Python.Модуль
bsddb.dbshelveтеперь использует самый высокий доступный протокол сериализации вместо ограничения протоколом 1. (Автор: W. Barnes.)Модуль
cgiтеперь будет читать переменные из строки запроса HTTP POST. Это позволяет использовать действия форм с URL, содержащими строки запроса, например “/cgi-bin/add.py?category=1”. (Авторы: Alexandre Fiori и Nubis; bpo-1817.)Функции
parse_qs()иparse_qsl()перемещены из модуляcgiв модульurlparse. Версии, все еще доступные в модулеcgi, будут вызывать сообщенияPendingDeprecationWarningв версии 2.6 (bpo-600362).Модуль
cmathподвергся значительной доработке, авторы – Mark Dickinson и Christian Heimes. Было добавлено пять новых функций:polar()преобразует комплексное число в полярную форму, возвращая модуль и аргумент комплексного числа.rect()делает обратное, преобразуя пару (модуль, аргумент) обратно в соответствующее комплексное число.phase()возвращает аргумент (также называемый углом) комплексного числа.isnan()возвращает True, если либо действительная, либо мнимая часть его аргумента является NaN.isinf()возвращает True, если вещественная или мнимая часть его аргумента бесконечна.
Правки также повысили численную надёжность модуля
cmath. Для всех функций вещественная и мнимая части результатов, где только возможно, точны в пределах нескольких единиц наименьшей точности (ulps). Подробности – на bpo-1381. Также исправлены разрезы ветвей дляasinh(),atanh()иatan().Тесты для модуля были существенно расширены; почти 2000 новых тестов проверяют алгебраические функции.
На платформах IEEE 754 модуль
cmathтеперь обрабатывает специальные значения IEEE 754 и исключения с плавающей запятой в соответствии с приложением G стандарта C99.Новый тип данных в модуле
collections:namedtuple(typename, fieldnames)– это фабричная функция, создающая подклассы стандартного кортежа, поля которых доступны по имени, а также по индексу. Например:>>> var_type = collections.namedtuple('variable', ... 'id name type size') >>> # Имена разделяются пробелами или запятыми >>> # 'id, name, type, size' также будет работать >>> var_type._fields ('id', 'name', 'type', 'size') >>> var = var_type(1, 'frequency', 'int', 4) >>> print var[0], var.id # Эквивалентно 1 1 >>> print var[2], var.type # Эквивалентно int int >>> var._asdict() {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'} >>> v2 = var._replace(name='amplitude') >>> v2 variable(id=1, name='amplitude', type='int', size=4)
Несколько мест в стандартной библиотеке, которые возвращали кортежи, были изменены, чтобы возвращать экземпляры
namedtuple. Например, методDecimal.as_tuple()теперь возвращает именованный кортеж с полямиsign,digitsиexponent.(Автор: Raymond Hettinger.)
Ещё одно изменение в модуле
collections: типdequeтеперь поддерживает необязательный параметр maxlen; если он указан, размер дека будет ограничен не более чем maxlen элементами. Добавление новых элементов в заполненный дек приводит к отбрасыванию старых.>>> from collections import deque >>> dq=deque(maxlen=3) >>> dq deque([], maxlen=3) >>> dq.append(1); dq.append(2); dq.append(3) >>> dq deque([1, 2, 3], maxlen=3) >>> dq.append(4) >>> dq deque([2, 3, 4], maxlen=3)
(Автор: Raymond Hettinger.)
Объекты
MorselмодуляCookieтеперь поддерживают атрибутhttponly. В некоторых браузерах куки с установленным этим атрибутом не могут быть прочитаны или изменены через JavaScript. (Автор: Arvin Schnell; bpo-1638033.)Новый метод окна в модуле
curses,chgat(), изменяет атрибуты отображения для заданного количества символов на одной строке. (Автор: Fabian Kreutz.)# Текст жирным шрифтом, начинающийся с y=0, x=21 # и влияющий на остальную часть строки stdscr.chgat(0, 21, curses.A_BOLD)
Класс
Textboxв модулеcurses.textpadтеперь поддерживает редактирование как в режиме вставки, так и в режиме замены. Режим вставки включается передачей истинного значения параметру insert_mode при создании экземпляраTextbox.Методы
strftime()модуляdatetimeтеперь поддерживают код формата%f, который раскрывается в количество микросекунд в объекте, дополненное нулями слева до шести знаков. (Автор: Skip Montanaro; bpo-1158.)Модуль
decimalбыл обновлён до версии 1.66 Общей спецификации десятичных чисел. Новые возможности включают некоторые методы для базовых математических функций, таких какexp()иlog10():>>> Decimal(1).exp() Decimal("2.718281828459045235360287471") >>> Decimal("2.7182818").ln() Decimal("0.9999999895305022877376682436") >>> Decimal(1000).log10() Decimal("3")
Метод
as_tuple()объектовDecimalтеперь возвращает именованный кортеж с полямиsign,digitsиexponent.(Реализовано Facundo Batista и Mark Dickinson. Поддержка именованных кортежей добавлена Raymond Hettinger.)
Класс
SequenceMatcherмодуляdifflibтеперь возвращает именованные кортежи, представляющие совпадения, с атрибутамиa,bиsize. (Автор: Raymond Hettinger.)В конструктор класса
ftplib.FTP, а также в методconnect()был добавлен необязательный параметрtimeout, задающий тайм-аут в секундах. (Добавлено Facundo Batista.) Кроме того, методыstorbinary()иstorlines()классаFTPтеперь принимают необязательный параметр колбэк, который будет вызываться с каждым блоком данных после его отправки. (Автор: Phil Schwartz; bpo-1221598.)Встроенная функция
reduce()также доступна в модулеfunctools. В Python 3.0 встроенная функция была удалена, иreduce()доступна только изfunctools; в настоящее время планов по удалению встроенной функции в серии 2.x нет. (Патч от Christian Heimes; bpo-1739906.)Там, где возможно, модуль
getpassтеперь использует/dev/ttyдля вывода приглашения и чтения пароля, возвращаясь к стандартному потоку ошибок и стандартному вводу. Если пароль может быть выведен на терминал, перед отображением приглашения выводится предупреждение. (Автор: Gregory P. Smith.)Функция
glob.glob()теперь может возвращать имена файлов в Юникоде, если был указан путь в Юникоде и в каталоге есть файлы с такими именами. (bpo-1001604)Новая функция в модуле
heapq,merge(iter1, iter2, ...), принимает произвольное количество итерируемых объектов, возвращающих данные в отсортированном порядке, и возвращает новый генератор, который выдает содержимое всех итераторов, также в отсортированном порядке. Например:>>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16])) [1, 2, 3, 5, 8, 9, 16]
Ещё одна новая функция,
heappushpop(heap, item), помещает элемент item в кучу heap, а затем извлекает и возвращает наименьший элемент. Это эффективнее, чем последовательный вызовheappush()иheappop().heapqтеперь реализовано с использованием только сравнения «меньше», а не «меньше или равно», как было раньше. Это приводит использованиеheapqтипа в соответствие с методомlist.sort(). (Автор: Raymond Hettinger.)В конструкторы классов
httplib.HTTPConnectionиHTTPSConnectionбыл добавлен необязательный параметрtimeout, задающий тайм-аут в секундах. (Добавлено Facundo Batista.)Большинство функций модуля
inspect, таких какgetmoduleinfo()иgetargs(), теперь возвращают именованные кортежи. В дополнение к поведению кортежа элементы возвращаемого значения также могут быть доступны как атрибуты. (Автор: Raymond Hettinger.)Некоторые новые функции в модуле включают
isgenerator(),isgeneratorfunction()иisabstract().Модуль
itertoolsполучил несколько новых функций.izip_longest(iter1, iter2, ...[, fillvalue])создает кортежи из каждого из элементов; если некоторые итерируемые объекты короче других, недостающие значения устанавливаются в fillvalue. Например:>>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5])) ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
product(iter1, iter2, ..., [repeat=N])возвращает декартово произведение переданных итерируемых объектов – набор кортежей, содержащих все возможные комбинации элементов, возвращённых из каждого итерируемого объекта.>>> list(itertools.product([1,2,3], [4,5,6])) [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
Необязательный именованный аргумент repeat используется для вычисления произведения итерируемого объекта или набора итерируемых объектов самих на себя, повторённого N раз. С одним итерируемым аргументом возвращаются кортежи из N элементов:
>>> list(itertools.product([1,2], repeat=3)) [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
С двумя итерируемыми объектами возвращаются кортежи из 2N элементов.
>>> list(itertools.product([1,2], [3,4], repeat=2)) [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4), (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4), (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4), (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
combinations(iterable, r)возвращает подпоследовательности длины r из элементов итерируемого объекта.>>> list(itertools.combinations('123', 2)) [('1', '2'), ('1', '3'), ('2', '3')] >>> list(itertools.combinations('123', 3)) [('1', '2', '3')] >>> list(itertools.combinations('1234', 3)) [('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), ('2', '3', '4')]
permutations(iter[, r])возвращает все перестановки длины r из элементов итерируемого объекта. Если r не указан, по умолчанию берётся количество элементов, возвращаемых итерируемым объектом.>>> list(itertools.permutations([1,2,3,4], 2)) [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
itertools.chain(*iterables)– существующая функция вitertools, получившая новый конструктор в Python 2.6.itertools.chain.from_iterable(iterable)принимает единственный итерируемый объект, который должен возвращать другие итерируемые объекты. Затемchain()возвращает все элементы первого итерируемого объекта, затем все элементы второго и так далее.>>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]])) [1, 2, 3, 4, 5, 6]
(Всё добавлено Рэймондом Хеттингером.)
Класс
FileHandlerмодуляloggingи его подклассыWatchedFileHandler,RotatingFileHandler, иTimedRotatingFileHandlerтеперь имеют необязательный параметр delay в своих конструкторах. Если delay истинно, открытие файла журнала откладывается до первого вызоваemit(). (Добавлено Винаем Саджипом.)TimedRotatingFileHandlerтакже имеет параметр конструктора utc. Если аргумент истинен, время UTC будет использоваться для определения момента полуночи и генерации имён файлов; в противном случае будет использоваться местное время.В модуль
mathбыло добавлено несколько новых функций:isinf()иisnan()определяют, является ли заданное число с плавающей запятой бесконечностью (положительной или отрицательной) или NaN (Not a Number), соответственно.copysign()копирует знаковый бит числа IEEE 754, возвращая абсолютное значение x, объединённое со знаковым битом y. Например,math.copysign(1, -0.0)возвращает -1.0. (Добавлено Кристианом Хаймсом.)factorial()вычисляет факториал числа. (Добавлено Рэймондом Хеттингером; bpo-2138.)fsum()суммирует поток чисел из итерируемого объекта, стараясь избежать потери точности за счёт использования частичных сумм. (Добавлено Жаном Брауэрсом, Рэймондом Хеттингером и Марком Дикинсоном; bpo-2819.)acosh(),asinh()иatanh()вычисляют обратные гиперболические функции.log1p()возвращает натуральный логарифм от 1+x (по основанию e).trunc()округляет число в сторону нуля, возвращая ближайшееIntegral, которое находится между аргументом функции и нулём. Добавлено в рамках обратного портирования иерархии типов чисел из PEP 3141.
Модуль
mathбыл улучшен для более согласованного поведения на разных платформах, особенно в отношении обработки исключений с плавающей запятой и специальных значений IEEE 754.По возможности модуль следует рекомендациям стандарта C99 относительно специальных значений 754. Например,
sqrt(-1.)теперь должно даватьValueErrorпочти на всех платформах, в то время какsqrt(float('NaN'))должно возвращать NaN на всех платформах, поддерживающих IEEE 754. Там, где приложение F стандарта C99 рекомендует сигнализировать «деление на ноль» или «недопустимая операция», Python возбуждаетValueError. Там, где приложение F рекомендует сигнализировать «переполнение», Python возбуждаетOverflowError. (См. bpo-711019 и bpo-1640.)(Добавлено Кристианом Хаймсом и Марком Дикинсоном.)
Объекты
mmapтеперь имеют методrfind(), который ищет подстроку, начиная с конца строки и двигаясь назад. Методfind()также получил параметр end, задающий индекс, на котором следует остановить поиск. (Добавлено Джоном Лентоном.)Модуль
operatorполучил функциюmethodcaller(), которая принимает имя и необязательный набор аргументов, возвращая вызываемый объект, который будет вызывать именованную функцию с любыми переданными аргументами. Например:>>> # Эквивалентно lambda s: s.replace('old', 'new') >>> replacer = operator.methodcaller('replace', 'old', 'new') >>> replacer('old wine in old bottles') 'new wine in new bottles'
(Добавлено Георгом Брандлом по предложению Грегори Петросяна.)
Функция
attrgetter()теперь принимает имена с точками и выполняет соответствующий поиск атрибутов:>>> inst_name = operator.attrgetter( ... '__class__.__name__') >>> inst_name('') 'str' >>> inst_name(help) '_Helper'
(Добавлено Георгом Брандлом по предложению Барри Уорсо.)
Модуль
osтеперь обёртывает несколько новых системных вызовов.fchmod(fd, mode)иfchown(fd, uid, gid)изменяют режим и владельца открытого файла, аlchmod(path, mode)изменяет режим символической ссылки. (Добавлено Георгом Брандлом и Кристианом Хаймсом.)chflags()иlchflags()являются обёртками для соответствующих системных вызовов (где они доступны), изменяющими флаги, установленные для файла. Константы значений флагов определены в модулеstat; некоторые возможные значения включаютUF_IMMUTABLE(файл нельзя изменять) иUF_APPEND(данные можно только добавлять в файл). (Добавлено М. Левинсоном.)os.closerange(low, high)эффективно закрывает все файловые дескрипторы от low до high, игнорируя любые ошибки и не включая сам high. Эта функция теперь используется модулемsubprocessдля ускорения запуска процессов. (Добавлено Георгом Брандлом; bpo-1663329.)Метод
clear()объектаos.environтеперь будет сбрасывать переменные окружения с помощьюos.unsetenv()в дополнение к очистке ключей объекта. (Добавлено Мартином Хорчичкой; bpo-1181.)Функция
os.walk()теперь имеет параметрfollowlinks. Если ему присвоено True, она будет переходить по символьным ссылкам, указывающим на каталоги, и обходить содержимое каталога. Для обратной совместимости значение параметра по умолчанию – false. Обратите внимание, что функция может попасть в бесконечную рекурсию, если есть символьная ссылка, указывающая на родительский каталог. (bpo-1273829)В модуле
os.pathфункцияsplitext()была изменена: теперь она не разбивает строку по начальным точкам. Это даёт лучшие результаты при работе с «точечными» файлами Unix (dot-files). Например,os.path.splitext('.ipython')теперь возвращает('.ipython', '')вместо('', '.ipython'). (bpo-1115886)Новая функция
os.path.relpath(path, start='.')возвращает относительный путь от путиstart, если он указан, или от текущей рабочей директории до целевого путиpath. (Добавлено Ричардом Барраном; bpo-1339796.)В Windows
os.path.expandvars()теперь будет раскрывать переменные окружения, заданные в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Добавлено Джозайей Карлсоном; bpo-957650.)Отладчик Python, предоставляемый модулем
pdb, получил новую команду: «run» перезапускает отлаживаемую программу Python и может опционально принимать новые аргументы командной строки для программы. (Добавлено Рокки Бернстайном; bpo-1393667.)Функция
pdb.post_mortem(), используемая для начала отладки по traceback, теперь будет использовать traceback, возвращаемыйsys.exc_info(), если traceback не передан. (Добавлено Факундо Батистой; bpo-1106316.)Модуль
pickletoolsтеперь имеет функциюoptimize(), которая принимает строку, содержащую pickle, и удаляет некоторые неиспользуемые опкоды, возвращая более короткий pickle, содержащий ту же структуру данных. (Автор: Raymond Hettinger.)В модуль
pkgutilбыла добавлена функцияget_data(), которая возвращает содержимое файлов ресурсов, включённых в установленный пакет Python. Например:>>> import pkgutil >>> print pkgutil.get_data('test', 'exception_hierarchy.txt') BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError ...
(Автор: Paul Moore; bpo-2439.)
Объекты
Parserмодуляpyexpatтеперь позволяют устанавливать свой атрибутbuffer_sizeдля изменения размера буфера, используемого для хранения символьных данных. (Автор: Achim Gaedke; bpo-1137.)Модуль
Queueтеперь предоставляет разновидности очередей, которые извлекают записи в разных порядках. КлассPriorityQueueхранит элементы очереди в куче и извлекает их в порядке приоритета, аLifoQueueизвлекает первыми самые недавно добавленные записи, то есть ведёт себя как стек. (Автор: Raymond Hettinger.)Объекты
Randomмодуляrandomтеперь можно сериализовать в 32-битной системе и десериализовать в 64-битной системе, и наоборот. К сожалению, это изменение также означает, что объектыRandomPython 2.6 нельзя корректно десериализовать в более ранних версиях Python. (Автор: Shawn Ligocki; bpo-1727780.)Новая функция
triangular(low, high, mode)возвращает случайные числа, подчиняющиеся треугольному распределению. Возвращаемые значения находятся между low и high, не включая high, и с mode в качестве наиболее часто встречающегося значения в распределении. (Авторы: Wladmir van der Laan и Raymond Hettinger; bpo-1681432.)Длительные поиски по регулярным выражениям, выполняемые модулем
re, будут проверять доставку сигналов, поэтому длительные поиски теперь можно прерывать. (Авторы: Josh Hoyt и Ralf Schmitt; bpo-846388.)Модуль регулярных выражений реализован путём компиляции байткода для крошечной виртуальной машины, специфичной для regex. Недоверенный код может напрямую создавать вредоносные строки байткода и вызывать сбои, поэтому Python 2.6 включает верификатор для байткода regex. (Автор: Guido van Rossum на основе работы для Google App Engine; bpo-3487.)
Метод
Completer.complete()модуляrlcompleterтеперь будет игнорировать исключения, возникающие при вычислении имени. (Исправлено Lorenz Quack; bpo-2250.)Экземпляры
schedulerмодуляschedтеперь имеют атрибутqueueтолько для чтения, который возвращает содержимое очереди планировщика, представленное в виде списка именованных кортежей с полями(time, priority, action, argument). (Автор: Raymond Hettinger; bpo-1861.)Модуль
selectтеперь имеет функции-обёртки для системных вызовов Linuxepoll()и BSDkqueue(). Методmodify()был добавлен к существующим объектамpoll;pollobj.modify(fd, eventmask)принимает файловый дескриптор или файловый объект и маску событий, изменяя записанную маску событий для этого файла. (Автор: Christian Heimes; bpo-1657.)Функция
shutil.copytree()теперь имеет необязательный аргумент ignore, который принимает вызываемый объект. Этот вызываемый объект будет получать каждый путь к каталогу и список содержимого каталога, и возвращать список имён, которые будут проигнорированы, а не скопированы.Модуль
shutilтакже предоставляет функциюignore_patterns()для использования с этим новым параметром.ignore_patterns()принимает произвольное количество шаблонов в стиле glob и возвращает вызываемый объект, который будет игнорировать любые файлы и каталоги, соответствующие любому из этих шаблонов. В следующем примере копируется дерево каталогов, но пропускаются как каталоги.svn, так и резервные файлы Emacs, у которых имена заканчиваются на '~':shutil.copytree('Doc/library', '/tmp/library', ignore=shutil.ignore_patterns('*~', '.svn'))
(Автор: Tarek Ziadé; bpo-2663.)
Интеграция обработки сигналов с циклами событий GUI, такими как используемые в Tkinter или GTk+, долгое время была проблемой; большинство программ прибегают к опросу (polling), просыпаясь каждую долю секунды, чтобы проверить, не произошли ли какие-либо события GUI. Теперь модуль
signalможет сделать это более эффективно. Вызовsignal.set_wakeup_fd(fd)устанавливает файловый дескриптор для использования; при получении сигнала в этот файловый дескриптор записывается байт. Также существует функция на уровне C,PySignal_SetWakeupFd(), для установки дескриптора.Циклы событий будут использовать это, открывая канал для создания двух дескрипторов: один для чтения и один для записи. Дескриптор для записи будет передан в
set_wakeup_fd(), а дескриптор для чтения будет добавлен в список дескрипторов, отслеживаемых циклом событий, черезselect()илиpoll(). При получении сигнала будет записан байт, и основной цикл событий проснётся, избегая необходимости опроса.(Автор: Adam Olsen; bpo-1583.)
Функция
siginterrupt()теперь доступна из кода Python и позволяет изменять, могут ли сигналы прерывать системные вызовы или нет. (Автор: Ralf Schmitt.)Функции
setitimer()иgetitimer()также были добавлены (там, где они доступны).setitimer()позволяет устанавливать интервальные таймеры, которые будут отправлять сигнал процессу по истечении заданного времени, измеряемого в реальном времени, процессорном времени процесса или совокупном времени процесса+системы. (Автор: Guilherme Polo; bpo-2240.)Модуль
smtplibтеперь поддерживает SMTP через SSL благодаря добавлению классаSMTP_SSL. Этот класс поддерживает интерфейс, идентичный существующему классуSMTP. (Автор: Monty Taylor.) Оба конструктора классов также имеют необязательный параметрtimeout, задающий тайм-аут для начальной попытки соединения, измеряемый в секундах. (Автор: Facundo Batista.)В модуль также была добавлена реализация протокола LMTP (RFC 2033). LMTP используется вместо SMTP при передаче электронной почты между агентами, которые не управляют почтовой очередью. (LMTP реализован Leif Hedstrom; bpo-957003.)
SMTP.starttls()теперь соответствует RFC 3207 и забывает любые знания, полученные от сервера, не полученные в результате самого согласования TLS. (Патч предоставлен Bill Fenner; bpo-829951.)Модуль
socketтеперь поддерживает TIPC (http://tipc.sourceforge.net), высокопроизводительный протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса TIPC – это 4- или 5-кортежи. (Вклад Alberto Bertogli; bpo-1646.)Новая функция
create_connection()принимает адрес и подключается к нему, используя необязательное значение тайм-аута, возвращая подключённый объект сокета. Эта функция также определяет тип адреса и подключается к нему, используя IPv4 или IPv6 по ситуации. Изменение вашего кода для использованияcreate_connection()вместоsocket(socket.AF_INET, ...)может быть всем, что нужно, чтобы ваш код работал с IPv6.Базовые классы в модуле
SocketServerтеперь поддерживают вызов методаhandle_timeout()после периода бездействия, заданного атрибутомtimeoutсервера. (Автор: Michael Pomraning.) Методserve_forever()теперь принимает необязательный интервал опроса, измеряемый в секундах, контролирующий, как часто сервер будет проверять запрос на завершение. (Авторы: Pedro Werneck и Jeffrey Yasskin; bpo-742598, bpo-1193577.)Модуль
sqlite3, сопровождаемый Gerhard Haering, обновлён с версии 2.3.2 в Python 2.5 до версии 2.4.1.Модуль
structтеперь поддерживает тип C99_Bool, используя символ формата'?'. (Вклад David Remahl.)Объекты
Popen, предоставляемые модулемsubprocess, теперь имеют методыterminate(),kill()иsend_signal(). В Windowssend_signal()поддерживает только сигналSIGTERM, и все эти методы являются псевдонимами для функции Win32 APITerminateProcess(). (Автор: Christian Heimes.)Новая переменная в модуле
sys,float_info, представляет собой объект, содержащий информацию, полученную из файлаfloat.hо поддержке чисел с плавающей запятой на платформе. Атрибуты этого объекта включаютmant_dig(количество цифр в мантиссе),epsilon(наименьшая разница между 1.0 и следующим наибольшим представимым значением) и несколько других. (Автор: Christian Heimes; bpo-1534.)Ещё одна новая переменная,
dont_write_bytecode, управляет тем, записывает ли Python какие-либо файлы.pycили.pyoпри импорте модуля. Если эта переменная истинна, скомпилированные файлы не записываются. Переменная изначально устанавливается при запуске путём передачи переключателя-Bинтерпретатору Python или установкой переменной окруженияPYTHONDONTWRITEBYTECODEперед запуском интерпретатора. Код Python впоследствии может изменить значение этой переменной, чтобы управлять записью файлов байткода. (Авторы: Neal Norwitz и Georg Brandl.)Информация об аргументах командной строки, переданных интерпретатору Python, доступна через чтение атрибутов именованного кортежа
sys.flags. Например, атрибутverboseистинен, если Python был запущен в подробном режиме,debugистинен в режиме отладки и т.д. Все эти атрибуты доступны только для чтения. (Автор: Christian Heimes.)Новая функция
getsizeof()принимает объект Python и возвращает объём памяти, используемый объектом, измеряемый в байтах. Встроенные объекты возвращают корректные результаты; сторонние расширения могут этого не делать, но могут определить метод__sizeof__()для возврата размера объекта. (Автор: Robert Schuppenies; bpo-2898.)Теперь можно определить текущие функции профилировщика и трассировщика, вызвав
sys.getprofile()иsys.gettrace(). (Автор: Georg Brandl; bpo-1648.)Модуль
tarfileтеперь поддерживает tar-файлы POSIX.1-2001 (pax) в дополнение к уже поддерживаемым форматам POSIX.1-1988 (ustar) и GNU tar. Формат по умолчанию – GNU tar; укажите параметрformat, чтобы открыть файл в другом формате:tar = tarfile.open("output.tar", "w", format=tarfile.PAX_FORMAT)
Новые параметры
encodingиerrorsзадают кодировку и схему обработки ошибок для преобразования символов.'strict','ignore'и'replace'– три стандартных способа обработки ошибок в Python;'utf-8'– специальное значение, заменяющее некорректные символы их UTF-8 представлением. (Преобразование символов необходимо, потому что формат PAX поддерживает имена файлов в Unicode, по умолчанию используется UTF-8.)Метод
TarFile.add()теперь принимает аргументexclude, который является функцией, используемой для исключения определённых имен файлов из архива. Функция должна принимать имя файла и возвращать true, если файл следует исключить, или false, если его следует архивировать. Функция применяется как к имени, изначально переданному вadd(), так и к именам файлов в рекурсивно добавляемых каталогах.(Все изменения выполнены Lars Gustäbel.)
В конструктор класса
telnetlib.Telnetдобавлен необязательный параметрtimeout, задающий тайм-аут в секундах. (Добавлено Facundo Batista.)Класс
tempfile.NamedTemporaryFileобычно удаляет созданный временный файл при его закрытии. Теперь это поведение можно изменить, передавdelete=Falseконструктору. (Автор: Damien Miller; bpo-1537850.)Новый класс
SpooledTemporaryFileведёт себя как временный файл, но хранит данные в памяти до превышения максимального размера. По достижении этого предела содержимое будет записано во временный файл на диске. (Автор: Dustin J. Mitchell.)Классы
NamedTemporaryFileиSpooledTemporaryFileоба работают как менеджеры контекста, поэтому можно написатьwith tempfile.NamedTemporaryFile() as tmp: .... (Автор: Alexander Belopolsky; bpo-2021.)Модуль
test.test_supportполучил ряд менеджеров контекста, полезных для написания тестов.EnvironmentVarGuard()– это менеджер контекста, который временно изменяет переменные окружения и автоматически восстанавливает их старые значения.Ещё один менеджер контекста,
TransientResource, может обрамлять вызовы ресурсов, которые могут быть недоступны; он перехватывает и игнорирует заданный список исключений. Например, сетевой тест может игнорировать определённые сбои при подключении к внешнему веб-сайту:with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): f = urllib.urlopen('https://sf.net') ...
Наконец,
check_warnings()сбрасывает фильтры предупреждений модуляwarningи возвращает объект, который будет записывать все вызванные предупреждения (bpo-3781):with test_support.check_warnings() as wrec: warnings.simplefilter("always") # ... код, вызывающий предупреждение ... assert str(wrec.message) == "function is outdated" assert len(wrec.warnings) == 1, "Multiple warnings raised"
(Автор: Бретт Кэннон.)
Модуль
textwrapтеперь может сохранять существующие пробельные символы в начале и конце вновь создаваемых строк, указываяdrop_whitespace=Falseв качестве аргумента:>>> S = """This sentence has a bunch of ... extra whitespace.""" >>> print textwrap.fill(S, width=15) This sentence has a bunch of extra whitespace. >>> print textwrap.fill(S, drop_whitespace=False, width=15) This sentence has a bunch of extra whitespace. >>>
(Автор: Dwayne Bailey; bpo-1581073.)
API модуля
threadingизменяется, чтобы использовать свойства, такие какdaemon, вместо методовsetDaemon()иisDaemon(), а некоторые методы были переименованы для использования подчёркиваний вместо верблюжьего регистра; например, методactiveCount()переименован вactive_count(). Версии модуля 2.6 и 3.0 поддерживают одинаковые свойства и переименованные методы, но не удаляйте старые методы. Дата устаревания старых API в Python 3.x не установлена; старые API не будут удалены ни в одной версии 2.x. (Выполнено несколькими людьми, в первую очередь Бенджамином Петерсоном.)Объекты
Threadмодуляthreadingполучили свойствоident, которое возвращает идентификатор потока – ненулевое целое число. (Автор: Gregory P. Smith; bpo-2871.)Модуль
timeitтеперь принимает как строки, так и вызываемые объекты для измеряемого оператора и для кода настройки. Были добавлены две вспомогательные функции для создания экземпляровTimer:repeat(stmt, setup, time, repeat, number)иtimeit(stmt, setup, time, number)создают экземпляр и вызывают соответствующий метод. (Автор: Erik Demaine; bpo-1533909.)Модуль
Tkinterтеперь принимает списки и кортежи для параметров, разделяя элементы пробелами перед передачей результирующего значения в Tcl/Tk. (Автор: Guilherme Polo; bpo-2906.)Модуль
turtleдля черепашьей графики был значительно улучшен Gregor Lingl. Новые возможности модуля включают:Улучшенная анимация движения и поворота черепахи.
Управление движением черепахи с помощью новых методов
delay(),tracer()иspeed().Возможность задавать новые формы для черепахи и определять новую систему координат.
У черепах теперь есть метод
undo(), который может откатывать действия.Простая поддержка реакции на события ввода, такие как активность мыши и клавиатуры, что позволяет писать простые игры.
Файл
turtle.cfgможно использовать для настройки начального вида экрана черепахи.Докстринги модуля могут быть заменены новыми докстрингами, переведёнными на другой язык.
Необязательный параметр
timeoutбыл добавлен в функциюurllib.urlopen(), конструктор классаurllib.ftpwrapper, а также в функциюurllib2.urlopen(). Параметр задаёт тайм-аут в секундах. Например:>>> u = urllib2.urlopen("http://slow.example.com", timeout=3) Traceback (most recent call last): ... urllib2.URLError: <urlopen error timed out> >>>
(Добавлено Facundo Batista.)
База данных Unicode, предоставляемая модулем
unicodedata, обновлена до версии 5.1.0. (Обновлено Martin von Loewis; bpo-3811.)Методы
formatwarning()иshowwarning()модуляwarningsполучили необязательный аргумент line, который можно использовать для указания строки исходного кода. (Добавлено в рамках bpo-1631171, который переписал часть модуляwarningsна C.)Новая функция
catch_warnings()– это контекстный менеджер, предназначенный для тестирования, который позволяет временно изменять фильтры предупреждений, а затем восстанавливать их исходные значения (bpo-3781).Классы
SimpleXMLRPCServerиDocXMLRPCServerXML-RPC теперь можно настроить так, чтобы они не открывали и не привязывали свой сокет немедленно, передавFalseв качестве параметра bind_and_activate конструктора. Это можно использовать для изменения атрибутаallow_reuse_addressэкземпляра перед вызовом методовserver_bind()иserver_activate(), чтобы открыть сокет и начать прослушивание соединений. (Предложено Питером Паренте; bpo-1599845.)SimpleXMLRPCServerтакже имеет атрибут_send_traceback_header; если он равен true, исключение и форматированная трассировка возвращаются в виде HTTP-заголовков «X-Exception» и «X-Traceback». Эта функция предназначена только для отладки и не должна использоваться на производственных серверах, поскольку трассировки могут раскрыть пароли или другую конфиденциальную информацию. (Предложено Аланом Макинтайром в рамках его проекта для Google Summer of Code 2007.)Модуль
xmlrpclibбольше не преобразует автоматическиdatetime.dateиdatetime.timeв типxmlrpclib.DateTime; семантика преобразования не обязательно была корректной для всех приложений. Код, использующийxmlrpclib, должен преобразовывать экземплярыdateиtime. (bpo-1330538) Код также может обрабатывать даты до 1900 года (предложено Ральфом Шмиттом; bpo-2014) и 64-битные целые числа, представленные с помощью<i8>в ответах XML-RPC (предложено Рику Линдбладом; bpo-2985).Класс
ZipFileмодуляzipfileтеперь имеет методыextract()иextractall(), которые распаковывают один файл или все файлы из архива в текущий каталог или в указанный каталог:z = zipfile.ZipFile('python-251.zip') # Распаковать один файл, записывая его относительно # в каталог /tmp. z.extract('Python/sysmodule.c', '/tmp') # Распаковать все файлы из архива. z.extractall()
(Предложено Аланом Макинтайром; bpo-467924.)
Методы
open(),read()иextract()теперь могут принимать либо имя файла, либо объектZipInfo. Это полезно, когда архив случайно содержит дублированное имя файла. (Предложено Грэмом Хорлером; bpo-1775025.)Наконец,
zipfileтеперь поддерживает использование имён файлов в Unicode для архивных файлов. (Предложено Алексеем Борзенковым; bpo-1734346.)
Модуль ast¶The ast module
Модуль ast предоставляет представление Python-кода в виде абстрактного синтаксического дерева, а Армин Ронахер предложил набор вспомогательных функций, выполняющих различные распространённые задачи. Они будут полезны для пакетов HTML-шаблонов, анализаторов кода и подобных инструментов, обрабатывающих Python-код.
Функция parse() принимает выражение и возвращает AST. Функция dump() выводит представление дерева, подходящее для отладки:
import ast
t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
Это выводит глубоко вложенное дерево:
Module(body=[
Assign(targets=[
Name(id='d', ctx=Store())
], value=Dict(keys=[], values=[]))
For(target=Name(id='i', ctx=Store()),
iter=Str(s='abcdefghijklm'), body=[
Assign(targets=[
Subscript(value=
Name(id='d', ctx=Load()),
slice=
Index(value=
BinOp(left=Name(id='i', ctx=Load()), op=Add(),
right=Name(id='i', ctx=Load()))), ctx=Store())
], value=
BinOp(left=
BinOp(left=
Call(func=
Name(id='ord', ctx=Load()), args=[
Name(id='i', ctx=Load())
], keywords=[], starargs=None, kwargs=None),
op=Sub(), right=Call(func=
Name(id='ord', ctx=Load()), args=[
Str(s='a')
], keywords=[], starargs=None, kwargs=None)),
op=Add(), right=Num(n=1)))
], orelse=[])
Print(dest=None, values=[
Name(id='d', ctx=Load())
], nl=True)
])
Метод literal_eval() принимает строку или AST, представляющий литеральное выражение, анализирует и вычисляет его, а затем возвращает полученное значение. Литеральное выражение – это выражение Python, содержащее только строки, числа, словари и т.д., но не содержащее инструкций или вызовов функций. Если необходимо вычислить выражение, но нельзя принять риск безопасности при использовании вызова eval(), literal_eval() справится с этим безопасно:
>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
...
ValueError: malformed string
Модуль также включает классы NodeVisitor и NodeTransformer для обхода и изменения AST, а также функции для распространённых преобразований, таких как изменение номеров строк.
Модуль future_builtins¶The future_builtins module
Python 3.0 вносит много изменений в набор встроенных функций, и большинство из них нельзя ввести в серии Python 2.x, поскольку это нарушило бы совместимость. Модуль future_builtins предоставляет версии этих встроенных функций, которые можно импортировать при написании кода, совместимого с Python 3.0.
Функции в этом модуле в настоящее время включают:
ascii(obj): эквивалентноrepr(). В Python 3.0repr()будет возвращать строку Unicode, аascii()– чистую ASCII-байтовую строку.filter(predicate, iterable),map(func, iterable1, ...): версии 3.0 возвращают итераторы, в отличие от встроенных функций 2.x, которые возвращают списки.hex(value),oct(value): вместо вызова методов__hex__()или__oct__()эти версии будут вызывать метод__index__()и преобразовывать результат в шестнадцатеричный или восьмеричный формат.oct()будет использовать новое обозначение0oдля своего результата.
Модуль json: JavaScript Object Notation¶The json module: JavaScript Object Notation
Новый модуль json поддерживает кодирование и декодирование типов Python в JSON (JavaScript Object Notation). JSON – это лёгкий формат обмена данными, часто используемый в веб-приложениях. Для получения дополнительной информации о JSON см. http://www.json.org.
json поставляется с поддержкой декодирования и кодирования большинства встроенных типов Python. Следующий пример кодирует и декодирует словарь:
>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # Закодировать данные
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Декодировать в объект Python
{"spam": "foo", "parrot": 42}
Также можно написать собственные декодеры и кодеры для поддержки большего количества типов. Также поддерживается pretty-printing JSON-строк.
json (изначально назывался simplejson) был написан Бобом Ипполито.
Модуль plistlib: анализатор списков свойств¶The plistlib module: A Property-List Parser
Формат .plist обычно используется в Mac OS X для хранения основных типов данных (чисел, строк, списков и словарей) путём их сериализации в формат на основе XML. Он напоминает сериализацию типов данных XML-RPC.
Несмотря на то, что формат в основном используется в Mac OS X, в нём нет ничего специфичного для Mac, и реализация на Python работает на любой платформе, поддерживаемой Python, поэтому модуль plistlib был включён в стандартную библиотеку.
Использовать модуль просто:
import sys
import plistlib
import datetime
# Создать структуру данных
data_struct = dict(lastAccessed=datetime.datetime.now(),
version=1,
categories=('Personal','Shared','Private'))
# Создать строку, содержащую XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct
# Записать структуру данных в файл и прочитать её обратно.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')
# read/writePlist принимает как файлоподобные объекты, так и пути.
plistlib.writePlist(data_struct, sys.stdout)
Улучшения ctypes¶ctypes Enhancements
Томас Хеллер продолжил поддерживать и улучшать модуль ctypes.
ctypes теперь поддерживает тип данных c_bool, представляющий тип C99 bool. (Предложено Дэвидом Ремалем; bpo-1649190.)
Типы ctypes string, buffer и array получили улучшенную поддержку расширенного синтаксиса срезов, где используются различные комбинации (start, stop, step). (Реализовано Томасом Воутерсом.)
Все типы данных ctypes теперь поддерживают методы from_buffer() и from_buffer_copy(), которые создают экземпляр ctypes на основе переданного объекта буфера. from_buffer_copy() копирует содержимое объекта, а from_buffer() разделяет ту же область памяти.
Новое соглашение о вызовах предписывает ctypes очищать переменные errno или Win32 LastError в начале каждого обёрнутого вызова. (Реализовано Томасом Хеллером; bpo-1798.)
Теперь можно получить значение переменной Unix errno после вызова функции. При создании обёрнутой функции можно передать use_errno=True как именованный параметр в функцию DLL(), а затем вызвать методы модуля set_errno() и get_errno() для установки и получения кода ошибки.
Переменная Win32 LastError аналогично поддерживается функциями DLL(), OleDLL() и WinDLL(). Вы передаёте use_last_error=True как именованный параметр, а затем вызываете методы модуля set_last_error() и get_last_error().
Функция byref(), используемая для получения указателя на экземпляр ctypes, теперь имеет необязательный параметр offset (смещение в байтах), которое будет добавлено к возвращаемому указателю.
Улучшенная поддержка SSL¶Improved SSL Support
Билл Янссен значительно улучшил поддержку SSL в Python 2.6, добавив новый модуль ssl, построенный на библиотеке OpenSSL. Этот новый модуль даёт больше контроля над согласованным протоколом, используемыми сертификатами X.509 и лучше поддерживает написание SSL-серверов (в отличие от клиентов) на Python. Существующая поддержка SSL в модуле socket не удалена и продолжает работать, хотя будет удалена в Python 3.0.
Чтобы использовать новый модуль, сначала нужно обычным образом создать TCP-соединение, а затем передать его функции ssl.wrap_socket(). Можно указать, требуется ли сертификат, и получить информацию о сертификате, вызвав метод getpeercert().
См. также
Документация модуля ssl.
Устаревания и удаления¶Deprecations and Removals
Строковые исключения были удалены. Попытка их использования возбуждает
TypeError.Изменения интерфейса
Exception, продиктованные PEP 352, продолжают вноситься. В версии 2.6 атрибутmessageобъявлен устаревшим в пользу атрибутаargs.(Режим предупреждений о 3.0) В Python 3.0 будет реорганизована стандартная библиотека: многие устаревшие модули будут удалены, а другие переименованы. Python 2.6, запущенный в режиме предупреждений о 3.0, будет выдавать предупреждения об этих модулях при их импорте.
Список устаревших модулей:
audiodev,bgenlocations,buildtools,bundlebuilder,Canvas,compiler,dircache,dl,fpformat,gensuitemodule,ihooks,imageop,imgfile,linuxaudiodev,mhlib,mimetools,multifile,new,pure,statvfs,sunaudiodev,test.testallиtoaiff.Модуль
gopherlibудалён.Модули
MimeWriterиmimifyобъявлены устаревшими; вместо них используйте пакетemail.Модуль
md5объявлен устаревшим; используйте вместо него модульhashlib.Модуль
posixfileобъявлен устаревшим;fcntl.lockf()предоставляет более надёжные блокировки.Модуль
popen2объявлен устаревшим; используйте модульsubprocess.Модуль
rgbimgудалён.Модуль
setsобъявлен устаревшим; лучше использовать встроенные типыsetиfrozenset.Модуль
shaобъявлен устаревшим; используйте вместо него модульhashlib.
Изменения в сборке и C API¶Build and C API Changes
Изменения процесса сборки Python и C API включают:
Теперь Python должен компилироваться компиляторами C89 (спустя 19 лет!). Это означает, что в исходном коде Python удалены собственные реализации
memmove()иstrerror(), которые входят в стандартную библиотеку C89.Python 2.6 можно собрать с помощью Microsoft Visual Studio 2008 (версия 9.0), и это новый компилятор по умолчанию. Смотрите каталог
PCbuildдля файлов сборки. (Реализовано Кристианом Хаймсом.)На Mac OS X Python 2.6 может быть скомпилирован как универсальная сборка для четырёх архитектур. Скрипт configure может принимать ключ
--with-universal-archs=[32-bit|64-bit|all], определяющий, будут ли двоичные файлы собраны для 32-битных архитектур (x86, PowerPC), 64-битных (x86-64 и PPC-64) или для обеих. (Предложено Рональдом Уссореном.)Модуль BerkeleyDB теперь имеет объект C API, доступный как
bsddb.db.api. Этот объект может использоваться другими расширениями C, которые хотят использовать модульbsddbдля своих целей. (Предложено Данканом Грисби.)Новый интерфейс буфера, ранее описанный в разделе PEP 3118, добавляет функции
PyObject_GetBuffer()иPyBuffer_Release(), а также несколько других.Использование Python библиотеки C stdio теперь потокобезопасно, или, по крайней мере, настолько потокобезопасно, насколько им является сама нижележащая библиотека. Долгое время существовала потенциальная ошибка, когда один поток закрывал файловый объект, в то время как другой поток читал из него или писал в него. В Python 2.6 файловые объекты имеют счетчик ссылок, управляемый функциями
PyFile_IncUseCount()иPyFile_DecUseCount(). Файловый объект нельзя закрыть, пока счетчик ссылок не равен нулю.PyFile_IncUseCount()должна вызываться, пока GIL еще удерживается, перед выполнением операции ввода-вывода с использованием указателяFILE *, аPyFile_DecUseCount()должна вызываться сразу после повторного захвата GIL. (Авторы: Антуан Питу и Грегори П. Смит.)Одновременный импорт модулей в двух разных потоках больше не приводит к взаимоблокировке; теперь вместо этого возбуждается
ImportError. Новая функция API,PyImport_ImportModuleNoBlock(), сначала ищет модуль вsys.modules, а затем пытается импортировать его после захвата блокировки импорта. Если блокировка импорта удерживается другим потоком, возбуждаетсяImportError. (Автор: Кристиан Хаймс.)Несколько функций возвращают информацию о поддержке чисел с плавающей запятой платформой.
PyFloat_GetMax()возвращает максимальное представимое значение с плавающей запятой, аPyFloat_GetMin()возвращает минимальное положительное значение.PyFloat_GetInfo()возвращает объект, содержащий дополнительную информацию из файлаfloat.h, такую как"mant_dig"(количество цифр в мантиссе),"epsilon"(наименьшая разница между 1.0 и следующим большим представимым значением) и несколько других. (Вклад Кристиана Хаймса; bpo-1534.)C-функции и методы, использующие
PyComplex_AsCComplex(), теперь принимают аргументы, у которых есть метод__complex__(). В частности, функции в модулеcmathтеперь принимают объекты с этим методом. Это обратный порт изменения из Python 3.0. (Автор: Марк Дикинсон; bpo-1675423.)C API Python теперь включает две функции для сравнения строк без учета регистра:
PyOS_stricmp(char*, char*)иPyOS_strnicmp(char*, char*, Py_ssize_t). (Автор: Кристиан Хаймс; bpo-1635.)Многие C-расширения определяют собственные макросы для добавления целых чисел и строк в словарь модуля в функции
init*. Python 2.6 наконец-то определяет стандартные макросы для добавления значений в модуль:PyModule_AddStringMacroиPyModule_AddIntMacro(). (Автор: Кристиан Хаймс.)Некоторые макросы были переименованы как в 3.0, так и в 2.6, чтобы было понятнее, что это макросы, а не функции.
Py_Size()сталPy_SIZE(),Py_Type()сталPy_TYPE(), аPy_Refcnt()сталPy_REFCNT(). Макросы со смешанным регистром по-прежнему доступны в Python 2.6 для обратной совместимости. (bpo-1629)Distutils теперь размещает создаваемые C-расширения в другом каталоге при работе с отладочной версией Python. (Автор: Коллин Уинтер; bpo-1530959.)
Некоторые базовые типы данных, такие как целые числа и строки, ведут внутренние списки свободных объектов, которые можно повторно использовать. Структуры данных для этих списков теперь следуют соглашению об именовании: переменная всегда называется
free_list, счетчик всегда называетсяnumfree, и всегда определяется макросPy<typename>_MAXFREELIST.Новая цель Makefile, «make patchcheck», подготавливает дерево исходных текстов Python для создания патча: она исправляет завершающие пробелы во всех измененных файлах
.py, проверяет, была ли изменена документация, и сообщает, были ли обновлены файлыMisc/ACKSиMisc/NEWS. (Автор: Бретт Кэннон.)Еще одна новая цель, «make profile-opt», компилирует двоичный файл Python с использованием профильно-ориентированной оптимизации GCC. Она компилирует Python с включенным профилированием, запускает набор тестов для получения набора результатов профилирования, а затем компилирует с использованием этих результатов для оптимизации. (Автор: Грегори П. Смит.)
Изменения для конкретных платформ: Windows¶Port-Specific Changes: Windows
Поддержка Windows 95, 98, ME и NT4 прекращена. Python 2.6 требует по крайней мере Windows 2000 SP4.
Новым компилятором по умолчанию в Windows является Visual Studio 2008 (версия 9.0). Каталоги сборки для Visual Studio 2003 (версия 7.1) и 2005 (версия 8.0) были перемещены в каталог PC/. Новый каталог
PCbuildподдерживает кросс-компиляцию для X64, отладочные сборки и профильную оптимизацию (PGO). Сборки с PGO примерно на 10% быстрее обычных. (Автор: Christian Heimes при помощи Amaury Forgeot d’Arc и Martin von Loewis.)Модуль
msvcrtтеперь поддерживает как обычную, так и широкосимвольную версии консольного API ввода-вывода. Функцияgetwch()считывает нажатие клавиши и возвращает значение Unicode, как и функцияgetwche(). Функцияputwch()принимает символ Unicode и записывает его на консоль. (Автор: Кристиан Хаймс.)os.path.expandvars()теперь будет раскрывать переменные окружения в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Автор: Джозия Карлсон; bpo-957650.)Объекты сокетов модуля
socketтеперь имеют методioctl(), который предоставляет ограниченный интерфейс к системному интерфейсуWSAIoctl().В модуле
_winregтеперь есть функцияExpandEnvironmentStrings(), которая раскрывает ссылки на переменные окружения, такие как%NAME%, во входной строке. Объекты handle, предоставляемые этим модулем, теперь поддерживают протокол контекстного менеджера, поэтому их можно использовать в операторахwith. (Автор: Кристиан Хаймс.)_winregтакже имеет лучшую поддержку систем x64, предоставляя функцииDisableReflectionKey(),EnableReflectionKey()иQueryReflectionKey(), которые включают и отключают отражение реестра для 32-битных процессов, работающих на 64-битных системах. (bpo-1753245)Объект
Recordмодуляmsilibполучил методыGetInteger()иGetString(), которые возвращают значения полей в виде целого числа или строки. (Автор: Флорис Брайнуге; bpo-2125.)
Изменения для конкретных платформ: Mac OS X¶Port-Specific Changes: Mac OS X
При компиляции сборки Python в виде фреймворка теперь можно указать имя фреймворка, передав опцию
--with-framework-name=скрипту configure.Модуль
macfsбыл удален. Это, в свою очередь, потребовало удаления функцииmacostools.touched(), поскольку она зависела от модуляmacfs. (bpo-1490190)Многие другие модули 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.
Изменения для конкретных портов: IRIX¶Port-Specific Changes: IRIX
Ряд старых модулей, специфичных для 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.
Перенос на Python 2.6¶Porting to Python 2.6
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:
Классы, которые не должны быть хешируемыми, должны установить
__hash__ = Noneв своих определениях, чтобы указать на это.Строковые исключения были удалены. Попытка их использования возбуждает
TypeError.Метод
__init__()объектаcollections.dequeтеперь очищает существующее содержимое deque перед добавлением элементов из итерируемого объекта. Это изменение приводит поведение в соответствие сlist.__init__().object.__init__()ранее принимал произвольные позиционные и именованные аргументы, игнорируя их. В Python 2.6 это больше не допускается и приведет кTypeError. Это затронет методы__init__(), которые в итоге вызывают соответствующий метод наobject(возможно, через использованиеsuper()). См. обсуждение в bpo-1683368.Конструктор
Decimalтеперь допускает начальные и конечные пробелы при передаче строки. Ранее он вызывал исключениеInvalidOperation. С другой стороны, методcreate_decimal()объектовContextтеперь явно запрещает лишние пробелы, вызывая исключениеConversionSyntax.Из-за случайности реализации, если передать путь к файлу встроенной функции
__import__(), она фактически импортировала указанный файл. Однако это никогда не должно было работать, и теперь реализация явно проверяет этот случай и вызываетImportError.C API: функции
PyImport_Import()иPyImport_ImportModule()теперь по умолчанию используют абсолютный импорт, а не относительный. Это повлияет на расширения на C, которые импортируют другие модули.C API: типы данных расширений, которые не должны быть хэшируемыми, должны определить свой слот
tp_hashкакPyObject_HashNotImplemented().Исключение
socket.errorмодуляsocketтеперь наследуется отIOError. Ранее оно не было подклассомStandardError, но теперь стало, черезIOError. (Реализовано Грегори П. Смитом; bpo-1706815.)Модуль
xmlrpclibбольше не преобразует автоматическиdatetime.dateиdatetime.timeв типxmlrpclib.DateTime; семантика преобразования не обязательно была корректна для всех приложений. Код, использующийxmlrpclib, должен преобразовывать экземплярыdateиtime. (bpo-1330538)(режим предупреждения 3.0) Класс
Exceptionтеперь выдаёт предупреждение при доступе через срез или по индексу; возможностьExceptionвести себя как кортеж постепенно упраздняется.(режим предупреждения 3.0) Сравнения на неравенство между двумя словарями или двумя объектами, которые не реализуют методы сравнения, сообщаются как предупреждения.
dict1 == dict2всё ещё работает, ноdict1 < dict2постепенно упраздняется.Сравнения между ячейками (cells), которые являются деталью реализации правил области видимости Python, также вызывают предупреждения, поскольку такие сравнения полностью запрещены в 3.0.
Благодарности¶Acknowledgements
Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.