Python 3.5.0

После 18 месяцев разработки представлен значительный релиз языка программирования Python 3.5.

Среди добавленных в Python 3.5 новшеств:

  • Добавлен новый модуль zipapp, предоставляющий API и утилиту командной строки для создания упакованных в один файл приложений, которые можно запустить командой "python приложение.pyz". Для создания исполняемого архива достаточно поместить все файлы программы в отдельную директорию, создать выполняемый по умолчанию скрипт __main__.py и выполнить команду "python -m zipapp имя_директории";
  • Расширено применение операторов распаковки "*" и "**", которые теперь можно использовать для произвольного числа распаковок при вызове функции или при манипуляциях с множествами, кортежами, списками и словарями. (ранее допускалась только одна распаковка). Например, для функции "def fn(a, b, c, d)" можно выполнить fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})"), а для словаря - "{*range(4), 4, *(5, 6, 7)}";
  • Поддержка использования оператора форматирования вывода "%" для объектов bytes и bytearray по аналогии с тем, как выполняется форматирование строк. Например, выполнение "b'x=%i y=%f' % (1, 2.5)" приведёт к выводу "b'x=1 y=2.500000'";
  • В стандартной библиотеке представлена новая функция os.scandir() для очень быстрого обхода содержимого директорий. Выполнение os.walk() на базе новой функции работает в 3-5 раз быстрее на POSIX-системах и в 7-20 раз быстрее в Windows, за счёт сокращения числа вызовов os.stat();
  • Возможность автоматического повторного выполнения прерванных системных вызовов без установки отдельных обработчиков EINTR или InterruptedError;
  • Представлен модуль typing, который позиционируется в качестве нового стандарта для задания аннотаций типов. При подключении модуля можно предоставить данные о типах аргументов и возвращаемого значения функции, например "def greeting(name: str) -> str";
  • Реализована функция math.isclose() для приблизительного сравнения значений с заданным уровнем точности. Например, "math.isclose(5.0, 4.99998, abs_tol=0.00003)" вернёт True;
  • В обвязке для запуска Python на платформе Windows добавлена поддержка работы в виртуальных окружениях;
  • Искоренена концепция PYO-файлов, использовавшихся для хранения оптимизированного байткода. Для размещения как оптимизированного, так и неоптимизированного байткода теперь применяются единые файлы ".pyc";
  • Новый механизм для загрузки модулей-расширений, обеспечивающий возможность инициализации в несколько стадий;
  • Значительно улучшены средства асинхронного программирования, благодаря поддержке нового async- и await-синтаксиса для определения сопрограмм, асинхронно выполняемых объектов и итераций. Например, для создания и вызова сопрограммы можно указать "async def http_get(domain)" и "data = await db.fetch('SELECT ...')";
  • Возможность изменения обработки исключений StopIteration внутри генераторов;
  • Класс collections.OrderedDict переписан на языке Си, что позволило ускорить его выполнение от 4 до 100 раз. На Си также переписана функцияfunctools.lru_cache();
  • Добавлен новый вызов subprocess.run() для быстрого запуска подпроцессов;
  • В стандартной библиотеке по умолчанию отключена поддержка SSLv3;
  • Добавлен новый оператор "@" для умножения матриц. Например, вместо "S = dot((dot(H, beta) - r).T, dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))" теперь можно использовать более понятное представление "S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)".