Kodduu Python
1.08K subscribers
309 photos
28 videos
185 links
Научись программировать на Python на интересных примерах

Самый быстрый курс https://stepik.org/a/187914
Самый нескучный курс https://stepik.org/a/185238

Во вопросам сотрудничества: @AlexErf
Download Telegram
⚡️ Кеширование HTTP-запросов с автоочисткой и TTL


import requests, time
from functools import lru_cache

@lru_cache(maxsize=128)
def _cached_get(url, ttl):
t = time.time()
r = requests.get(url, timeout=5)
return {"data": r.json(), "t": t}

def get_with_cache(url, ttl=60):
r = _cached_get(url, ttl)
if time.time() - r["t"] > ttl:
_cached_get.cache_clear()
return get_with_cache(url, ttl)
return r["data"]


📌 Простая обёртка для запросов, которая:

* кеширует ответы на ttl секунд,
* автоматически сбрасывает устаревшие данные,
* уменьшает нагрузку на API и ускоряет ответы.

🛠 pip install requests

Подпишись 👉🏻 @KodduuPython 🤖
Общая стоимость курсов в программе Junior Python Developer и Data Scientist +интервью тесты более 16 000 рублей 💰

До 31 октября всего 3450 рублей 🔥🔥🔥

Подпишись 👉🏻 @KodduuPython 🤖
🧩 Безопасное шифрование конфигураций (.env → .env.enc)


from cryptography.fernet import Fernet
import os

def encrypt_env(src=".env", dst=".env.enc", key_file="key.txt"):
key = Fernet.generate_key()
with open(key_file, "wb") as f: f.write(key)
fernet = Fernet(key)
with open(src, "rb") as f: data = f.read()
with open(dst, "wb") as f: f.write(fernet.encrypt(data))

def decrypt_env(dst=".env", src=".env.enc", key_file="key.txt"):
key = open(key_file,"rb").read()
fernet = Fernet(key)
with open(src,"rb") as f: data=f.read()
with open(dst,"wb") as f: f.write(fernet.decrypt(data))


📌 Храни конфиги и API-ключи безопасно:
encrypt_env() — зашифровывает .env,
decrypt_env() — расшифровывает перед запуском.
Ключ лежит отдельно и не коммитится в git.

🛠 pip install cryptography

Подпишись 👉🏻 @KodduuPython 🤖
👍1
📦 Автоматическое сжатие и архивирование логов


import gzip, shutil, os, glob, datetime

def rotate_logs(path="logs/*.log", keep_days=7):
now = datetime.datetime.now()
for file in glob.glob(path):
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(file))
if (now - mtime).days > 0:
gz = f"{file}.{mtime:%Y%m%d}.gz"
with open(file, "rb") as f_in, gzip.open(gz, "wb") as f_out:
shutil.copyfileobj(f_in, f_out)
open(file, "w").close() # truncate log
for gz in glob.glob("logs/*.gz"):
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(gz))
if (now - mtime).days > keep_days:
os.remove(gz)


📌 Автоматическая ротация логов:

* старые .log → архивируются в .gz;
* старше keep_days удаляются;
* экономит место и сохраняет историю.

🛠 всё на стандартной библиотеке — ничего ставить не нужно

Подпишись 👉🏻 @KodduuPython 🤖
👍31
Forwarded from AIGENTTO
Почему n8n вам не подойдет?

n8n или Нэйтон и прочие low-code/no-code фреймворки хороши в теории, но когда дело доходит до практики, нужно начинать писать свой код и вставлять его в блоки workflow no-code тулов. Например, чтобы сделать это в Yandex Workflow, у Yandex-разработчика ушло 2 дня 😀 Это не шутка — это правда.

Потом понимаешь, что UI/UX таких тулов очень убогий, а за то время, пока ты выясняешь, почему оно не работает, уже можно было написать много кода (тем более сейчас, когда есть LLM IDE).

И самое главное — все хотят кастомных штук: одному нужны стриминг, другому — чтобы внутри бота был task manager для support, третьему — особая красивая кодировка букв. Всё это нельзя сделать в любых no-code/low-code тулах без кода.

