Крутая идея про "приватные" переменные — называть их маленькими буквами. При прочтении кода вслух имя переменной произносится шепотом. Пора расширять PEP8!
твит
твит
😁38🙈13💩3👎2🔥1💅1
И снова про
Вот буквально час назад рассказывал коллегам, что
Какая-то невероятная скорость развития инструмента. Становится уже сложно уследить за всеми изменениями.
https://github.com/charliermarsh/ruff/releases/tag/v0.0.250
ruff
.Вот буквально час назад рассказывал коллегам, что
ruff
не понимает синтаксис match-case
, и поэтому мы пока не можем его использовать. А он, оказывается, уже понимает! Меньше суток назад вышел релиз с полной поддержкой нового синтаксиса из Python 3.10 и 3.11. Это был основной блокер, который сильно мешал адопшену инструмента. Теперь ожидаю взрывной рост популярности ruff
!Какая-то невероятная скорость развития инструмента. Становится уже сложно уследить за всеми изменениями.
https://github.com/charliermarsh/ruff/releases/tag/v0.0.250
GitHub
Release v0.0.250 · astral-sh/ruff
What's Changed
Ruff now supports all Python 3.10 and 3.11 language features, including:
Structural Pattern Patching (match statements) (PEP 634)
Exception Groups (except* statements) (PEP 654)...
Ruff now supports all Python 3.10 and 3.11 language features, including:
Structural Pattern Patching (match statements) (PEP 634)
Exception Groups (except* statements) (PEP 654)...
👍19🔥19
Хороший наброс на тайп-хинты недавно запостили на реддите. Про проблемы и сложности, а не про восхваление, как я обычно люблю. Да, покрывать тайп-хинтами старый код, написанный с расчётом на утиную типизацию, действительно может быть нетривиальным упражнением.
Когда первый раз увидел, как в
Когда первый раз увидел, как в
typeshed
зааннотировали встроенную функцию pow()
(это возведение числа в степень), то до вечера потом ходил под впечатлением. Там описали 30 разных вариантов этой функции, и это всё ещё покрывает не все возможные кейсы. Ну что за жесть. Система типов не может нормально выразить просто гигантский пласт возможностей языка. А потом как-то подумал, что системе типов не обязательно быть идеальной, чтобы быть полезной, и полегчало. Ладно, большую часть проблем ловит. Я не так часто замечаю эти места, где система типов даёт слабину, зато тайп-чекинг каждый день спасает меня от кучи глупых ошибок. Practicality beats purity, короче. Нет, всё-таки не могу не похвалить тайп-чекинг. Полезная штука, обязательно пользуйтесь.Reddit
From the Python community on Reddit
Explore this post and more from the Python community
👍14❤1🤮1
Недавно в numpy добавили поддержку набора инструкций AVX-512 для процессоров Intel, и это ускорило сортировку массивов в 10-17 раз. Про огромное ускорение — это круто, но в целом история вокруг AVX-512 очень загадочная. Краткий пересказ на скрине, я чёт прям прикрикнул с этого комментария. Intel странные.
😁11❤1
Кстати, у PSF дела идут хорошо. В фонд задонатили денег, и благодаря этому появилась возможность на год нанять на фулл-тайм человека, который будет заниматься различными аспектами безопасности CPython, PyPI и других проектов фонда. Ищут подходящего человека. Деньги вроде обещают достойные. Вот тут анонс.
А задонатил деньги в PSF другой фонд, под названием Open Source Security Foundation (OpenSSF), в который собрались примерно 100 айти-гигантов различного размера, которые теперь скоординировано наносят добро и безопасность в разные опенсорсные проекты. Например, они также выдали гранты на безопасность в Rust, Node.js, jQuery и Eclipse. Хорошая инициатива, одобряю.
А задонатил деньги в PSF другой фонд, под названием Open Source Security Foundation (OpenSSF), в который собрались примерно 100 айти-гигантов различного размера, которые теперь скоординировано наносят добро и безопасность в разные опенсорсные проекты. Например, они также выдали гранты на безопасность в Rust, Node.js, jQuery и Eclipse. Хорошая инициатива, одобряю.
Python Software Foundation Blog
The PSF is hiring a Security Developer-in-Residence!
The Python Software Foundation (PSF) is happy to announce the launch of a year-long security enhancement initiative that will include a secu...
👍16👏2🔥1
Ещё про изменения, которые хотят попасть в 3.12.
Недавно опубликовали PEP 709 – Inlined comprehensions про оптимизацию list, dict & set comprehension'ов. Кстати, как вы называете это по-русски? Списковые включения, словарные включения? Странно звучит. Буду писать "компрехеншн", как обычно говорю.
Сейчас эти компрехеншены создают служебную функцию, которая сразу же вызывается один раз, после чего удаляется сборщиком мусора. Эта функция нужна для того, чтобы изолировать внутренние переменные компрехеншена, чтобы они не были доступны извне. Скорее всего, так было сделано, потому что так было проще всего — переиспользовались готовые, отлаженные механизмы языка.
Идея оптимизации состоит в том, чтобы избежать создания этой одноразовой функции, а изоляции внутренних переменных компрехеншена достигать другими способами. Грубо говоря, обычным удалением этих переменных по завершению работы. И так получается быстрее — микробенчмарки компрехеншенов показывают ускорение работы аж в 2 раза, а в среднем от кода с компрехеншенами можно ожидать ускорение на уровне 11%. Это создание и вызов одноразовой функции с вытекающими операциями над стэком вызовов оказались довольно дорогими.
Такая оптимизация поменяет некоторые детали, на которые, скорее всего, мало кто сильно рассчитывает. Например, стектрейсы от ошибок, возникших в теле компрехеншена, станут на 1 этаж короче из-за отсутствия этой служебной функции.
Оптимизация затронет только компрехеншены, вложенные в функции. Глобальные компрехеншены пока решили не трогать — там особый случай. Генераторные выражения (generator expressions) тоже пока не оптимизируются. Короче, работают по принципу "low effort, high reward".
Автор пропозала работает в Instagram. Видимо, они постепенно выносят удачные идеи из своего performance-oriented форка интерпретатора Cinder в апстрим.
PEP на данный момент находится в статусе черновика. Думаю, что будет принят.
Недавно опубликовали PEP 709 – Inlined comprehensions про оптимизацию list, dict & set comprehension'ов. Кстати, как вы называете это по-русски? Списковые включения, словарные включения? Странно звучит. Буду писать "компрехеншн", как обычно говорю.
Сейчас эти компрехеншены создают служебную функцию, которая сразу же вызывается один раз, после чего удаляется сборщиком мусора. Эта функция нужна для того, чтобы изолировать внутренние переменные компрехеншена, чтобы они не были доступны извне. Скорее всего, так было сделано, потому что так было проще всего — переиспользовались готовые, отлаженные механизмы языка.
Идея оптимизации состоит в том, чтобы избежать создания этой одноразовой функции, а изоляции внутренних переменных компрехеншена достигать другими способами. Грубо говоря, обычным удалением этих переменных по завершению работы. И так получается быстрее — микробенчмарки компрехеншенов показывают ускорение работы аж в 2 раза, а в среднем от кода с компрехеншенами можно ожидать ускорение на уровне 11%. Это создание и вызов одноразовой функции с вытекающими операциями над стэком вызовов оказались довольно дорогими.
Такая оптимизация поменяет некоторые детали, на которые, скорее всего, мало кто сильно рассчитывает. Например, стектрейсы от ошибок, возникших в теле компрехеншена, станут на 1 этаж короче из-за отсутствия этой служебной функции.
Оптимизация затронет только компрехеншены, вложенные в функции. Глобальные компрехеншены пока решили не трогать — там особый случай. Генераторные выражения (generator expressions) тоже пока не оптимизируются. Короче, работают по принципу "low effort, high reward".
Автор пропозала работает в Instagram. Видимо, они постепенно выносят удачные идеи из своего performance-oriented форка интерпретатора Cinder в апстрим.
PEP на данный момент находится в статусе черновика. Думаю, что будет принят.
🆒21👍13🔥2🦄2🤔1
Это канал Marc Garcia, core-контрибьютора pandas, так что если связаны с анализом данных, то подписывайтесь
👍7🔥1
Forwarded from datapythonista
#pandas 2.0 will be released soon. I wrote about one of the most important changes we're shipping with it.
https://datapythonista.me/blog/pandas-20-and-the-arrow-revolution-part-i
https://datapythonista.me/blog/pandas-20-and-the-arrow-revolution-part-i
datapythonista blog
pandas 2.0 and the Arrow revolution (part I)
Introduction At the time of writing this post, we are in the process of releasing pandas 2.0. The project has a large number of users,...
👍4🔥1
Утилита, которая находит неиспользуемые библиотеки в виртуальном окружении. Статически анализирует код, вычленяя из него импорты, и сверяет их со списком зависимостей из
https://github.com/fredrikaverpil/creosote
pyproject.toml
или requirements.txt
.https://github.com/fredrikaverpil/creosote
GitHub
GitHub - fredrikaverpil/creosote: Identify unused dependencies and avoid a bloated virtual environment.
Identify unused dependencies and avoid a bloated virtual environment. - fredrikaverpil/creosote
👍26
FastAPI наконец-то поняли, что переводить документацию на разные языки — это путь в никуда, и сделали нормальную всем сразу понятную интернационализацию. Они долго постепенно к этому шли, увеличивая количество эмодзи, и вот наконец перешли полностью 🚀
А, 2 апреля уже? Ну ладно.
А, 2 апреля уже? Ну ладно.
🔥34😈2❤1👍1😁1🦄1
Вышел PyCharm 2023.1 с новым UI.
По дефолту новый UI включен только для новых пользователей Community Edition, а для всех остальных есть возможность переключиться на New UI через настройки. Обратно переключиться на старый интерфейс тоже можно, да.
Сначала было непривычно, но спустя два дня мне эти иконочки кажутся даже более удобными, чем текстовые панели. Много всего запихнуто в заголовок окна — прикольно. Виджет для работы с Git приятно переделали. Compact Mode — тема.
Бесит только, что панель Notifications вышла из слепой зоны, и я стал эти уведомления замечать. Оказывается, у IDE всё время что-то внутри происходит!
https://blog.jetbrains.com/pycharm/2023/03/2023-1/
По дефолту новый UI включен только для новых пользователей Community Edition, а для всех остальных есть возможность переключиться на New UI через настройки. Обратно переключиться на старый интерфейс тоже можно, да.
Сначала было непривычно, но спустя два дня мне эти иконочки кажутся даже более удобными, чем текстовые панели. Много всего запихнуто в заголовок окна — прикольно. Виджет для работы с Git приятно переделали. Compact Mode — тема.
Бесит только, что панель Notifications вышла из слепой зоны, и я стал эти уведомления замечать. Оказывается, у IDE всё время что-то внутри происходит!
https://blog.jetbrains.com/pycharm/2023/03/2023-1/
🔥10💩5❤1👏1
Вы наверняка видели волну постов про исследование аудитории Telegram неделю назад. Это было примерно в половине каналов, которые я читаю. Это единственное в своём роде исследование такого масштаба, которое проводится в третий раз и уже почти стало традицией. Результаты получаются примерно такие же по интересности, как у отчётов StackOverflow. С прошлого исследования два года назад всё сильно поменялось. Прикольно было бы увидеть свежую картину. Кстати, вот тут результаты за 2021 и 2019 годы.
Так вот, если вы ещё не прошли опрос, то идите заполнять. Занимает примерно 7 минут. Никакой особо личной информации не спрашивают, кроме базовой демографии (пол, возраст, местоположение, род деятельности, уровень дохода,пин-код от карты). Дело полезное.
В процессе заполнения поискал свои самые старые чаты и осознал, что сижу в телеге уже больше 7 лет. И это только на этом аккаунте, а у меня раньше ещё другой вроде был. Кажется, даже смутно помню те времена, когда из стикеров были только эти бледно-синие с Николой Теслой. Словил ностальгию, но ощущения, что "раньше было лучше" тоже нет. В телеге и сейчас вполне себе уютно. А вы давно в телеге сидите?
Так вот, если вы ещё не прошли опрос, то идите заполнять. Занимает примерно 7 минут. Никакой особо личной информации не спрашивают, кроме базовой демографии (пол, возраст, местоположение, род деятельности, уровень дохода,
В процессе заполнения поискал свои самые старые чаты и осознал, что сижу в телеге уже больше 7 лет. И это только на этом аккаунте, а у меня раньше ещё другой вроде был. Кажется, даже смутно помню те времена, когда из стикеров были только эти бледно-синие с Николой Теслой. Словил ностальгию, но ощущения, что "раньше было лучше" тоже нет. В телеге и сейчас вполне себе уютно. А вы давно в телеге сидите?
TGStat.ru
Исследование аудитории Telegram 2023.
Кто же он — пользователь Telegram 2023 года?
👍2🤮2
Недавно вышла пачка минорных релизов CPython.
Очередная порция исправлений и улучшений попала в 3.11.3. Тем временем, метрика поддержки ветки 3.11 в библиотеках достигла уровня 43.1%, что всё ещё сильно меньше поддержки ветки 3.10 (70.6%).
Впрочем, это не нужно понимать как причину оставаться на 3.10, потому что эта ветка на днях получила последний баг-фикс релиз (3.10.11) и перешла в режим "security fixes only". Всё, больше никакие исправления багов бэкпортироваться не будут, а будут только исправления уязвимостей. Как всегда, переход в этот статус наступает очень внезапно и выглядит как что-то преждевременное. Но и команду разработки тоже могу понять: поддерживать хотя бы даже две параллельные ветки активно развивающегося проекта — это уже сложно, а три — это вообще боль, боль в кубе.
Кстати, а вы знали, что 3.7 через пару месяцев депрекейтнут окончательно? Успели уже везде обновиться?
Очередная порция исправлений и улучшений попала в 3.11.3. Тем временем, метрика поддержки ветки 3.11 в библиотеках достигла уровня 43.1%, что всё ещё сильно меньше поддержки ветки 3.10 (70.6%).
Впрочем, это не нужно понимать как причину оставаться на 3.10, потому что эта ветка на днях получила последний баг-фикс релиз (3.10.11) и перешла в режим "security fixes only". Всё, больше никакие исправления багов бэкпортироваться не будут, а будут только исправления уязвимостей. Как всегда, переход в этот статус наступает очень внезапно и выглядит как что-то преждевременное. Но и команду разработки тоже могу понять: поддерживать хотя бы даже две параллельные ветки активно развивающегося проекта — это уже сложно, а три — это вообще боль, боль в кубе.
Кстати, а вы знали, что 3.7 через пару месяцев депрекейтнут окончательно? Успели уже везде обновиться?
blog.python.org
Python Insider: Python 3.11.3, Python 3.10.11 and 3.12.0 alpha 7 are available
👍1
Charlie Marsh, автор быстрого линтера #ruff, основал компанию Astral и сразу же поднял $4m инвестиций. Автор планирует продолжать работать над ruff и другими инструментами для разработчиков фулл-тайм (как он это уже и так делает последние полгода), только уже не один, а с командой. На данный момент в компании 3 разработчика, включая самого Чарли, и это прям звёздная команда, собранная из разработчиков разных популярных и важных проектов (Maturin, Rome).
Обещают, что ruff останется опенсорсным с пермиссивной лицензией, а вокруг него компания будет делать какие-то платные сервисы. Короче, очень похоже на подход Pydantic. Эта весна чёт богата на компании вокруг опенсорса.
Ruff ещё не выпустили стабильную версию, проект всё ещё в разработке. Видимо, раз дали денег, то инвесторы считают, что этот проект просто обязан выстрелить.
https://astral.sh/blog/announcing-astral-the-company-behind-ruff
Обещают, что ruff останется опенсорсным с пермиссивной лицензией, а вокруг него компания будет делать какие-то платные сервисы. Короче, очень похоже на подход Pydantic. Эта весна чёт богата на компании вокруг опенсорса.
Ruff ещё не выпустили стабильную версию, проект всё ещё в разработке. Видимо, раз дали денег, то инвесторы считают, что этот проект просто обязан выстрелить.
https://astral.sh/blog/announcing-astral-the-company-behind-ruff
Telegram
Питонические атаки
В чате-комментах сообщают, что Pydantic поднял бабла 💸
Теперь это не просто библиотечка для парсинга/валидации данных. Это теперь вообще-то корпорация Pydantic Services с автором библиотеки, Samuel Colvin, во главе! Новоиспечённый стартап получил 4.7 миллиона…
Теперь это не просто библиотечка для парсинга/валидации данных. Это теперь вообще-то корпорация Pydantic Services с автором библиотеки, Samuel Colvin, во главе! Новоиспечённый стартап получил 4.7 миллиона…
🔥28👎2👍1
В Python 3.12 приняли PEP 695 – Type Parameter Syntax, который добавляет новый синтаксис для дженерик классов, функций и алиасов для типов. Это вот то, где используется
Давайте посмотрим на изменение на примере функции с переменными типа (смотри скриншот 1). Если что, это нужно для того, чтобы связать типы нескольких параметров и возвращаемых значений функции. Вот функция принимает на вход значение (любого типа), а на выходе она отдаст значение такого же типа. Часто используемый сценарий, как мне кажется. Такое стало писать намного приятнее. Не нужно отдельно писать это явное, некрасивое определение
Кроме того, тайп-алиасы с переменными типов тоже стало писать намного легче (смотри скриншот 2). Тоже отпала необходимость явно определять
Про классы-дженерики писать не буду, но если вы такое практикуете, то сходите почитайте док. Там интересно.
Отдельно прикольно, что больше не надо думать о ковариантности, контравариантности и инвариантности переменных типов. Эти концепции никуда не уходят, но теперь тайп-чекер будет сам понимать, с чем он работает, без необходимости явного указания. Это вот та штука, из-за которой приходится аргументы функций аннотировать как
Если не думать о том, что это изменение создаёт новую область видимости для имён (scope) с довольно странной механикой работы, добавляет новое мягкое ключевое слово, добавляет новый сорт
typing.TypeVar
(спойлер: больше нет). Да, это снова про тайп хинты. Похоже, это самая активно развивающаяся область языка за последние 10 лет.Давайте посмотрим на изменение на примере функции с переменными типа (смотри скриншот 1). Если что, это нужно для того, чтобы связать типы нескольких параметров и возвращаемых значений функции. Вот функция принимает на вход значение (любого типа), а на выходе она отдаст значение такого же типа. Часто используемый сценарий, как мне кажется. Такое стало писать намного приятнее. Не нужно отдельно писать это явное, некрасивое определение
typing.TypeVar
, где ты дважды пишешь одно и то же имя переменной и засоряешь странными однобуквенными именами глобальную область видимости. В 3.12 можно будет просто прям при определении функции задекларировать своё намерение: "я буду тут использовать переменную типа T
", и аннотируешь ей все связанные аргументы и возвращаемые значения. Офигенно? О да.Кроме того, тайп-алиасы с переменными типов тоже стало писать намного легче (смотри скриншот 2). Тоже отпала необходимость явно определять
TypeVar
. Но теперь в языке появляется новое "мягкое" ключевое слово type
, которое ведёт себя по-разному в зависимости от контекста (как async
). Забавно, что это нововведение фактически депрекейтит PEP 613 про тайп алиасы, который появился в 3.10. Я даже толком не успел начать им пользоваться. Всё так быстро меняется.Про классы-дженерики писать не буду, но если вы такое практикуете, то сходите почитайте док. Там интересно.
Отдельно прикольно, что больше не надо думать о ковариантности, контравариантности и инвариантности переменных типов. Эти концепции никуда не уходят, но теперь тайп-чекер будет сам понимать, с чем он работает, без необходимости явного указания. Это вот та штука, из-за которой приходится аргументы функций аннотировать как
Sequence[Parent]
вместо list[Parent]
и которую я долго не мог осознать. Кстати, недавно смотрел хороший видос про эти концепции. Разобрался, вроде. Блин, не может ли недостаток понятных материалов на эту тему быть связан с тем, что эти слова так сложно писать и произносить? Я минуту набирал и перечитывал эти три слова в начале абзаца, да и то наверняка ошибся.Если не думать о том, что это изменение создаёт новую область видимости для имён (scope) с довольно странной механикой работы, добавляет новое мягкое ключевое слово, добавляет новый сорт
TypeVar
(теперь у нас есть "традиционные" и новые, и их нельзя смешивать между собой) и в целом делает язык синтаксически сложнее (давайте писать квадратные скобки вообще везде), то это абсолютно точно движение в правильную сторону, шаг навстречу программисту. Бойлерплейта станет меньше, импортов из typing
меньше, сложных концепций меньше, пространства для ошибки тоже. Да и выглядит относительно предыдущего варианта намного приятнее. Мне нравится.Python Enhancement Proposals (PEPs)
PEP 695 – Type Parameter Syntax | peps.python.org
This PEP specifies an improved syntax for specifying type parameters within a generic class, function, or type alias. It also introduces a new statement for declaring type aliases.
👍20❤5🎉2🤮2
В AWS Lambda наконец-то добавили рантайм Python 3.10. Вот интересно, они специально зачем-то добавляют новые рантаймы с отставанием в полтора года? Впрочем, все, кто серьёзно занимается разработкой serverless-приложений, наверняка просто используют контейнеры с каким нужно питоном внутри.
Тем временем в Yandex Cloud Functions есть рантайм с Python 3.11. Но почему-то нет 3.10 🤔
Тем временем в Yandex Cloud Functions есть рантайм с Python 3.11. Но почему-то нет 3.10 🤔
Amazon
Python 3.10 runtime now available in AWS Lambda | Amazon Web Services
You can build and deploy functions using Python 3.10 using the AWS Management Console, AWS CLI, AWS SDK, AWS SAM, AWS CDK, or your choice of Infrastructure as Code (IaC).
👍6😈2
Forwarded from Python Заметки
Популярность имеет свои минусы. Чем популярней язык программирования, тем выше его распространённость, а значит найдутся те кто поспешит воспользоваться этим.
С ростом популярности Python всё больше на PyPi появляется вредоносных пакетов. Трояны, стиллеры и доставщики более опасных вредоносов.
Команда PyPi постоянно мониторит подобные случаи но и их возможности достигли предела. В результате сервис временно закрывает возможность заливки новых пакетов и регистрации юзеров.
PyPI new user and new project registrations temporarily suspended
Возможно одной из причин большого наплыва вредоносов является резко возросшая доступность их создания. Сегодня любой, даже не программист, может попросить у ChatGPT написать необходимый код и все инструкции для атаки.
Основной тип атаки - рассчёт на опечатку в названии пакета. Если невнимательный программист случайно установит
Чтобы избежать подобных факапов я рекомендую:
▫️ Всегда работайте в виртуальном окружении, неизвестные проекты устанавливайте внутри контейнеров.
▫️ Используйте файл
▫️ Очень внимательно пишите названия пакетов, а после написания проверьте еще раз. Сверьте с названием из документации.
▫️ После успешных тестов всегда фиксируйте версию пакета. Бывали случаи когда опасный код добавляли в новые версии. К тому же и без этой опасности не рекомендуется ставить по умолчанию последнюю версию.
▫️ Используйте вспомогательные инструменты для проверки безопасности, например https://pyup.io/safety или https://github.com/PyCQA/bandit. Они помогут не только найти опасный код в чужих пакетах, но и ваш код проверит на уязвимости.
Будем надеяться что PyPi переосмыслит методы борьбы с вредоносами, например внедрит ИИ для проверки как симметричный шаг.
#offtop
С ростом популярности Python всё больше на PyPi появляется вредоносных пакетов. Трояны, стиллеры и доставщики более опасных вредоносов.
Команда PyPi постоянно мониторит подобные случаи но и их возможности достигли предела. В результате сервис временно закрывает возможность заливки новых пакетов и регистрации юзеров.
PyPI new user and new project registrations temporarily suspended
Возможно одной из причин большого наплыва вредоносов является резко возросшая доступность их создания. Сегодня любой, даже не программист, может попросить у ChatGPT написать необходимый код и все инструкции для атаки.
Основной тип атаки - рассчёт на опечатку в названии пакета. Если невнимательный программист случайно установит
pilow
или djangoo
, считай что вредонос уже в системе.Чтобы избежать подобных факапов я рекомендую:
▫️ Всегда работайте в виртуальном окружении, неизвестные проекты устанавливайте внутри контейнеров.
▫️ Используйте файл
requirements.txt
вместо ручной установки пакетов▫️ Очень внимательно пишите названия пакетов, а после написания проверьте еще раз. Сверьте с названием из документации.
▫️ После успешных тестов всегда фиксируйте версию пакета. Бывали случаи когда опасный код добавляли в новые версии. К тому же и без этой опасности не рекомендуется ставить по умолчанию последнюю версию.
▫️ Используйте вспомогательные инструменты для проверки безопасности, например https://pyup.io/safety или https://github.com/PyCQA/bandit. Они помогут не только найти опасный код в чужих пакетах, но и ваш код проверит на уязвимости.
Будем надеяться что PyPi переосмыслит методы борьбы с вредоносами, например внедрит ИИ для проверки как симметричный шаг.
#offtop
👍18💊5😁2❤1⚡1👎1