Питонические атаки
1.19K subscribers
183 photos
4 videos
1 file
459 links
Всяческие заметки про программирование на Python и другие весёлые истории.
Download Telegram
Forwarded from Python Заметки
В PyCharm есть окно со статистикой продуктивности (Help / Productivity Guide), где отображена интересная информация об использовании IDE.

В частности, можно узнать сколько нажатий на кнопки вам сэкономил автокомплит.
У меня 231К за 14 месяцев !
Не плохо конечно, но клавиатура всё равно стёрлась)))
🙌⌨️😵

#offtop
На Хабре в последнее время чего-то не так много интересных статей, но вот эта прям супер годная. Я пока не настолько хорош в иностранных языках, чтобы прям уверенно мочь читать художественную литературу в оригинале, так что обязательно как-нибудь попробую сделать себе параллельную книгу и перечитать что-нибудь типа «Автостопом по галактике». Наверное, в оригинале должно быть ещё круче.

https://habr.com/p/557664/
В очередной раз обновил пост про настройку точечного обхода блокировок на роутере, потому что сменил провайдера VPN. Теперь я пользуюсь Red Shield VPN — это VPN от админа канала @itsorm, так что дух цифрового сопротивления зашкаливает. Они буквально пару недель назад запилили поддержку WireGuard и теперь удовлетворяют всем моим запросам. И они вроде классные — скорость хорошая и по деньгам выходит раза в полтора дешевле, чем мой предыдущий VPN. Так как я уже очень привык не замечать козни Роскомнадзора, в этот раз я подписался на VPN сразу на год.

Если вам тоже такое интересно, то я там в посте приложил рефералку, по ней вам дадут месяц бесплатного VPN. А еще вот тут есть промокод на удешевлённый тариф.
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