Программистика
Canal cerrado
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Mostrar más5 790
Suscriptores
-524 horas
+137 días
-4430 días
Archivo de publicaciones
5 790
🐱 Git + Python: как не убить проект за 5 коммитов
Работаешь с Python? Используешь Git? Думаешь, что знаешь, как это делать правильно? Скорее всего, ты уже сделал несколько критических ошибок, которые вернутся к тебе через месяц.
🧱 Типичные ошибки питонистов в Git
👍 Коммитят `.pyc` файлы и `__pycache__/`:
git add .
git commit -m "fixed bug"
Результат: репозиторий загажен скомпилированными файлами, которые меняются при каждом запуске.
👍 Забывают `.env` и токены утекают в публичный репо:
API_KEY = "sk-123456789abcdef"
DATABASE_URL = "postgresql://user:pass@localhost/db"
Запушил — всё, твой ключ в руках ботов через 5 минут.
👍 Коммиты без смысла: "fix", "update", "asdasd", "final final FINAL v3"
Через неделю ты сам не помнишь, что там было.
👍 Не используют ветки — весь код в main:
Один баг — весь проект сломан. Откатить? А как?
👍 Гигантские коммиты на 50+ файлов:
git add .
git commit -m "added everything"
Найти, где именно появился баг — удачи.
📌 Как делать правильно
1️⃣ Правильный `.gitignore` для Python
Создай .gitignore в корне проекта:
# Байт-код Python
__pycache__/
*.py[cod]
*$py.class
*.so
# Виртуальные окружения
venv/
env/
ENV/
.venv
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# Переменные окружения и секреты
.env
.env.local
*.pem
*.key
# Логи
*.log
# Тестовые данные
.pytest_cache/
.coverage
htmlcov/
# Зависимости
*.egg-info/
dist/
build/
# Jupyter
.ipynb_checkpoints/
# Базы данных
*.db
*.sqlite3
# OS
.DS_Store
Thumbs.db
📎 Не хочешь писать руками?
➡️Используй
2️⃣ Храни секреты в `.env`, а не в коде
Вместо этого:
API_KEY = "sk-123456789" # НИКОГДА ТАК!
Делай так:
import os
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("API_KEY")
Файл .env:
API_KEY=sk-123456789
DATABASE_URL=postgresql://user:pass@localhost/db
И ОБЯЗАТЕЛЬНО добавь .env в .gitignore!
3️⃣ Осмысленные коммиты
Плохо:
git commit -m "fix"
git commit -m "update"
git commit -m "aaaaa"
Хорошо:
git commit -m "fix: исправлена ошибка деления на ноль в calc.py"
git commit -m "feat: добавлена функция отправки email"
git commit -m "refactor: переписан парсер JSON для улучшения производительности"
Используй Conventional Commits:
- feat: — новая функция - fix: — исправление бага - refactor: — рефакторинг без изменения логики - docs: — изменение документации - test: — добавление тестов - chore: — рутинные задачи (обновление зависимостей и т.д.)4️⃣ Используй ветки Никогда не пиши в
main напрямую:
# Создаём ветку для новой фичи
git checkout -b feature/user-authentication
# Работаем, коммитим
git add auth.py
git commit -m "feat: добавлена аутентификация пользователей"
# Пушим ветку
git push -u origin feature/user-authentication
# Создаём Pull Request на GitHub
# Мержим только после ревью
5️⃣ Структура Python-проекта в Git
Правильная структура:
my-project/ ├── .git/ ├── .gitignore ├── .env.example # Шаблон для .env (БЕЗ реальных секретов) ├── README.md ├── requirements.txt # Зависимости ├── setup.py # Если пакет ├── src/ # Исходники │ ├── __init__.py │ ├── main.py │ └── utils.py ├── tests/ # Тесты │ ├── __init__.py │ └── test_main.py └── docs/ # Документация6️⃣ `requirements.txt` под контролем Фиксируй точные версии:
# Плохо (версии плавают)
requests
flask
# Хорошо (фиксированные версии)
pip freeze > requirements.txt
Результат requirements.txt:
requests==2.31.0 flask==3.0.0 python-dotenv==1.0.07️⃣ Pre-commit hooks — автоматизация проверок Установи
pre-commit:
pip install pre-commit
Создай .pre-commit-config.yaml:
repos:
- repo: https://github.com/psf/black
rev: 23.11.0
hooks:
- id: black
language_version: python3.11
- repo: https://github.com/pycqa/flake8
rev: 6.1.0
hooks:
- id: flake8
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
Активируй:
pre-commit install
Продолжение снизу⤵️
Программистика || #Статья5 790
30-летний я, который наконец-то нашёл работу джуном.
😎 Мой 19-летний тимлид узнаёт все мемы из канала «Программист». ⭐️
5 790
СИМВОЛ. Новогодние скидки до 12% в готовом квартале
Выбирайте квартиру с праздничной выгодой в квартале СИМВОЛ. Чтобы использовать все преимущества центра Москвы. И всюду успевать без спешки. И любоваться столицей из панорамных окон.
- Историчекий район Лефортово
- 2 км от Садового кольца
- Дома внутри ТТК
- 100+ открытых объектов инфраструктуры, в том числе Бауманский лицей
- В домах - фитнес, детские, переговорные, коворкинги
- Собственный парк "Зеленая река" площадью 10 га
- 3 станции метро в пешей доступности
Не пропустите новогодние скидки в готовом квартале. Спешите с покупкой, количество квартир ограничено!
Узнать больше
#реклама
simvol-kvartal.ru
О рекламодателе
5 790
🐈 Python для собеседования
Python востребован в разных отраслях. Это машинное обучение, искусственный интеллект, аналитика данных, создание программных продуктов и внутренних утилит. Очень часто Python идёт как дополнительный навык при требованиях в вакансии. Данный курс может дать быстрое представление о языке, что позволит проявить осведомлённость на собеседовании.
🌐 СсылкаПрограммистика || #Course
5 790
👩💻 bpytop — это современный инструмент мониторинга ресурсов, который работает на Linux, macOS и FreeBSD! Он отображает данные об использовании процессора, памяти, дисков, сети и запущенных процессов в удобном и визуально привлекательном интерфейсе. Написанный на Python, bpytop предлагает гибкие возможности настройки и легкость использования, включая полную поддержку управления с помощью мыши.🐱 Ссылка на GitHub Программистика || #Library
5 790
Кулинарные тренды начинаются здесь!
Food.ru — это медиа, где тренды в еде и стиле жизни создаете вы
Мы объединяем гурманов и тех, кто только начинает свой путь в кулинарии. Наша платформа поможет вам:
• Удивить близких вкусными блюдами
• Позаботиться о здоровье семьи
• Следить за КБЖУ легко и удобно
• Открывать новые рецепты каждый день
Присоединяйтесь к сообществу, где:
✨ Вы можете делиться своими кулинарными находками
✨ Находите единомышленников и друзей по вкусу
✨ Открываете новые идеи — от полезных рецептов до стильных решений для дома
Создавайте тренды вместе с Food.ru!❤️
Узнать больше
#реклама
food.ru
О рекламодателе
5 790
🔥 Логируй как профи: что не так с `print()` и как писать логи правильно
Логирование — это как чёрный ящик самолёта: пока всё работает, про него не думаешь. Но когда что-то ломается, без него — катастрофа.
И да,
print() — это не логирование, даже если вы очень его любите.
🧱 Почему не print()?
🟢 print() не умеет разделять уровни сообщений (ошибка или просто инфо) 🟢 Его нельзя легко перенаправить в файл или на удалённый сервер 🟢 В продакшене вы не сможете отследить проблему, если логи разбросаны по консоли📌 Базовое логирование
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Приложение запущено")
📎 basicConfig быстро включит логирование, но на продакшене лучше задавать формат и место хранения.
🎯 Уровни логов
🟢 DEBUG — детальная отладка 🟢INFO — обычная информация 🟢 WARNING — что-то подозрительное 🟢ERROR — ошибка, но система ещё жива 🟢CRITICAL — всё очень плохо📦 Логи в файл
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s — %(levelname)s — %(message)s'
)
Теперь логи сохраняются в app.log с временем и уровнем.
🔄 Ротация логов
Чтобы файл логов не вырос до гигабайтов:
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=2_000_000, backupCount=5)
logging.basicConfig(
handlers=[handler],
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
📎 При достижении 2MB файл заменяется, и хранится 5 последних копий.
🧪 Логируем ошибки с трассировкой
try:
1 / 0
except ZeroDivisionError:
logging.exception("Ошибка деления на ноль")
➡️logging.exception() автоматически добавляет traceback в лог.
💡 Запомни:
🟢 Не логируй пароли и токены 🟢 Разделяй уровни — не пиши error там, где warning 🟢 Настрой логи под продакшен заранее, а не когда уже горит🗣 Если хотите пост про цветные логи, логирование в JSON или интеграцию с Sentry — пишите темы, мы с радостью сделаем! Программистика || #Статья
5 790
То, что доктор прописал!
9 самых необходимых IT-каналов, которые должен читать каждый айтишник:
Доктор Python — коды, хаки и фичи.
Доктор Techlogy — свежие технологии и их применение.
Доктор Cyber — информационная безопасность без скуки.
Доктор GitHub — лучшие репозитории от врача.
Доктор IT — всё о цифровом мире и его инсайтах.
Доктор GameDev — рецепты создания игр и гайды.
Доктор GPT — лучшие промпты и сервисы ИИ.
Доктор Memes — смех лечит лучше любых апдейтов.
Доктор C++ — фичи, советы и код без боли.
Подпишись, чтобы стать профессором, а не пациентом.
5 790
Repost from N/a
ЧТО ЖЕ ДЕЛАТЬ НА PYTHON? Проекты на Python за 11 минут
🎥 ПервоисточникПрограммистика|| #video
5 790
🖥 Flask-Moment — расширение для Flask, которое интегрирует Moment.js для форматирования дат и времени в шаблонах Jinja2! С помощью этого инструмента можно легко отображать даты и время в удобном формате, включая поддержку локализации, временных зон и обновлений времени в реальном времени. Основное применение — улучшение отображения временных данных в веб-приложениях Flask. Flask-Moment позволяет использовать Moment.js прямо в шаблонах, избавляя разработчиков от необходимости самостоятельно писать сложный код JavaScript для обработки времени.🐱 Ссылка на GitHub Программистика || #Library
5 790
Telegram опубликовал список 8 самых быстрорастущих каналов для программистов:
Only Python — Подборки приёмов и фич, о которых не рассказывают в курсах.
Only Tech — Главные тренды и инсайды из мира технологий, маркетинга и интернет-культуры.
Only Hack — Реальные кейсы кибератак, инструменты и методы защиты, которые используют хакеры.
Only GitHub — Репозитории, которые решают реальные задачи.
Скрипты, фреймворки и готовые решения
Only IT — Без мнений и слухов — только факты и важные IT-события.
Only Apple — Новые апдейты, утечки и фишки, которые Apple ещё не показала.
Only GPT — Промпты, хаки и свежие инструменты, о которых молчат даже AI-каналы.
Only Memes — Если ты когда-нибудь деплоил в пятницу вечером — ты поймешь
Подписывайтесь и прокачивайте свои скиллы.
5 790
Тебе нужна автоматическая документация API в формате Swagger/OpenAPI. Что быстрее?
5 790
⚡️ DevOps теперь в Telegram!
Канал сеньора, где публикуются гигабайты материалов для DevOps-инженеров:
97 ГБ — Linux
48 ГБ — Docker
12 ГБ — Kubernetes
25 ГБ — Redis
81 ГБ — Git
19 ГБ — Jira
29 ГБ — Grafana
Присоединяйтесь: @devops_tg
5 790
👩💻FastAPI vs Flask: выбор без розовых очков
Flask был королём 10 лет. Простой, лёгкий, работает везде. Но потом пришла FastAPI и разломала всю игру. Теперь все спрашивают: "А может, мне FastAPI?" Давайте разберёмся без маркетинга.
🧱 Типичные заблуждения:
🟡 "Flask проще — беру его для быстрого проекта" На самом деле: Flask простой, но медленный. Для API это критично. Если нужна скорость — Flask не поможет. 🟡 "FastAPI слишком новый, нет боевых примеров" На самом деле: FastAPI используют Uber, Netflix, Microsoft. Это не хипстерская игрушка. 🟡 "Flask легче найти разработчиков" На самом деле: в 2025 году FastAPI знают даже новички. Спрос растёт. 🟡 "FastAPI только для асинхронности" На самом деле: FastAPI даёт type hints, валидацию, документацию — всё из коробки.📌 Сравнение по параметрам 1️⃣ Скорость — где разница? Flask (синхронный):
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
user = db.get_user(user_id) # блокирует поток
return jsonify(user)
➡️Если в БД 500ms — поток висит 500ms. На 100 одновременных запросов нужно 100 потоков. Это жрёт память и процессор.
FastAPI (асинхронный):
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
user = await db.get_user(user_id) # не блокирует поток
return user
На 100 одновременных запросов нужно 1-2 потока. Все ждут параллельно.
Результат: FastAPI на 5-10x быстрее на асинхронных операциях (БД, HTTP, файлы).
2️⃣ Type hints и валидация
Flask:
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
# Что тут? Кто знает
name = data.get('name') # может быть None
age = data.get('age') # может быть строка вместо числа
if not name or not isinstance(age, int):
return {'error': 'Invalid data'}, 400
user = db.create_user(name, age)
return jsonify(user)
FastAPI:
from pydantic import BaseModel
class UserCreate(BaseModel):
name: str
age: int
@app.post("/api/users")
async def create_user(user: UserCreate):
# Валидация уже произошла!
# Если age не int — FastAPI вернёт 422 автоматически
db_user = await db.create_user(user.name, user.age)
return db_user
➡️Результат: FastAPI проверяет типы и валидирует данные из коробки. Flask требует ручной проверки.
3️⃣ Документация
Flask:
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
"""Получить пользователя по ID"""
user = db.get_user(user_id)
return jsonify(user)
➡️Документация? Пиши сам. Swagger? Подключай flask-restx или flasgger — их код не совпадает с реальностью.
FastAPI:
@app.get("/api/users/{user_id}",
summary="Получить пользователя",
description="Возвращает пользователя по его ID",
responses={404: {"description": "Пользователь не найден"}})
async def get_user(user_id: int):
user = await db.get_user(user_id)
return user
➡️Открываешь /docs — там красивая интерактивная документация с примерами, которая автоматически генерируется из кода.
Результат: FastAPI = документация генерируется автоматически. Flask = лень писать.
4️⃣ Обработка ошибок
Flask:
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
try:
user = db.get_user(user_id)
if not user:
return {'error': 'Not found'}, 404
return jsonify(user)
except Exception as e:
logging.error(e)
return {'error': 'Server error'}, 500
Каждый эндпоинт — свой try/except. Кошмар.
FastAPI:
from fastapi import HTTPException
@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
user = await db.get_user(user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
# Глобальная обработка ошибок
@app.exception_handler(Exception)
async def global_exception_handler(request, exc):
logging.error(exc)
return JSONResponse(status_code=500, content={"detail": "Server error"})
Программистика || #Статья5 790
Repost from Технотренды
⚡️ Запускаем крупный розыгрыш призов, где можно выиграть iPhone 17, игровые наушники, клавиатуру и мышь!
Без лишних слов, условия:
1. Подписка на:
— бизнестрендс
— Технотренды
— Блумберг
2. Нажать кнопку «Участвовать» снизу
Итоги будут опубликованы 15 ноября в 18:00 на наших каналах, желаем удачи!