Мне кажется, эра no-code тулов, начавшаяся ещё в 00-х и так и не снискавшая успеха, скоро окончательно закончится, потому что писать код благодаря LLM стало просто и дешево. Но всякие консультанты упорно продают no-code: "зачем вам разработчики, сделай всё сам перетаскиванием кубиков" 😀

Подпишись 👉🏻 @aigentto 🤖
👉 4 курса 207 уроков 504 теста и 171 задача 🔥

Именно такой объем в программе Junior Python Developer и Data Scientist +интервью тесты 👈👈👈

Все это со скидкой 50% до конца октября 👏

Подпишись 👉🏻 @KodduuPython 🤖
🔐 Безопасное хранение токенов в системном keyring


import keyring, os

def save_token(service, token):
user = os.getlogin()
keyring.set_password(service, user, token)

def get_token(service):
user = os.getlogin()
return keyring.get_password(service, user)

def delete_token(service):
user = os.getlogin()
keyring.delete_password(service, user)


📌 Мини-хранилище API-токенов в системном keychain
(использует встроенную безопасную ОС-хранилку — macOS Keychain, Windows Credential Manager, Linux Secret Service).

🛠 pip install keyring

Подпишись 👉🏻 @KodduuPython 🤖
🔍 Улучшаем код с помощью списковых включений


def transform_data(data):
try:
# Пример спискового включения для преобразования
transformed =
return transformed
except Exception as e:
print(f"Ошибка при преобразовании данных: {e}")
return []

# Пример использования
raw_data = [" Apple ", " Banana", "Cherry ", 42, None]
cleaned_data = transform_data(raw_data)
print(cleaned_data) # Вывод: ['apple', 'banana', 'cherry']


📌 Этот код демонстрирует использование списковых включений для очистки и преобразования списка строк. Он удаляет пробелы и
переводит строки в нижний регистр, игнорируя нестроковые элементы. Это полезно для обработки данных, таких как очистка
пользовательского ввода или подготовки текстовых данных для анализа.

Подпишись 👉🏻 @KodduuPython 🤖
2
⚡️ Эффективная обработка данных с помощью генераторов Python


def read_large_file(file_path: str):
"""Генератор для построчного чтения большого файла."""
try:
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
yield line.strip()
except FileNotFoundError:
print(f"Файл {file_path} не найден.")
except IOError as e:
print(f"Ошибка при чтении файла: {e}")

# Пример использования
if __name__ == "__main__":
file_path = "large_data.txt"
for line in read_large_file(file_path):
print(line) # Обработка строки



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

Подпишись 👉🏻 @KodduuPython 🤖
Самый полная вечно зеленая программа по Python 🍏🍏🍏 со скидкой 💰💵💸

Подпишись 👉🏻 @KodduuPython 🤖
🌐 Обработка нескольких запросов одновременно с asyncio


import asyncio
import aiohttp
from typing import List

async def fetch_url(session: aiohttp.ClientSession, url: str) -> str:
"""Fetch the content of a URL asynchronously and handle potential errors."""
try:
async with session.get(url) as response:
response.raise_for_status() # Ensure the request was successful
return await response.text() # Return the text content of the response
except aiohttp.ClientError as e:
return f"Request to {url} failed: {str(e)}" # Return error message if request fails

async def fetch_all(urls: List) -> List:
"""Fetch multiple URLs concurrently and return their content."""
async with aiohttp.ClientSession() as session:
tasks = # Create tasks for each URL
return await asyncio.gather(*tasks) # Gather results from all tasks

# Пример использования
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2",
"https://jsonplaceholder.typicode.com/posts/3"
]

# Запуск асинхронной задачи
result = asyncio.run(fetch_all(urls)) # Use asyncio.run to execute the main coroutine
for content in result:
print(content) # Print each result from the fetched URLs


