Разработчик представил PyXL — уникальный аппаратный процессор, который исполняет Python-программы без использования традиционного интерпретатора или виртуальной машины.
Архитектура PyXL:
Python → CPython Bytecode → собственный набор инструкций для прямого исполнения на "железе".
Основан на стековой модели, полностью конвейерный, с сохранением динамической типизации Python без ограничений статических типов.
PyXL выполняет переключение GPIO с задержкой всего 480 наносекунд.
Для сравнения: MicroPython на Pyboard — 14–25 микросекунд, несмотря на более высокую частоту (168МГц против 100МГц у PyXL).
Разработчик самостоятельно создал:
Компилятор, линкер и генератор кода
Аппаратную реализацию процессора
Проект демонстрирует, что возможно аппаратное исполнение Python с высокой скоростью и без потери гибкости языка. Полные технические детали будут представлены на PyCon 2025.
🎬 Демо и подробности: https://runpyxl.com/gpio
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
На конференции LlamaCon CEO Microsoft Сатья Наделла объявил, что от 20 % до 30 % кода в репозиториях компании сегодня «написаны программным обеспечением», то есть с использованием искусственного интеллекта.
## Ключевые моменты
- Зависимость от языка. Лучшие результаты при генерации — на Python, более слабые — на C++.
- Интеграция на всех этапах. AI применяется не только для генерации чернового кода, но и для его ревью.
- Сравнение с конкурентами. Google уже сообщает о более 30 % AI-сгенерированного кода, Meta прогнозирует до 50 % при разработке своих языковых моделей.
- Долгосрочная перспектива. По прогнозам CTO Microsoft, к 2030 г. доля AI-генерируемого кода может вырасти до 95 %.
- Ограничения метрик. Пока не до конца ясно, что именно учитывается в «AI-коде» (автодополнение, шаблоны, бизнес-логика), поэтому цифры стоит воспринимать с осторожностью.
## Почему это важно
1. Ускорение разработки. Рутинные задачи автоматизируются, разработчики получают больше времени на архитектуру.
2. Новый уровень качества. Автоматическое ревью помогает быстрее находить ошибки, но требует строгой проверки.
3. Риски безопасности. Сгенерированный код нуждается в дополнительном анализе на уязвимости.
4. Эволюция ролей. Разработчики всё больше становятся архитекторами и аудиторами, а не «создателями» кода.
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Это кроссплатформенный терминальный termux-ориентированный файловый менеджер, предназначенный для использования с проектом Uni-Curses
Запустите tuifi в терминале, или импортируйте его в один из ваших проектов Uni-Curses как компонент, например:
from TUIFIManager import *
Установка
sudo pip3 install tuifimanager --upgrade
pip3 install TUIFIManager --upgrade
https://github.com/GiorgosXou/TUIFIManager
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
def extend_list(val, lst=[]):
lst.append(val)
return lst
# Первый вызов: используем список по умолчанию
list1 = extend_list(10)
# Второй вызов: передаём новый пустой список
list2 = extend_list(123, [])
# Третий вызов: снова используем список по умолчанию
list3 = extend_list('a')
print('list1 =', list1)
print('list2 =', list2)
print('list3 =', list3)
🧩 Решение
В сигнатуре функции lst=[] создаётся один список при определении функции и затем переиспользуется во всех вызовах, где lst не передан.
Первый вызов
```python
list1 = extend_list(10)
lst не передан → берётся дефолтный список.
Добавляем 10.
⇒ list1 становится [10].
```p
Второй вызов
```python
list2 = extend_list(123, [])```
Передаём новый пустой список [].
В него добавляется 123.
⇒ list2 становится [123].
Третий вызов
```python
list3 = extend_list('a')```
Опять не передан
lst
Добавляем 'a'.
⇒ дефолтный список становится [10, 'a'], и list3 тоже ссылается на [10, 'a'].
Итоговый вывод программы:
```python
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']```
Обратите внимание, что
list1 и list3
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Главное:
🔍 Наследник 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 — свободное использование и вклад в проект приветствуются.
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Jittor — фреймворк, использующий JIT-компиляцию и мета-операторы для оптимизации вычислений прямо во время выполнения.
Проект сочетает простоту Python-интерфейса с низкоуровневой компиляцией на C++/CUDA. В отличие от традиционных графовых подходов, он динамически компилирует операции под конкретную модель, что потенциально может ускорить выполнение сложных сетей.
🤖 GitHub
@pythonl
Проект сочетает простоту Python-интерфейса с низкоуровневой компиляцией на C++/CUDA. В отличие от традиционных графовых подходов, он динамически компилирует операции под конкретную модель, что потенциально может ускорить выполнение сложных сетей.
🤖 GitHub
@pythonl
✍️ novelWriter — минималистичный редактор для писателей с поддержкой Markdown. Проект использует облегченный синтаксис на основе Markdown и сохраняет все данные в виде обычных текстовых файлов, что делает его идеальным для работы с системами контроля версий.
Инструмент делает акцент на простоте и надежности. Вместо проприетарных форматов он использует чистый текст с метаданными в JSON. Редактор написан на Python с использованием Qt6 и доступен для всех основных ОС. При этом проект остается полностью открытым и принимает contributions, особенно в части переводов через Crowdin.
🤖 GitHub
@pythonl
Инструмент делает акцент на простоте и надежности. Вместо проприетарных форматов он использует чистый текст с метаданными в JSON. Редактор написан на Python с использованием Qt6 и доступен для всех основных ОС. При этом проект остается полностью открытым и принимает contributions, особенно в части переводов через Crowdin.
🤖 GitHub
@pythonl
🔐 Что такое DES - шифрование и как работает?
💡 DES (Data Encryption Standard)
DES — симметричный алгоритм шифрования, разработанный в 1970-х. Он использует один и тот же ключ для шифрования и дешифрования, поэтому ключ нужно хранить в секрете.
Длина ключа: 56 бит
Блоки данных: 64 бита
Основан на 16 раундах перестановок и подстановок
Хотя DES считается устаревшим из-за своей уязвимости (его можно взломать брутфорсом за считанные часы), он до сих пор используется в учебных целях и в некоторых устаревших системах.
🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome.
Пример простого шифрования текста:
✅ Важно:
Ключ должен быть ровно 8 байт (DES = 64-битный ключ, но 8 бит используются для контроля чётности).
Данные должны быть кратны 8 байтам, поэтому часто используется padding (дополнение пустыми байтами).
⚠️ Почему DES больше не рекомендуют?
Маленький размер ключа → легко перебрать с помощью современных вычислительных мощностей.
Уязвим к атакам (например, differential cryptanalysis).
Сегодня вместо DES чаще используют AES (Advanced Encryption Standard), который безопаснее и быстрее.
✍️ Вывод
Шифрование — важнейший инструмент защиты данных. DES — классический пример симметричного шифрования, но сегодня он больше используется в учебных целях или для совместимости с устаревшими системами. Если нужна настоящая защита, выбирайте современные алгоритмы, такие как AES.
💡 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.
@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
Пока все говорят о Flask, его мозги — библиотека Werkzeug, остается в тени. Этот инструмент уровня middleware лежит в основе многих Python-фреймворков, предоставляя базовые механизмы работы с HTTP-запросами, маршрутизацией и сессиями без навязывания архитектуры.
В Werkzeug нет ORM или шаблонизатора, но зато есть:
▪️Интерактивный дебаггер с REPL прямо в браузере
▪️Гибкая система роутинга (которую позже заимствовал Flask)
▪️WSGI-сервер для разработки с горячей перезагрузкой
🤖 GitHub
@pythonl
Media is too big
VIEW IN TELEGRAM
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
Этот open-source проект объединяет инструменты для работы с RF-сигналами: от обнаружения и классификации до атак и автоматизированного тестирования.
Инструмент поддерживает популярное SDR-оборудование и возможность развертывания распределённых сенсорных узлов для задач радиомониторинга. Проект активно развивается, в 2024 году добавили Z-Wave-анализ и автоматические триггеры для атак.
🤖 GitHub
@pythonl
🐍 Задача с подвохом: Декораторы и мутабельные ловушки
Условие:
Что выведет следующий код и почему?
❓ Вопрос:
Что будет выведено? Где здесь двойной подвох?
🔍 Разбор:
На первый взгляд кажется, что:
1.
2.
3.
Но тут два подвоха:
Подвох №1: изменяемый аргумент по умолчанию
Аргумент
Подвох №2: кэширование по ключу
Декоратор
🧮 Что реально произойдёт:
- `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
Условие:
Что выведет следующий код и почему?
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