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_instance2. Инициализация в основном файле 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)