Python/ django
58.9K subscribers
2.08K photos
63 videos
47 files
2.8K links
по всем вопросам @haarrp

@itchannels_telegram - 🔥 все ит-каналы

@ai_machinelearning_big_data -ML

@ArtificialIntelligencedl -AI

@datascienceiot - 📚

@pythonlbooks

РКН: clck.ru/3FmxmM
加入频道
👣 Pyrefly — это новая, высокопроизводительная система статической типизации и IDE-платформа, написанная на Rust, для Python, разрабатываемая командой Facebook.

Главное:
🔍 Наследник Pyre
Pyrefly задуман как следующая версия проверяльщика типов Pyre от Meta, но с упором на скорость, модульную архитектуру и возможность генерации «типизированного» AST.

🚀 Реализовано на Rust
Большая часть кода написана на Rust для лучшей безопасности памяти и конкурентности. Только ~1 % кода в Python и ~6 % в TypeScript (для интерфейса сайта и LSP).

⚙️ Три этапа проверки
Сбор экспорта каждого модуля (решение всех import * рекурсивно)

Преобразование кода в набор «байндингов» (definitions, uses, anon) с учётом потоковых типов

Решение этих байндингов (flow-types, phi-функции при ветвлениях и рекурсии)

💡 Масштабируемость и инкрементальность
Модульно-ориентированный подход: проверка каждого модуля целиком, с возможностью параллельного запуска и минимальной сложности по сравнению с тонкозернистыми DAG-алгоритмами.

🛠️ Интеграция и упаковка

Разработчикам Rust: cargo build, cargo test

Во внутренних проектах Meta: запуск через Buck2 (buck2 run pyrefly -- check file.py)

Для PyPI: сборка колес через Maturin (pip install maturin && maturin build)


📡 IDE-функции и LSP
Включена поддержка Language Server Protocol для автодополнения, перехода к определению и интерактивной отладки в редакторах.

📆 Планы
Полная замена Pyre к концу 2025 года с выпуском стабильных версий на PyPI каждую неделю.

📜 Лицензия
MIT — свободное использование и вклад в проект приветствуются.

🔜 Узнать подробнее и принять участие можно в репозитории: Github

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Jittor фреймворк, использующий JIT-компиляцию и мета-операторы для оптимизации вычислений прямо во время выполнения.

Проект сочетает простоту Python-интерфейса с низкоуровневой компиляцией на C++/CUDA. В отличие от традиционных графовых подходов, он динамически компилирует операции под конкретную модель, что потенциально может ускорить выполнение сложных сетей.

🤖 GitHub

@pythonl
✍️ novelWriter минималистичный редактор для писателей с поддержкой Markdown. Проект использует облегченный синтаксис на основе Markdown и сохраняет все данные в виде обычных текстовых файлов, что делает его идеальным для работы с системами контроля версий.

Инструмент делает акцент на простоте и надежности. Вместо проприетарных форматов он использует чистый текст с метаданными в JSON. Редактор написан на Python с использованием Qt6 и доступен для всех основных ОС. При этом проект остается полностью открытым и принимает contributions, особенно в части переводов через Crowdin.

🤖 GitHub

@pythonl
🔐 Что такое DES - шифрование и как работает?


💡 DES (Data Encryption Standard)
DES — симметричный алгоритм шифрования, разработанный в 1970-х. Он использует один и тот же ключ для шифрования и дешифрования, поэтому ключ нужно хранить в секрете.

Длина ключа: 56 бит

Блоки данных: 64 бита

Основан на 16 раундах перестановок и подстановок

Хотя DES считается устаревшим из-за своей уязвимости (его можно взломать брутфорсом за считанные часы), он до сих пор используется в учебных целях и в некоторых устаревших системах.

🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome.
Пример простого шифрования текста:


from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad

# Ключ должен быть ровно 8 байт
key = b'8bytekey'
cipher = DES.new(key, DES.MODE_ECB)

data = b'HelloWorld123' # Длина должна быть кратной 8, иначе нужно дополнить
padded_data = pad(data, 8 )

encrypted = cipher.encrypt(padded_data)
print("Зашифрованные данные:", encrypted)

