AI Notes
January 19
bot: Bot в каждой функции
Чтобы не передавать объект bot: Bot в каждую функцию, можно создать глобальную переменную и инициализировать её при запуске бота. Этот подход работает, но требует осторожности, так как глобальные переменные могут усложнить тестирование и отладку.
Решение с использованием глобальной переменной
1. Инициализация глобальной переменной bot на уровне файла functions.py:
from aiogram import Bot # Глобальная переменная для хранения экземпляра бота bot: Bot | None = None def set_bot_instance(bot_instance: Bot): """ Устанавливает глобальный экземпляр бота. """ global bot bot = bot_instance
2. Инициализация в основном файле bot.py:
При запуске бота установите экземпляр глобального объекта:
from aiogram import Bot from functions import set_bot_instance async def main(): bot = Bot(token=TOKEN) set_bot_instance(bot) # Передаём экземпляр бота в functions.py ...
3. Использование глобального bot в functions.py:
Теперь во всех функциях внутри functions.py вы можете обращаться к глобальной переменной bot напрямую:
from aiogram import types from . import bot # Импорт глобальной переменной bot async def send_message_to_user(chat_id: int, text: str): """ Отправляет сообщение пользователю. """ if bot is None: raise RuntimeError("Bot instance is not initialized!") await bot.send_message(chat_id=chat_id, text=text)
Плюсы подхода:
Минусы подхода:
Альтернативный подход: Контекст
Если глобальные переменные кажутся неудобными, можно использовать контекст для хранения bot:
from contextvars import ContextVar from aiogram import Bot bot_context: ContextVar[Bot] = ContextVar("bot") def set_bot_instance(bot_instance: Bot): bot_context.set(bot_instance) def get_bot_instance() -> Bot: return bot_context.get()
async def send_message_to_user(chat_id: int, text: str): bot = get_bot_instance() await bot.send_message(chat_id=chat_id, text=text)