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 ()

Ответ на: комментарий от 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 ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от Linfan

Еще раз. У меня есть код. Не сторонний, а мой. Я его написал. Код хранится в зашифрованном файле. Моя программа читает файл, расшифровывает его и екзекьютит прочитанный код. Где нарушение секьюрности?

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

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

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

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

Еще раз. У меня есть код.

Еще раз - если ты его исполняешь для себя, пиши как душе угодно. В случае той же ынтерпрайзщины, твой exec зарубит penetration team и вежливо попросит переимплементить. В противном случае, не получишь апрув на продакшин. Причин может быть много - от хитрого взлома снаружи, до придурка ждуна, который после тебя будет что-либо дописывать и накосячит с секюрностью. Уговоры в стиле «мамой клянусь все секурно» не прокатывают. Потому как за некоторые утечки данных можно получить 10 лет американской отсидки.

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

Да не пори ты чушь. Какой к х""ям взлом снаружи? То есть некто получил доступ к моему коду, чтобы подменить аргумент в вызове exec? Правда что ли? А без вызова exec он не может инжектировать вредоносный алгоритм имея доступ к моим исходникам?

будет что-либо дописывать и накосячит с секюрностью

Это как вообще? Объясни на приведенном выше примере.

Такую х"""ню нести может только товарищь не понимающий смысла темы от слова совсем. Любой импорт в питоне - это неявный вызов exec. Запуск интерпретатора, это вызов exec.

твой exec зарубит penetration team

Рииииали?? penetration team ревьюит весь код на предмет использования «запрещенных» ключевых слов языка? Это в какой параллельной вселенной?

Вы когда говорите, такое чувство, что вы бредите. Перестань нести околесицу.

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

Рииииали?? penetration team ревьюит весь код на предмет использования «запрещенных» ключевых слов языка? Это в какой параллельной вселенной?

Ну вот сразу видно, что в реальности ты никогда с серьезной работой не сталкивался. В данном случае на репу натравливают анализатор и «писуну» exec’ов приходит PDF в котором будут все случаи с exec помечены как High Priority, обязательные к устранению. Вычитывать вручную никто не будет. Любая возможность инъекции кода считается дырой в безопасности по умолчанию.

Любой импорт в питоне - это неявный вызов exec.

В импорт можно подставить произвольные данные? Нет. Вот и вся «небольшая» разница.

Запуск интерпретатора, это вызов exec.

Запуск интерпретатора осуществляется как правило тоже не с произвольными аргументами, приехавшими хз откуда.

Речь в целом не идет о том, как ты заимплементил работу c exec. А о том, что от него избавляются. Чтобы было доступнее, даже вот такой код в html считается несекюрным (хотя фигли в нем опасного) при аудите:

<a onclick='do_something()'>
Linfan ★★★★★ ()
Ответ на: комментарий от Linfan

Чтобы было доступнее, даже вот такой код в html считается несекюрным (хотя фигли в нем опасного) при аудите:

Не совсем так, считается небезопасной сама идея наличия кода в HTML, потому что его можно потенципльно туда заинжектить. Поэтому в обязательном порядке ставят Content-Security-Policy так что никакой <a onclick='do_something()'> не выполнится, заинжекчен он или нет.

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

Коммунити версия пичарма весьма прокачана и бесплатна к юзанию

И что, б**ть, я должен открывать каждый проект и прощелкать все файлы, чтобы линтер их чекнул? В нормальном языке говно поймает сам язык и откажется выполнять. Независимо от того, в каком блокноте ты этот код писал

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

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

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

Живой пример - 1С. Монополия, целиком и полностью написанная на динамическом ЯП 1с скрипт. Ошибка на ошибке. Каждое обновление что-то ломает и добавляет еще ошибок. И так до бесконечности. А это потеря миллиардов бабла и миллионы часов бессмысленного труда бухов и айтишников

То, что программы при этом получаются низкого качества, никак не относится непосредственно к питону

В питон-програмах низкого качества виноват непосредственно Гвидо и его креатив cpython. Им обоим по**й что выполнять. Главное чтобы примерно напоминало код

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

Да вот в Си можно случайно разыменовать нулевой указатель, давай на этом основании сделаем вывод (который делает анон), что весь софт написаный на Си - гавно

Делаю. Си — говно. В норм языках давно есть ADT, которые позволяют давать нулевым указателям отдельный неразыменовываемый тип.

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

Какому ассоциативному массиву? А такие обращения не оптимизируются чтоли?

Берешь питоний модуль dis, скармливаешь ему исходники, читаешь байткод, озаряешься. Или генерируешь код Cython-ом и читаешь сишные исходники. Диспетчеризация команд интерпретатором по байткоду сама по себе никогда не была проблемой. Проблемой была невозможность инлайна функций, скаляризации векторов (а.к.а сложных объектов). Питон вынужден в любом варианте выполнения при считывании атрибута, в том числе даже при банальном вызове функции из модуля, запрашивать из dict-а объекта атрибут с этим именем, что есть запрос из хэш таблицы а.к.а. ассоциативный массив. И всё исполнение в итоге превращается в такие вот запросы ассоциативных массивов.

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

Писать в каждой функции if isinstance(arg, int): do(arg) else: raise Exception(«Bad argument type») как-то запарно

А тем временем примерно так я делаю в своем коде на Си, только проверяю не совсем тип, а скорее целостность структуры данных.

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

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

Но почему-то у RPython, в который транслирует питон PyPy, прекрасно получается выводить типы.

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

я должен открывать каждый проект и прощелкать все файлы, чтобы линтер их чекнул?

Проверка линтером обычно делается сразу на весь проект в CI/CD на каждый коммит в репу. Пока ты пишешь код, пичарм на лету чекает тот файл, в котором ты работаешь. Делает проверку перед коммитом, чтобы не гнать явный мусор в репу. Вполне достаточно, чтобы не делать грубые ошибки.

В нормальном языке говно поймает сам язык

Это как? Чо, прям в блокноте не отходя от кассы божественным провидением? )))

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

Но вряд ли это то поведение, которого ожидают пользователи, ни один метод словаря не реализует такое поведение

Почему ты решил что операторы должны заменять методы? Пользователи будут ожидать то что написано в документации. Причём большинство операторов лево-ассоциативны по этому от нового оператора «|=» будут ожидать того же.

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

В питон-програмах низкого качества виноват непосредственно Гвидо и его креатив cpython. Им обоим по**й что выполнять. Главное чтобы примерно напоминало код

А тебе не приходило в голову, что в проедании говна не виноват тот, кто это говно высрал?

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

А тебе не приходило в голову, что в проедании говна не виноват тот, кто это говно высрал?

Ну что за фиксация на говне? Как дети :)

Питон - это просто инструмент. С определенным полем использования. Если вы берете в руки молоток/топор/отвертку и начинаете хренячить себе по ногам, рукам, пальцам, то это не проблема инструмента или его создателя, а тривиальная вавка в вашей голове.

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

Питон - это просто инструмент. С определенным полем использования. Если вы берете в руки молоток/топор/отвертку и начинаете хренячить себе по ногам, рукам, пальцам, то это не проблема инструмента или его создателя, а тривиальная вавка в вашей голове.

Это вообще наиболее общая проблема всего IT.

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

Да ладно. Закопай он его в лесу я бы слова не сказал. Но ведь он холил его и лелеял. Долгие годы был евангелистом своего говна. Верные апостолы его разносили говно его по дистрибутивам и институтам

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

До этого уже было такое:

>>> dict({'a': 1, 'b': 2}.items() | {'b': 2, 'c': 3}.items())
{'b': 2, 'a': 1, 'c': 3}
>>> dict({'a': 1, 'b': 2}.items() & {'b': 2, 'c': 3}.items())
{'b': 2}

и если ты хочешь заменить | на +, то & на что предлагаешь заменять?

screamager ()