fa
Feedback
Питонические атаки

Питонические атаки

رفتن به کانال در Telegram

Всяческие заметки про программирование на Python и другие весёлые истории.

نمایش بیشتر
1 299
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-37 روز
-1130 روز
آرشیو پست ها
Интересный и забавный пост, где некий сеньёр-разработчик под винцо подытоживает уроки, полученные за 10 лет карьеры в IT. https://www.reddit.com/r/ExperiencedDevs/comments/nmodyl/drunk_post_things_ive_learned_as_a_sr_engineer/

Вопрос-поднаброс. А сможете ли без Википедии объяснить разницу между компилируемыми и интерпретируемыми языками? Например, по
+1
Вопрос-поднаброс. А сможете ли без Википедии объяснить разницу между компилируемыми и интерпретируемыми языками? Например, посмотрим как работает Java с высоты птичьего полёта. Исходный код на Java преобразуется в некое промежуточное представление (байткод), а затем некая виртуальная машина (JVM) выполняет этот байткод, преобразуя его в настоящие машинные инструкции. А теперь с высоты птичьего помёта посмотрим как работает Python (конкретнее, CPython). Исходный код на Python преобразуется в некое промежуточное представление (байткод), а затем некая виртуальная машина (PVM) выполняет этот байткод, преобразуя его в настоящие машинные инструкции. Если принцип один и тот же, то почему Java — компилируемый, а Python — интерпретируемый?

Записи выступлений с PyCon US 2021 выложили. https://youtube.com/playlist?list=PL2Uw4_HvXqvYk1Y5P8kryoyd83L_0Uk5K

Кстати, неделю назад открылся ежегодный опросник за 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

Факт дня сомнительной полезности А знали ли вы, что Hello World — программу, выводящую два этих слова — на Python можно записать в два слова?
>>> import __hello__
Hello world!

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

Забавная статья, много безумных внутрянок питона затронуто. Сеттинг вот такой: "Сложить два целых числа (от 1 до 99) без использования оператора 'плюс'. Дайте пять разных ответов" https://habr.com/ru/post/555488/

Известно ли вам про какие-нибудь другие языки, которые компилируются/транспилируются в Python?

Как-то так это работает
Как-то так это работает

В мире браузерных языков транспиляция является очень распространенным явлением. Это довольно полезное действие, которое переводит код программы с одного языка на другой (зачастую, в JavaScript). Существуют множество языков, для которых единственным способом запуска является транспиляция в JavaScript. А еще часто код с более новых версий JS переводят в более старые, чтобы поддержать как можно больше браузеров. В мире Python особой нужды в транспиляции нет, но, тем не менее, существуют проекты, которые её используют. Например, Coconut — надмножество языка Python, расширенное в сторону поддержки функционального программирования. Пишешь код на Coconut с красивыми лямбдами, пайплайнами и паттерн-матчингом, затем он транспилируется в обычный код на Python и запускается дальше как обычно. Код в итоге получается очень похожим на Haskell. Вот что умеет Coconut по сравнению с Python: * пайплайны (это когда результат работы предыдущей функции передаётся в следующую по цепочке) при помощи оператора |>; * сокращенный синтаксис для лямбда-функций; * частичное применение функций; * паттерн-матчинг (не совсем такой, как будет в 3.10, но он тоже поддерживается); * присваивания с распаковками; * расширенный синтаксис для тайп-аннотаций, интеграция с mypy; * и многое другое (см. список на сайте проекта). Даже если вы не собираетесь использовать функциональные расширения языка, можно просто писать код на обычном Python 3, а Coconut затем сделает ваш код универсальным, т.е. обеспечит его работу на предыдущих версиях языка, в том числе и на Python 2 (надеюсь, вы уже давно его не используете). Это офигенно! Определенно стоит того, чтобы поиграться. Узнал про Coconut вот из этой статьи на Хабре.

Если что, слайды с презентации этого PEP можно найти в посте в блоге PSF: https://pyfound.blogspot.com/2021/05/the-2021-pytho
Если что, слайды с презентации этого PEP можно найти в посте в блоге PSF: https://pyfound.blogspot.com/2021/05/the-2021-python-language-summit-pep-654.html

Первое впечатление об этом документе у меня было такое: "ну и дичь". Когда попытался вникнуть получше и пересказать, то всё стало более-менее логично и понятно, но до сих пор не уверен, что те краевые случаи, которыми мотивировано добавление этого далеко не самого простого механизма, того стоят. Посмотрим, конечно, попадёт ли это в язык, и если попадёт, то в каком виде. Если уж над этим PEP работает сам Гвидо и его презентовали на языковом саммите, то, наверное, высоки шансы, что эта фича в том или ином виде пройдёт в язык.

На недавно прошедшем 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*. Да, группировка исключений — это весьма своеобразная фича. Авторы документа не предполагают, что такой способ работы с исключениями получит широкое распространение. Насколько я понимаю, этот новый механизм создаётся для решения каких-то специфичных проблем.

Мигель Гринберг — широко известный в кругах пользователей 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

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

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

В PyCharm есть окно со статистикой продуктивности (Help / Productivity Guide), где отображена интересная информация об исполь
В PyCharm есть окно со статистикой продуктивности (Help / Productivity Guide), где отображена интересная информация об использовании IDE. В частности, можно узнать сколько нажатий на кнопки вам сэкономил автокомплит. У меня 231К за 14 месяцев ! Не плохо конечно, но клавиатура всё равно стёрлась))) 🙌⌨️😵 #offtop

JetBrains смогли собрать $45K для Django Software Foundation в этом году. Это примерно 20% годового бюджета DSF, который тратится на разработку фреймворка и проведение конференций. https://blog.jetbrains.com/pycharm/2021/05/dsf-campaign-results/

☝️ А мне нравится pathlib и его оператор конкатенации путей. По-моему, очень лаконично смотрится. В Python много операторов имеют разные смыслы в зависимости от контекста, и это одно из проявлений могучего динамизма языка. Например, + складывает числа, конкатенирует строки, а унарный плюс еще и создает копию объекта collections.Counter (а вот это и правда внезапно, я до сих пор не понимаю зачем). In [7]: from collections import Counter In [8]: c = Counter("avada kedavra") In [9]: c Out[9]: Counter({'a': 5, 'v': 2, 'd': 2, ' ': 1, 'k': 1, 'e': 1, 'r': 1}) In [10]: +c Out[10]: Counter({'a': 5, 'v': 2, 'd': 2, ' ': 1, 'k': 1, 'e': 1, 'r': 1}) In [11]: c is +c Out[11]: False

Мне очень не нравится, как в стандартной библиотеке pathlib переопределили оператор деления: >>> from pathlib import Path >>> exmpl = Path("/test") >>> exmpl PosixPath('/test') >>> exmpl / "nested" PosixPath('/test/nested') С первого взгляда кажется, что это классная и логичная фича, но когда в твоей голове вполне сформировано, что "/" это деление, то такой код плавит голову...

Всегда казалось, что чуваки, которые сидят на тяжёлом ФП, затем творят какую-то тёмную магию. Вот, например, статья про создание библиотеки для декларативной валидации пользовательского ввода в полтора экрана кода. И ведь, блин, красиво получилось. Как так уметь? https://blog.drewolson.org/declarative-validation