# Дешифрование
decrypted = unpad(cipher.decrypt(encrypted), 8 )
print("Расшифрованные данные:", decrypted)


Важно:

Ключ должен быть ровно 8 байт (DES = 64-битный ключ, но 8 бит используются для контроля чётности).

Данные должны быть кратны 8 байтам, поэтому часто используется padding (дополнение пустыми байтами).

⚠️ Почему DES больше не рекомендуют?
Маленький размер ключа → легко перебрать с помощью современных вычислительных мощностей.

Уязвим к атакам (например, differential cryptanalysis).

Сегодня вместо DES чаще используют AES (Advanced Encryption Standard), который безопаснее и быстрее.

✍️ Вывод
Шифрование — важнейший инструмент защиты данных. DES — классический пример симметричного шифрования, но сегодня он больше используется в учебных целях или для совместимости с устаревшими системами. Если нужна настоящая защита, выбирайте современные алгоритмы, такие как AES.
👩‍💻 datasketch — Python-библиотека, содержащая реализации вероятностных структур данных, которые используются для оптимизации работы с большими объемами данных!

🌟 Среди основных возможностей — оценка схожести Jaccard с помощью MinHash и его взвешенной версии, а также оценка кардинальности множества с помощью HyperLogLog и HyperLogLog++. Эти структуры данных позволяют выполнять операции, такие как поиск схожих элементов или подсчет уникальных объектов, быстро и с минимальными затратами памяти.

🔐 Лицензия: MIT

🖥 Github

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Werkzeug — набор утилит для WSGI-приложений на Python

Пока все говорят о Flask, его мозги — библиотека Werkzeug, остается в тени. Этот инструмент уровня middleware лежит в основе многих Python-фреймворков, предоставляя базовые механизмы работы с HTTP-запросами, маршрутизацией и сессиями без навязывания архитектуры.

В Werkzeug нет ORM или шаблонизатора, но зато есть:
▪️Интерактивный дебаггер с REPL прямо в браузере
▪️Гибкая система роутинга (которую позже заимствовал Flask)
▪️WSGI-сервер для разработки с горячей перезагрузкой

🤖 GitHub

@pythonl
Media is too big
VIEW IN TELEGRAM
🖥 История развития Python (1989 – 2025)

1989-12 — Гвидо ван Россум, работая в CWI (Нидерланды), начинает писать новый язык как «лучший ABC».
1991-02 — Публикация Python 0.9.0 в alt.sources; уже есть классы, исключения и базовые коллекции.
1994-01-26 — Выходит Python 1.0.0: добавлены lambda, map, filter, reduce.
1994-02 — Создана группа новостей comp.lang.python, вокруг которой формируется сообщество.
2000-10-16 — Python 2.0: list-comprehensions, сборщик циклического мусора, первая реализация Unicode.
2003-07-29 — Python 2.3: внедрён сортировщик Timsort.
2008-12-03 — Python 3.0 («Py3k»): переход на новый str`/`bytes, print() как функция, разделённый range.
2010-07-03 — Python 2.7: «долгожитель», поддержка продлена до 2020-01-01.
2015-09-13 — Python 3.5: появляется синтаксис async / await.
2018-07-12 — Гвидо объявляет о выходе с поста BDFL после споров вокруг оператора «морж» :=.
2019-10-14 — Python 3.8: тот самый оператор :=, позиционные-только аргументы / и улучшенный typing.
2020-01-01 — Официальный End-of-Life ветки 2.x.
2021-10-04 — Python 3.10: структурное сопоставление match/case.
2023-10-02 — Python 3.12: заметное ускорение интерпретатора (до +25 %), префиксные f-строки.
2024-10-07 — Python 3.13.0: экспериментальная сборка Free-Threaded CPython без GIL (PEP 703).
2025-04-08 — Python 3.13.3 (текущая стабильная версия).
2025-10 (ожидается) — Python 3.14: дальнейшая стабилизация «без-GIL»-сборки, новый `buffer`-API.

---

### Интересные факты

