LINUX.ORG.RU

Python 3.9.0

 , ,


2

4

Вышел новый стабильный релиз популярного языка программирования Python.

Python – высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Основные черты – динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных.

Python – стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. Основные области применения: веб-разработка, машинное обучение и анализ данных, автоматизация и системное администрирование. В настоящий момент Python занимает третье место в рейтинге TIOBE.

Основные изменения:

Новый высокопроизводительный синтаксический анализатор на базе грамматик PEG.

В новой версии текущий парсер Python на основе грамматик LL(1)(КС-грамматика) заменён на новый высокопроизводительный и стабильный синтаксический анализатор на базе PEG (РВ-грамматика). Анализаторы для языков, представленных КС-грамматиками, такие как LR-анализаторы, требуют особого шага лексического анализа, который разбивает входные данные в соответствии с пробелами, пунктуацией и так далее. Это необходимо, так как эти анализаторы используют предварительный анализ для обработки некоторых КС-грамматик в линейное время. РВ-грамматики не требуют отдельного шага лексического анализа, а правила для него могут быть заложены вместе с другими правилами грамматики.

Новые операторы и функции

Во встроенный класс dict добавлены два новых оператора, | для слияния словарей и |= для обновления.

В класс str добавлены две новые функции: str.removeprefix(префикс) и str.removesuffix(суффикс).

Аннотация типа для встроенных коллекций

В этом релизе включена поддержка синтаксиса обощённых типов во всех стандартных коллекциях, доступных в настоящее время.

def read_blog_tags(tags: list[str]) -> None:
    for tag in tags:
        print("Tag Name", tag)

Другие изменения

  • PEP 573 Доступ к состоянию модуля с помощью методов расширения C

  • PEP 593 Гибкие функции и переменные аннотации

  • PEP 602 Python переходит на ежегодные стабильные релизы

  • PEP 614 Смягчающие грамматические ограничения на декораторы

  • PEP 615 Поддержка базы данных IANA по часовым поясам в стандартной библиотеке

  • BPO 38379 сборка мусора не блокируется на восстановленных объектах

  • BPO 38692 os.pidfd_open, для управления процессами без гонок и сигналов;

  • BPO 39926 поддержка Unicode обновлена до версии 13.0.0

  • BPO 1635741, при многократной инициализации Python в одном и том же процессе, больше не происходит утечка памяти

  • Коллекции Python (range, tuple, set, frozenset, list, dict) ускорены с помощью векторного вызова PEP 590

  • Некоторые модули Python (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, ресурс, time, _weakref) теперь используют многофазную инициализацию, как определено в PEP 489

  • Ряд стандартных модулей библиотек (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) теперь используют стабильный ABI, определенный PEP 384.

>>> Подробности

★★★★★

Проверено: Shaman007 ()

Ответ на: комментарий от anonymous

дата-сатанист не тот тип в функцию передал, а питон прожевал и не поперхнулся

Ты путаешь слабую и динамическую типизацию, хаскелист ты мамкин. В питоне сильная типизация, а описанная проблема из-за динамической составляющей.

liksys ★★★ ()
Ответ на: комментарий от Laz

Невозможно провести статическую проверку типов в динамически типизированном языке. Ну просто потому что типы становятся известны только в рантайме. Это не косяк языка, дескать Гвидо хреново придумал, это его особенность, я бы сказал имманентное свойство. Именно благодаря этому свойству питон и приобрел свою популярность. Нельзя избавить питон он динамичности, оставив при этом его сильные стороны.

дальше всё уезжает на выполнение, в этом суть претензии

Совершенно с тем же успехом можно предъявлять претензии к дуршлагу за дырки. Претензия идиотская. По сути, как я и говорил выше, язык критикуется за то что динамический по сути, то есть критикуется не какая-то частная особенность, которую можно улучшить, а технология в целом. Но критика несостоятельна ввиду многочисленных примеров успешного решения задач с её применением. Другими словами, такую критику можно засунуть себе в жопу.

FishHook ()
Ответ на: комментарий от anonymous

полно офигенных качественных языков

Я не то что бы спорю с этим утверждением, но давай ты покажешь компилируемую качественную альтернативу питону.

liksys ★★★ ()
Ответ на: комментарий от Sahas

хотелось бы иметь автоматическую проверку типов

Чтобы что сделать в рантайме? Упростить отладку? А разве дебажное логгирование кто-то отменял?

И ваще, аннотации в IDE сильно помогают не запихивать что взбрело в голову куда попало.

Linfan ★★★★★ ()
Ответ на: комментарий от Linfan

Чтобы что сделать в рантайме? Упростить отладку? А разве дебажное логгирование кто-то отменял?

да, чтобы программа упала при вызове функции с «неправильным» типом. Аннотации же позволяют это отлавливать в рантайме. А так от них толку почти никакого...

Sahas ★★★★★ ()
Ответ на: комментарий от FishHook

sum([[1,2], [3,4]], [])

