Python Portal
52.6K subscribers
2.66K photos
432 videos
53 files
1.12K links
Всё самое интересное из мира Python

Сотрудничество, реклама: @devmangx

Менеджер: @Spiral_Yuri

РКН: https://clck.ru/3GMMF6
Download Telegram
😢😢😢

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😢43👍5
Наследование в Python меняет путь поиска атрибутов, также известный как «method resolution order» (MRO):

class Child:
pass

Child.__mro__ # (__main__.Child, object)

class Child(Parent):
pass

Child.__mro__ # (__main__.Child, __main__.Parent, object)


То есть MRO показывает, в каком порядке Python будет искать методы и атрибуты: сначала в классе потомке, затем в родителях по цепочке, и в конце — в базовом object.

@PythonPortal
👍10
Не тратьте токены вашего AI на исследование проекта

Создайте локальный семантический граф вашего кода с помощью этого инструмента:

✓ –92% вызовов внешних инструментов
✓ Исследование кода на 71% быстрее
✓ Поддержка Claude Code, Cursor, Codex и OpenCode

Локально и с открытым исходным кодом:
http://github.com/colbymchenry/codegraph

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
Непереводимая игра слов

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5113🤣7🤔2👀2
Библиотека Python itertools содержит много полезных функций.

Одна из них — compress(), которая возвращает итератор по элементам из data, для которых соответствующий элемент в selectors равен True.

Вот пример:
👍16
Нужно понять, какие аргументы переданы в скрипт на Питоне.

Для этого используется sys.argv — список, где:

sys.argv[0] — имя самого скрипта
дальше идут все переданные параметры запуска

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔1
👃👃👃

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁433🏆2
Open-source проект Presenton (5K+ звёзд) генерирует презентации из промптов и документов.

Поддерживает:
- промпт → презентация
- документ → презентация
- экспорт PPTX и PDF
- шаблоны
- самохостинг (Докер)
- API
- BYOK
- Ollama

Работает через генерацию + редактирование + экспорт, без привязки к закрытому редактору.

GitHub: github.com/presenton/pres

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
6
«10 миллионов документов помещаются в 4 ГБ ОЗУ»: https://github.com/RyanCodrai/turbovec

Корпус из 10 миллионов документов занимает 31 ГБ ОЗУ в формате float32. turbovec укладывает это в 4 ГБ и выполняет поиск быстрее, чем FAISS.

turbovec — векторный индекс на Rust с Python-обвязками, построенный на алгоритме TurboQuant от Google Research — data-oblivious квантизаторе, который достигает границы Шеннона по искажению без обучения и без проходов по данным.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥186👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
😁41🌭5
ИДЕЯ: перепродажа open-source репозиториев бизнесам. стратегия, о которой почти не говорят

тысячи репозиториев на GitHub решают реальные бизнес-задачи. бесплатно. открыто. готово к продакшну

и 99% бизнесов никогда их не найдут

как превратить ЛЮБОЕ open-source решение в $2,000+ в месяц с одного клиента:

1. найти инструмент, который закрывает дорогую проблему

зайти в GitHub Trending. отфильтровать по звёздам, свежей активности и нормальной документации. искать инструменты, которые заменяют то, за что бизнес сейчас платит $500–2,000 в месяц

примеры, которые уже существуют:

- CRM-системы (Twenty, $0 вместо Salesforce за $300/место/мес)
- helpdesk-платформы (Chatwoot, $0 вместо Intercom за $1,200/мес)
- аналитика (Plausible, $0 вместо Mixpanel за $800/мес)
- планировщики (Cal.com, $0 вместо Calendly Business за $480/мес)
- email-маркетинг (Listmonk, $0 вместо Mailchimp за $600/мес)
- конструкторы форм (Formbricks, $0 вместо Typeform за $400/мес)
- управление проектами (Plane, $0 вместо Jira за $700/мес на команду)

это не игрушки. у них по 10k–50k+ звёзд, активные комьюнити и компании, которые уже используют их в продакшне

