Выпуск языка программирования Python 3.6
23 декабря 2016 года
После 15 месяцев разработки представлен значительный релиз языка программирования Python 3.6.
Среди добавленных новшеств:
- Добавлена поддержка форматируемых строковых литералов, позволяющих определить строку, содержащую подстановки. Заданные в фигурных скобках выражения вычисляются и подставляются в текст строки во время выполнения программы и форматируются с использованием протокола format(). Например:
name = "Fred" f"He said his name is {name}." 'He said his name is Fred.' width = 10 precision = 4 value = decimal.Decimal("12.34567") f"result: {value:{width}.{precision}}" # nested fields 'result: 12.35'
- Возможность использования символов подчёркивания для улучшения читаемости чисел, например, теперь можно указывать 1_000_000 или 0x_FF_FF_FF;
- Определён синтаксис аннотаций для переменных, позволяющий передать интерпретатору информацию о типах переменных. Аннотации сохраняются в атрибуте __annotations__ класса или модуля, но в отличие от языков со статической типизацией не накладывают каких-либо ограничений, а служат для структурирования метаданных, которые могут использоваться сторонними инструментами и библиотеками. Например:
primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: Dict[str, int] = {}
- Возможность определения асинхронных генераторов. В прошлой ветке Python 3.5 был реализован новый синтаксис async / await для определения сопрограмм, но в теле одной функции невозможно было одновременно использовать await и yield. В Python 3.6 данное ограничение снято, что позволяет определять генераторы, работающие в асинхронном режиме:
async def ticker(delay, to): """Yield numbers from 0 to *to* every *delay* seconds.""" for i in range(to): yield i await asyncio.sleep(delay)
- Добавлена возможность асинхронной обработки списковых включений (comprehensions) через использование выражения "async for" для списков, множеств и словарей. Также допускается применение выражений await для всех видов списковых включений. Например:
result = [i async for i in aiter() if i % 2] result = [await fun() for fun in funcs if await condition()]
- Переработана реализация типа dict, которая переведена на более компактное представление, похожее на реализацию от проекта PyPy. В итоге удалось сократить потребление словарями памяти на 20-25% и обеспечить хранение с сохранением порядка следования записей (упорядочивание позиционируется как особенность, которая может измениться в будущем, поэтому до определения упорядочивания в спецификации полагаться на данную возможность не стоит);
- Представлен новый метод "__init_subclass__", упрощающий настройку подкласса без использования метакласса;
- Обеспечено сохранение порядка определения атрибутов класса (прядок можно отследить через сохраняемый в классах атрибут "__dict__");
- Порядок определения аргументов ключевых слов, передаваемых в функцию, теперь соответствует порядку элементов в **kwargs;
- Добавлена поддержка контрольных вызовов (probe) DTrace и SystemTap. При сборке с опцией "--with-dtrace" Python может устанавливать маркеры для таких событий, как вызов и выход из функции, начало/завершение сборки мусора и выполнение строки кода;
- Представлена новая переменная окружения PYTHONMALLOC, через которую можно выбрать механизм распределения памяти для Python или включить отладочные хуки. Например, при указании "PYTHONMALLOC=debug" добавляются средства определения выхода за границы буфера, применяется специально заполнение новых и освобождённых блоков и т.п.
- Стабилизирован API модуля asyncio, значительно увеличена производительность и расширена функциональность;
- Добавлен протокол для определения путей в файловой системе в виде отдельных объектов pathlib. Например:
import pathlib with open(pathlib.Path("README")) as f:... contents = f.read()
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.