Да ну… И как только они ни пытаются выкрутится что бы reduce не использовать.

Будут другие значения, потому что при слиянии двух словарей с одинаковыми ключами итоговое значения ключа будет принято из правго словаря…

Да, но никто им не мешает брать значение не из правого, а из левого словаря.

Rodegast ★★★★★ ()
Ответ на: комментарий от FishHook

Кстати, это, на мой взгляд, один из «косяков» питона — неявный захват внешней области видимости. Есть же global и nonlocal, но всё равно можно сделать так, как ты написал

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

А так от них толку почти никакого…

Пичарм по аннотациям отлавливает баги в процессе кодинга, если чо

Linfan ★★★★★ ()
Ответ на: комментарий от Linfan

для этого надо иметь его установленным. В других редакторах/IDE встроенного линтера может и не быть...

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

неявный захват внешней области видимости

На уровне модуля, должны быть только константы. И опять же, про перекрытие имен сигнализирует пичарм в явном виде.

Linfan ★★★★★ ()
Ответ на: комментарий от mx__

Ну это уже от скилла программера зависит, вот если бы он ускорял байт-код то был бы смысл.

Статическая типизация это в первую очередь про верификацию программ и уже потом про оптимизацию. И байт-код ускоряется джитом, а не типами.

Rodegast ★★★★★ ()
Ответ на: комментарий от Rodegast

Да ну… И как только они ни пытаются выкрутится что бы reduce не использовать.

Ну и как ты гений мысли запилишь редьюс без + оператора и начального значения?

Да, но никто им не мешает брать значение не из правого, а из левого словаря.

и что то изменится?

(a + b) + c == a + (b + c)

FishHook ()
Ответ на: комментарий от FishHook

и exec мне очень пригодился

Пригодился для бугагашек и использование в продакшине - две разные вещи. В джава скрипте за такое браузеры код блочат при включенных полисях.

Linfan ★★★★★ ()
Ответ на: комментарий от Sahas

К тому что до запуска скрипта ты не знаешь сигнатуру функции, как ты отловишь ошибку типизации ДО запуска? А в рантайме оно упадет и так.

FishHook ()
Ответ на: комментарий от Sahas

для этого надо иметь его установленным

Коммунити версия пичарма весьма прокачана и бесплатна к юзанию. Платная отличается только узкоспециализированными фичами типа ремоут-дебаггера.

Linfan ★★★★★ ()
Ответ на: комментарий от FishHook

К тому что до запуска скрипта ты не знаешь сигнатуру функции, как ты отловишь ошибку типизации ДО запуска?

до запуска никак, я говорю про проверку типов в рантайме. А до запуска — проблема с undefined name

А в рантайме оно упадет и так.

не факт. И не факт, что упадёт там, где надо

Sahas ★★★★★ ()
Последнее исправление: Sahas (всего исправлений: 1)
Ответ на: комментарий от Linfan

Коммунити версия пичарма весьма прокачана и бесплатна к юзанию. Платная отличается только узкоспециализированными фичами типа ремоут-дебаггера.

минутка рекламы от JetBrains :)

Sahas ★★★★★ ()
Ответ на: комментарий от Linfan

Использование exec - крайне нездоровая практика

Вот вроде взрослый, состоявшийся человек, а до сих пор эти мантры повторяешь и даже не задумался ни разу, прям как ребёнок, ей-богу.

anonymous ()
Ответ на: комментарий от Linfan

Ой, вот только не надо пугать пугалками про страшный кровавый интерпрайз и ПРОДАКШЕН. Не называя имен, вот есть одна известная геймерская контора с бюджетом моё почтение. И они хранят (представь себе!!!) байткод питона в базе данных, и периодически его екзекутят. Чето пока никто от этого не помер.

FishHook ()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от Sahas

Ну так сделай эту проверку руками, в чем проблема? В питоне такой декоратор пишется минут за 15. Только оно в основном не надо никому, потому что всё равно это не заменит юнит-тестирование, а лишний оверхед на рантайм проверки так себе идея. Но вообще здравое зерно здесь есть, и я вполне допускаю, что в четвертом питоне появится опциональный стрикт-мод. В третьем вряд ли, потому что у них есть проблемы с производительностью операций над аннотациями (не помню где читал).

FishHook ()
Ответ на: комментарий от FishHook

Совершенно с тем же успехом можно предъявлять претензии к дуршлагу за дырки. Претензия идиотская. По сути, как я и говорил выше, язык критикуется за то что динамический по сути, то есть критикуется не какая-то частная особенность, которую можно улучшить, а технология в целом. Но критика несостоятельна ввиду многочисленных примеров успешного решения задач с её применением. Другими словами, такую критику можно засунуть себе в жопу.

Всё верно, претензия именно к динамической сути языка, которую выказывает адепт статического анализа. Как верно подмечено, есть многочисленные задачи вида «быстро и дёшево», решаемые с применением технологии. А «качественно» вместе с критикой можно засунуть себе в жопу.