2. выбрать ОДНУ нишу

не «мы разворачиваем open-source инструменты». а «мы заменяем Salesforce для агентств недвижимости» или «мы настраиваем приватную аналитику для медицинских компаний с требованиями к комплаенсу»

ниша формирует маржу. общий деплой = $2k/клиент на поддержку. нишевый деплой = $200, потому что всё уже шаблонизировано

3. развернуть на VPS за $20–50/мес

Hetzner, Railway, Coolify или обычный DigitalOcean droplet. Claude Code проводит через весь процесс настройки. у большинства таких инструментов есть деплой через Docker в один клик

инфраструктура на клиента: $20–50/мес
твоя цена: $2,000–5,000/мес (зависит от ниши)

все в плюсе. клиент экономит. ты зарабатываешь. математика простая

4. упаковать в язык бизнеса

не «self-hosted инстанс Chatwoot в Docker»
а «ваша приватная платформа поддержки клиентов без платы за пользователя, с полным владением данными и кастомным брендингом»

бизнес покупает не технологию. он покупает результат. «больше никогда не платить за пользователей» продаётся быстрее любого списка фич

5. построить защиту через кастомизацию

open-source инструмент — база. твоя ценность:

- интеграции с их текущим стеком
- брендированный интерфейс под компанию
- поддержка и обновления
- приоритетная помощь от человека, который знает их конфигурацию

это то, что отделяет подписку на $2k/мес от разового деплоя за $500. инструмент бесплатный. оркестрация — продукт

6. находить клиентов там, где они уже жалуются

искать в X и Reddit: "[название инструмента] слишком дорого" или "[название инструмента] альтернатива". это уже прогретые лиды. они знают проблему и ищут решение

постить кейсы: «заменили Intercom за $14k/год self-hosted решением для команды из 12 человек. те же функции. данные теперь у них»

скриншоты экономии закрывают сделки лучше питч-деков

7. масштабирование через стек на клиента

клиент уже платит $3k/мес за CRM? предложить аналитику за +$1,500. потом email-маркетинг за +$1,000. в итоге ты становишься их всей софт-инфраструктурой за $5,500/мес, при этом они всё ещё дешевле старого SaaS-стека

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

часть, о которой почти не говорят:

эти бизнесы никогда сами не найдут эти GitHub-репозитории. они не будут поднимать Docker. они не будут заходить на сервер по SSH. они будут гуглить «недорогая CRM для небольшой команды» и попадут к тебе

open source — это новый опт. код бесплатный. маржа появляется на упаковке

один человек может вести 5–10 клиентов. команда из двух человек выходит на $30–50k/мес. без инвестиций. без офиса. без найма

кто-то в твоей нише это уже сделает. логично, чтобы это был ты

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣2410👍7
Для чего используется конструкция сопоставления с образцом в Python?

Если не использовал, вот пример:
10
За сколько бы купили подписку?

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
41😁9👍8
This media is not supported in your browser
VIEW IN TELEGRAM
При генерации 3D-моделей с помощью AI каждый компонент можно отдельно выделять, переименовывать, перемещать или менять ему материал — без необходимости заново генерировать всю модель.

Nova3D генерирует Python-скрипты для Blender на основе промптов, вместо прямого вывода объединённого mesh-файла. В сгенерированном GLB каждая часть имеет своё имя и иерархию, благодаря чему их можно редактировать по отдельности.

https://github.com/RareSense/Nova3D

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Как проверить наличие подклассов в Python

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
14
Please open Telegram to view this post
VIEW IN TELEGRAM
😁75👍7
Python-совет: как писать код с эффективным использованием памяти
Это проблемный код:

def generate_transactions_inefficient(df: pd.DataFrame):

transactions = []

for _, row in df.iterrows():
transactions.append({
'user_id': row['user_id'],
'amount': row['amount'],
'transaction_date': row['transaction_date'],
'status': row['status']
})

return transactions


