Питонические атаки
1.19K subscribers
183 photos
4 videos
1 file
459 links
Всяческие заметки про программирование на Python и другие весёлые истории.
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Мигель Гринберг — широко известный в кругах пользователей Flask автор библиотек, туториалов и статей — изобрёл ещё одну классную штуку под названием Turbo-Flask. Этот плагин интегрирует во Flask-приложение фронтендовую библиотеку turbo.js, которая слушает команды от сервера через WebSocket и обновляет части страницы динамически. Похоже, что в итоге можно сделать практически какую угодно динамическую логику на фронтенде, не написав ни одной строчки на JS. Если не учитывать того, что рендеринг всё-таки происходит на бэкенде, то выглядит это прям как настоящее SPA (Single Page Application).

https://blog.miguelgrinberg.com/post/dynamically-update-your-flask-web-pages-using-turbo-flask

#flask
На недавно прошедшем Language Summit был презентован PEP 654 — Exception Groups and except*, который сейчас находится на стадии черновика и, вероятно, попадёт в язык в версии 3.11. Этот PEP предлагает добавить в Python возможность запускать сразу несколько не связанных друг с другом исключений, и обрабатывать тоже по несколько штук сразу в одном специальном блоке except*. Это позволит более удобным образом спроектировать API в различных местах stdlib и сторонних библиотек, а также сделает поведение более правильным и в некоторых краевых случаях позволит не терять исключения.

Вот так можно будет запустить группу исключений:

raise ExceptionGroup(
"everything is bad",
[
ValueError("bad value"),
TypeError("bad type")
],
)

Можно создавать из групп исключений целые иерархии и запускать их (вложить ExceptionGroup внутрь ExceptionGroup).

Исключения ExceptionGroup можно перехватывать как обычные исключения (при помощи except), а можно вот так разбивать группу на отдельные исключения и обрабатывать в каждом блоке except* исключения только определенного типа:

try:
...
except *TypeError:
print("type is bad")
except *ValueError as e:
assert isinstance(e, ExceptionGroup) # it's a group!
print("value is bad")

При выполнении куска кода выше по идее должно будет напечататься следующее:

type is bad
value is bad

То есть будут выполнены сразу два блока except*. Причём в каждый блок except* приходит не одно исключение, а целая группа. Обработанные исключения удаляются из исходной группы, а необработанные идут по следующим блокам except*. При разбивании группы исключений на подгруппы происходит обход группы как дерева. Если после проверки всех блоков группа исключений осталась непустой, то она рейзится дальше. Нельзя для одного блока try иметь и обычный except, и групповой except*.

Да, группировка исключений — это весьма своеобразная фича. Авторы документа не предполагают, что такой способ работы с исключениями получит широкое распространение. Насколько я понимаю, этот новый механизм создаётся для решения каких-то специфичных проблем.
Питонические атаки
На недавно прошедшем Language Summit был презентован PEP 654 — Exception Groups and except*, который сейчас находится на стадии черновика и, вероятно, попадёт в язык в версии 3.11. Этот PEP предлагает добавить в Python возможность запускать сразу несколько…
Первое впечатление об этом документе у меня было такое: "ну и дичь". Когда попытался вникнуть получше и пересказать, то всё стало более-менее логично и понятно, но до сих пор не уверен, что те краевые случаи, которыми мотивировано добавление этого далеко не самого простого механизма, того стоят. Посмотрим, конечно, попадёт ли это в язык, и если попадёт, то в каком виде. Если уж над этим PEP работает сам Гвидо и его презентовали на языковом саммите, то, наверное, высоки шансы, что эта фича в том или ином виде пройдёт в язык.
Если что, слайды с презентации этого PEP можно найти в посте в блоге PSF: https://pyfound.blogspot.com/2021/05/the-2021-python-language-summit-pep-654.html
В мире браузерных языков транспиляция является очень распространенным явлением. Это довольно полезное действие, которое переводит код программы с одного языка на другой (зачастую, в JavaScript). Существуют множество языков, для которых единственным способом запуска является транспиляция в JavaScript. А еще часто код с более новых версий JS переводят в более старые, чтобы поддержать как можно больше браузеров.

В мире Python особой нужды в транспиляции нет, но, тем не менее, существуют проекты, которые её используют. Например, Coconut — надмножество языка Python, расширенное в сторону поддержки функционального программирования. Пишешь код на Coconut с красивыми лямбдами, пайплайнами и паттерн-матчингом, затем он транспилируется в обычный код на Python и запускается дальше как обычно. Код в итоге получается очень похожим на Haskell.

Вот что умеет Coconut по сравнению с Python:
* пайплайны (это когда результат работы предыдущей функции передаётся в следующую по цепочке) при помощи оператора |>;
* сокращенный синтаксис для лямбда-функций;
* частичное применение функций;
* паттерн-матчинг (не совсем такой, как будет в 3.10, но он тоже поддерживается);
* присваивания с распаковками;
* расширенный синтаксис для тайп-аннотаций, интеграция с mypy;
* и многое другое (см. список на сайте проекта).

Даже если вы не собираетесь использовать функциональные расширения языка, можно просто писать код на обычном Python 3, а Coconut затем сделает ваш код универсальным, т.е. обеспечит его работу на предыдущих версиях языка, в том числе и на Python 2 (надеюсь, вы уже давно его не используете).