Laz ★★★★★ ()
Ответ на: комментарий от Sahas

часто функция на вход ожидает определённый тип аргумента, а если юзер подсунет ей не тот, который ожидается, в ряде ситуаций питон спокойно «проглотит» это, и выдаст на выходе что-то неудобоваримое

Это называется полиморфизм. И да функция от тебя ничего не ожидает.

Rodegast ★★★★★ ()
Ответ на: комментарий от Linfan

И где тут уровень модуля? Это внутренние переменные.

Ну, так я про то и речь веду: переменная доступна из внешней области видимости без необходимости указания nonlocal, что, на мой взгляд, ухудшает читаемость и явность изложения

Sahas ★★★★★ ()
Ответ на: комментарий от FishHook

Ну так сделай эту проверку руками, в чем проблема?

лишний код помимо аннотаций. Наверняка есть (или можно сделать) декоратор, использующий аннотации для проверки типов, но пока я такого не видал

Sahas ★★★★★ ()
Ответ на: комментарий от FishHook

Это опять же хамский тезис постулирующий, что на питоне принципиально нельзя зделать качественно.

Я написал, что для задач «быстро и дёшево» не подходят языки с мощными системами типов, к которым питон не относится. То, что программы при этом получаются низкого качества, никак не относится непосредственно к питону.

Laz ★★★★★ ()
Последнее исправление: Laz (всего исправлений: 1)
Ответ на: комментарий от FishHook

Ой, вот только не надо пугать пугалками про страшный кровавый интерпрайз и ПРОДАКШЕН.

Ынтерпрайз тут не причем. Есть best practices. Можешь не придерживаться - ровно до первого случая пока тебе сервачи не развальцуют китаезы.

от есть одна известная геймерская контора и бюджетом моё почтение

тю, вот есть Uber, в котором тоже подзабивали в свое время на секурити. Как их отхачили с кражей кедиток, сразу поумнели. Но игруны пускай и дальше так делают - дело хозявское.

Linfan ★★★★★ ()
Ответ на: комментарий от Rodegast

Это называется полиморфизм. И да функция от тебя ничего не ожидает.

спасибо кэп, я в курсе. Это просто «плач Ярославны» в продолжение темы анона про динамическую типизацию

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

а мой взгляд, ухудшает читаемость и явность изложения

Чтобы была читаемость и явность, нейминг должен быть контекстным, уникальным и понятным. И все будет пучком.

Linfan ★★★★★ ()
Ответ на: комментарий от FishHook

Ну и как ты гений мысли запилишь редьюс без + оператора и начального значения?

Где я писал что его можно использовать без оператора? Без начального значения можно было пока его умники не сломали.

и что то изменится?

Да, оно заработает ожидаемым образом.

Rodegast ★★★★★ ()
Ответ на: комментарий от Linfan

Чтобы была читаемость и явность, нейминг должен быть контекстным, уникальным и понятным. И все будет пучком.

это констатация факта или пожелание к Питону? :) В обоих случаях абсолютно согласен, «явное лучше неявного». Рука не отвалится писать nonlocal var, зато линтерам (и людям) легче читать

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

Рука не отвалится писать nonlocal var, зато линтерам (и людям) легче читать

Если ваяется такое - однозначно nonlocal. Но еще лучше избегать подобных извратов.

Linfan ★★★★★ ()
Ответ на: комментарий от Linfan

Можешь не придерживаться - ровно до первого случая пока тебе сервачи не развальцуют китаезы.

Так может и совсем тогда не программировать? А то можно накодить так, что мама не горюй и ни какие бест практисес и код стайл не помогут, если уж программер не понимает как работает функция.

anonymous ()
Ответ на: комментарий от Linfan

Да я код из интернета в exec() засунул и все логины с паролями куда-то пропали, я фиг знает чё щас делать, ребята памагите, не могу зайти на лор.

anonymous ()
Ответ на: комментарий от FishHook

А какое отношение exec имеет к секьюрити?

Такое же, как и eval() в js - возможность исполнения стороннего кода.

Linfan ★★★★★ ()
Ответ на: комментарий от Sahas

Да говно вопрос

import inspect


def check_types(func):
    pos_args_names = [name for name, p in inspect.signature(func).parameters.items() if p.default == inspect._empty]

    def _check_type(name, value):
        type_expected = func.__annotations__[name]
        if not isinstance(value, type_expected):
            raise ValueError(f'argument "{name}" does not match type {type_expected}')

    def decorator(*args, **kwargs):
        for arg_name, value in zip(pos_args_names, args):
            _check_type(arg_name, value)
        for arg_name, value in kwargs.items():
            _check_type(arg_name, value)
        return func(*args, **kwargs)
    return decorator


@check_types
def foo(a: int, b: str, j: int = 6) -> None:
    print('dfsdf')


foo(1, 'ds', 7)
foo(1, 45, 7)

FishHook ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.