Проблема в том, что такой подход сохраняет ВСЕ обработанные строки в памяти перед тем, как что-либо вернуть. Это как приготовить 10 000 блюд и хранить их все на кухне — место быстро закончится.

👉Лучший подход — использовать yield:
def generate_transactions_efficient(df: pd.DataFrame):

for _, row in df.iterrows():
yield {
'user_id': row['user_id'],
'amount': row['amount'],
'transaction_date': row['transaction_date'],
'status': row['status']
}


Вместо того чтобы собирать один большой список в памяти, эта функция выдаёт по одной транзакции за раз, только когда это нужно. Это как готовить блюда только по мере поступления заказов. Проблем с памятью здесь нет.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
20
Один соло-разработчик выиграл хакатон Anthropic, он за 8 часов собрал рабочий продукт с помощью Claude Code и забрал $15,000 призовых.

Затем выложил весь стек в опенсорс.

189,000 звёзд на GitHub. Полная конфигурация:

→ 38 специализированных агентов (planner, security reviewer, debugger, code reviewer)
→ 156 skills, подгружаемых по требованию (/plan, /tdd, /security-scan, /quality-gate)
→ 72 кастомные slash-команды
→ AgentShield: 1,282 security-теста по CLAUDE.md, MCP-конфигам, хукам и skills
→ 3 агента на Opus 4.6, запускающих red-team пайплайны (Attacker, Defender, Auditor)
→ слой непрерывного обучения
→ покрытие 12 языковых экосистем

Работает в Claude Code, Codex, Cursor, OpenCode, Gemini и тд

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
16🔥10👍5
Жизненный цикл любого проекта, где «надо было вчера».

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Почему "é" == "é" может возвращать False в Python

Вот один из типичных Unicode-подводных камней, который часто приводит к очень запутанным багам в Python:

Две строки могут выглядеть одинаково на экране, но при этом отличаться внутри:
import unicodedata

a = "é" # один кодпоинт: U+00E9
b = "e\u0301" # "e" + комбинирующий акцент (acute accent)

print(a)
print(b)

print(a == b)
# False

print(len(a))
# 1

print(len(b))
# 2


Внешне они одинаковые, но Python хранит их как разные последовательности Unicode-кодпоинтов.
Посмотреть, что реально внутри строки, можно через repr() и unicodedata.name():

import unicodedata

for char in "e\u0301":
print(repr(char), unicodedata.name(char))


Вывод:
'e' LATIN SMALL LETTER E
'́' COMBINING ACUTE ACCENT


Как правильно сравнивать такие строки?
Нужно нормализовать Unicode перед сравнением:
import unicodedata

a = "é"
b = "e\u0301"

a_normalized = unicodedata.normalize("NFC", a)
b_normalized = unicodedata.normalize("NFC", b)

print(a_normalized == b_normalized)
# True


NFC
приводит текст к “составной” форме, где комбинация "e" + accent превращается в один символ "é".

Такие различия часто появляются в:
- пользовательском вводе
- копипасте из разных источников
- именах файлов
- поиске и фильтрации текста
- данных из разных языков и систем

Ещё один похожий кейс — невидимые символы
Например, zero-width space может ломать сравнение вообще без визуальных признаков:
text = "hello\u200b"

print(text == "hello")
# False

print(text)
# hello

print(repr(text))
# 'hello\u200b'


print()
скрывает проблему, но repr() показывает реальное содержимое строки.

Подробнее можно почитать здесь:
https://pythonkoans.substack.com/p/koan-15-the-invisible-ink

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍136🔥2🤣1
Если ты работаешь с data пайплайнами, эти репозитории очень полезны:

ibis
Python API, который позволяет писать запросы один раз и запускать их на разных backend’ах для данных, таких как DuckDB, BigQuery и Snowflake.

pygwalker
Мгновенно превращает DataFrame в интерактивный UI для визуального исследования данных.

katana
Быстрый и масштабируемый веб-краулер, часто используется для security testing и крупномасштабного сбора/поиска данных.

#Data_Science

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6