Это офигенно! Определенно стоит того, чтобы поиграться.

Узнал про Coconut вот из этой статьи на Хабре.
Как-то так это работает
Известно ли вам про какие-нибудь другие языки, которые компилируются/транспилируются в Python?
Забавная статья, много безумных внутрянок питона затронуто. Сеттинг вот такой:

"Сложить два целых числа (от 1 до 99) без использования оператора 'плюс'. Дайте пять разных ответов"

https://habr.com/ru/post/555488/
Факт дня сомнительной полезности

А знали ли вы, что Hello World — программу, выводящую два этих слова — на Python можно записать в два слова?

>>> import __hello__
Hello world!

Поздравляю, теперь вы профессиональный хелловорлд-разработчик! Идиоматично, кратко, лаконично, красиво! Обязательно щегольните этим скиллом на собеседовании или удивите коллег.

Удачного дня сомнительной полезности!
Кстати, неделю назад открылся ежегодный опросник за 2021 год от StackOverflow! Я уже сдал про себя всю подноготную. Предлагаю и вам пойти сделать то же самое. Через несколько месяцев, надеюсь, получим какие-нибудь интересные результаты. Каждый год их жду.

Пост в блоге StackOverflow: https://stackoverflow.blog/2021/05/25/the-2021-developer-survey-is-now-open/

Ссылка на опросник: https://stackoverflow.az1.qualtrics.com/jfe/form/SV_7arimtzVFf8ipfM?utm_source=twitter&utm_medium=social&utm_campaign=dev-survey-2021&utm_content=post-1
Вопрос-поднаброс. А сможете ли без Википедии объяснить разницу между компилируемыми и интерпретируемыми языками?

Например, посмотрим как работает Java с высоты птичьего полёта. Исходный код на Java преобразуется в некое промежуточное представление (байткод), а затем некая виртуальная машина (JVM) выполняет этот байткод, преобразуя его в настоящие машинные инструкции.

А теперь с высоты птичьего помёта посмотрим как работает Python (конкретнее, CPython). Исходный код на Python преобразуется в некое промежуточное представление (байткод), а затем некая виртуальная машина (PVM) выполняет этот байткод, преобразуя его в настоящие машинные инструкции.

Если принцип один и тот же, то почему Java — компилируемый, а Python — интерпретируемый?
Интересный и забавный пост, где некий сеньёр-разработчик под винцо подытоживает уроки, полученные за 10 лет карьеры в IT.

https://www.reddit.com/r/ExperiencedDevs/comments/nmodyl/drunk_post_things_ive_learned_as_a_sr_engineer/
Как же приятно наблюдать за настоящим профессионалом за работой. Тоже иногда хочется взять и распечатать на принтере весь проект на 20к строк в виде скриншотов IDE с тёмной темой.

Кстати, вроде похоже на питон, да ведь?

via Reddit
Чему Мстители могут научить нас о Git?

Интересная статья, где сюжетные повороты с путешествиями во времени из Мстителей объясняются с точки зрения Git. Содержит спойлеры!

https://ljvmiranda921.github.io/notebook/2021/06/05/avengers-git/

#git
Интересное интервью с Гвидо ван Россумом, на основе которого в последнее время порождается много новостей в инфополе вокруг Python.

Мне в целом понравилось, но можете не смотреть, потому что вот ключевые моменты:

* Во время работы над ОС Amoeba Гвидо столкнулся с непреодолимой прокрастинацией, потому что приходилось писать много кода на C и шелл-скриптах. Так и появился Python, какое-то время он применялся в разработке этой ОС, но в итоге она загнулась, а Python внезапно обрёл популярность.
* Код с reduce() сложно понимать, поэтому Гвидо убрал эту функцию из built-ins. map() и filter() — норм, но в языке есть для них более приятные альтернативы.
* Гвидо никогда не увлекался ФП.
* Генераторы и list comprehensions сильно поменяли язык, дали ещё один толчок к росту популярности в Python.
* Некоторые идеи в плане типизации Python тащит из TypeScript, потому что языки в некотором смысле похожи.
* Гвидо не слишком оптимистичен по поводу запуска Python в браузере или на смартфонах. Слишком другое окружение, а язык изначально рассчитан для работы на мейнфреймах/ПК.
* Скорее всего Python 4.0 никогда не наступит, если только не случится какое-то фатально ломающее изменение (например, на уровне совместимости с нативными расширениями, изменение механизмов работы сборщика мусора или выпиливание GIL), чего разработчики сильно стараются избегать. Переход со второй на третью версию был слишком болезненным.
* Гвидо предполагает, что под-интерпретаторы (sub-interpreters) помогут решить проблему GIL. Его не придётся удалять, но мешать он больше не будет.
* Гвидо любит кататься на велосипеде, но не больше пары часов за заезд.

Прикольно, что у Гвидо очень понятный акцент. Возможно, это потому что английский — не его родной язык?

https://www.youtube.com/watch?v=aYbNh3NS7jA

#конспект
Результаты опроса аудитории Telegram от TGStat за 2021 подъехали.

https://tgstat.ru/research-2021

Типичный пользователь телеграма — это мужчина 25-34 лет, проживающий в Москве, айтишник с высшим образованием и зарплатой 16-30 тыс. рублей. Держись, чувак, всё будет хорошо! 💪