📌 Этот код демонстрирует, как использовать библиотеку asyncio и aiohttp для одновременной обработки нескольких HTTP-запросов.
Вместо последовательного выполнения запросов, что может занять много времени, мы отправляем их параллельно, что значительно
ускоряет выполнение программы. Этот подход полезен при работе с множеством API или веб-ресурсов, когда нужно быстро получить
данные.

🛠 Установка aiohttp: pip install aiohttp

Подпишись 👉🏻 @KodduuPython 🤖
2
🌐 Простой веб-скрапер на Python


import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

def fetch_html(url: str) -> str:
"""Получает HTML-код страницы по указанному URL."""
try:
response = requests.get(url)
response.raise_for_status()
return response.text
except RequestException as e:
print(f"Ошибка при запросе {url}: {e}")
return ""

def parse_article_titles(html: str) -> list:
"""Парсит HTML и извлекает заголовки статей."""
soup = BeautifulSoup(html, 'html.parser')
return

def main():
"""Основная функция для запуска скрапера."""
url = "https://example.com/news"
html = fetch_html(url)
if html:
titles = parse_article_titles(html)
for idx, title in enumerate(titles, start=1):
print(f"{idx}. {title}")

if __name__ == "__main__":
main()


📌 Этот код представляет собой простой веб-скрапер, который извлекает заголовки статей с указанного веб-сайта. Он делает
HTTP-запрос, получает HTML-код страницы и использует BeautifulSoup для парсинга и извлечения заголовков. Такой скрапер полезен для
сбора данных с новостных сайтов или блогов.

🛠 Установка библиотек: pip install requests beautifulsoup4

Подпишись 👉🏻 @KodduuPython 🤖
Дикая скидка на максимальную программу обучения FullStack Developer and Data Scientist (Python+JS+Data+CookBook) до 31 октября 🔥🔥🔥

Подпишись 👉🏻 @KodduuPython 🤖
🔧 Создание простого REST API с Flask: от нуля до деплоя 🚀


from flask import Flask, jsonify, request, abort

app = Flask(__name__)

# Пример данных
tasks = [
{'id': 1, 'title': 'Сделать стирку', 'done': False},
{'id': 2, 'title': 'Изучить Flask', 'done': False}
]

@app.route('/api/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})

@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = next((task for task in tasks if task['id'] == task_id), None)
if task is None:
abort(404)
return jsonify({'task': task})

@app.route('/api/tasks', methods=['POST'])
def create_task():
if not request.json or 'title' not in request.json:
abort(400)
new_task = {
'id': tasks[-1]['id'] + 1 if tasks else 1,
'title': request.json['title'],
'done': False
}
tasks.append(new_task)
return jsonify({'task': new_task}), 201

@app.route('/api/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
task = next((task for task in tasks if task['id'] == task_id), None)
if task is None:
abort(404)
if not request.json:
abort(400)
task['title'] = request.json.get('title', task['title'])
task['done'] = request.json.get('done', task['done'])
return jsonify({'task': task})

@app.route('/api/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
task = next((task for task in tasks if task['id'] == task_id), None)
if task is None:
abort(404)
tasks.remove(task)
return jsonify({'result': True})

if __name__ == '__main__':
app.run(debug=True)


📌 Этот код демонстрирует создание простого REST API с Flask, который управляет списком задач. API поддерживает операции CRUD:
получение, добавление, обновление и удаление задач. Такой API может быть полезен для приложений по управлению задачами или в
качестве учебного проекта для изучения разработки веб-сервисов.

🛠 Установка библиотек: pip install Flask

🔒 Совет по безопасности: Рассмотрите добавление аутентификации и авторизации для защиты API. Используйте инструменты, такие
как Postman, для тестирования API.

Подпишись 👉🏻 @KodduuPython 🤖
Наши полезные opensource тулы для создания RAG систем и ИИ-агентов:

ChunkTester - подбирает оптимальные чанки под документы и вопросы, и формирует авто-пул тестовых вопросов.

Clusteroid - находит кластера в ваших документах.

Больше по теме в канале @aigentto 🔥

Подпишись 👉🏻 @KodduuPython 🤖