- Название появилось благодаря юмористическому шоу *Monty Python’s Flying Circus*; отсюда мемы «spam / eggs».
- Команда import this выводит Zen of Python — 19 однострочных принципов языка (PEP 20).
- Пасхалка import antigravity открывает комикс xkcd #353; from __future__ import braces выдаёт SyntaxError: not a chance.
- Timsort, написанный для Python 2.3, позже стал дефолтным алгоритмом сортировки в Java 7, Android, Swift и Rust.
- PEP 703 позволяет собирать CPython без GIL, открывая путь к настоящему многопоточному Python без радикального «Python 4».
- В апреле 2025 Python обновил рекорд индекса TIOBE, превысив 25 % и почти втрое обогнав C++.
- Гвидо носил титул BDFL (Benevolent Dictator For Life) почти 30 лет; c 2023 г. он возвращён как *BDFL-Emeritus*.
- PyPI (Python Package Index) превысил 500 000 пакетов, а pip install скачивается около 40 млрд раз в месяц (апрель 2025).
- import __hello__ просто печатает *Hello world!* — напоминание, что «явное лучше неявного».

> Итог: за три с лишним десятилетия Python превратился из рождественского хобби-проекта в язык № 1, оставаясь при этом дружелюбным и легко читаемым .

https://www.youtube.com/shorts/ZDMz1foKKlM?feature=share

@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
📡 FISSURE — фреймворк для анализа и реверс-инжиниринга радиосигналов.

Этот open-source проект объединяет инструменты для работы с RF-сигналами: от обнаружения и классификации до атак и автоматизированного тестирования.

Инструмент поддерживает популярное SDR-оборудование и возможность развертывания распределённых сенсорных узлов для задач радиомониторинга. Проект активно развивается, в 2024 году добавили Z-Wave-анализ и автоматические триггеры для атак.

🤖 GitHub

@pythonl
🐍 Задача с подвохом: Декораторы и мутабельные ловушки

Условие:

Что выведет следующий код и почему?


def memoize(fn):
cache = {}
def wrapper(arg):
if arg in cache:
print("Из кэша")
return cache[arg]
else:
result = fn(arg)
cache[arg] = result
return result
return wrapper

@memoize
def add_to_list(val, lst=[]):
lst.append(val)
return lst

res1 = add_to_list(1)
res2 = add_to_list(2)
res3 = add_to_list(1)

print(res1)
print(res2)
print(res3)


Вопрос:
Что будет выведено? Где здесь двойной подвох?

🔍 Разбор:

На первый взгляд кажется, что:

1. add_to_list(1) вернёт [1]
2. add_to_list(2) вернёт [2]
3. add_to_list(1) снова вызовет функцию (или достанет из кэша)

Но тут два подвоха:

Подвох №1: изменяемый аргумент по умолчанию

Аргумент lst=[] создаётся один раз при определении функции. Все вызовы без передачи списка будут использовать один и тот же список.

Подвох №2: кэширование по ключу

Декоратор memoize кэширует результат по ключу arg. Но функция возвращает список, который изменяется при каждом вызове. Даже если кэш сработает, вы получите тот же объект списка, который менялся между вызовами!

🧮 Что реально произойдёт:

- `res1 = add_to_list(1)` → функция вызвана, список становится `[1]`
- `res2 = add_to_list(2)` → функция вызвана снова (новый аргумент), список становится `[1, 2]`
- `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")` и вернётся **ссылку на тот же изменённый список**

🔢 **Вывод:**

```
[1, 2]
[1, 2]
Из кэша
[1, 2]
```

Все результаты указывают на один и тот же изменённый список.

💥 **Почему это важно:**

1️⃣ **Изменяемые аргументы по умолчанию** сохраняются между вызовами
2️⃣ **Кэширование мутабельных объектов** может привести к неожиданным результатам: при возврате списка вы возвращаете не "результат на момент вычисления", а ссылку на объект, который может измениться позже

🛡️ **Как исправить:**

1️⃣ Использовать `lst=None` и инициализировать внутри функции:
```python
def add_to_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
```

2️⃣ Если кэшировать мутабельные объекты, лучше возвращать **копию**:
```python
import copy
cache[arg] = copy.deepcopy(result)
```

**Вывод:**

Декораторы + мутабельные аргументы = ловушка даже для опытных разработчиков. Особенно, когда мутабельные объекты кэшируются и меняются за кулисами.


@pythonl