如何将FSM Context传入函数?aiogram参数缺失报错排查
问题
使用aiogram 3.x开发Telegram机器人时,在处理/start命令和start回调的start函数中添加FSMContext作为第二个参数,运行时触发TypeError: start() missing 1 required positional argument: 'State'报错。
代码示例
Utilities.py
import aiogram import aiogram.filters import aiogram.types import aiogram.fsm.context import aiogram.fsm.state from aiogram.fsm.storage.redis import RedisStorage import redis.asyncio as redis with open("Telegram/Configs.json", "r") as File: TelegramConfigs: dict[str, typing.Any] = json.load(File)
Main文件
import Telegram.Utilities as Utilities Dispatcher=Utilities.aiogram.Dispatcher( storage=Utilities.RedisStorage( Utilities.redis.Redis( host="127.0.0.1", port="6379", ) ) ) Router=Utilities.aiogram.Router(name = "Main") @Router.message(Utilities.aiogram.filters.CommandStart()) @Router.callback_query(Utilities.aiogram.F.data == "start") async def start(MessageOrCallback: Utilities.aiogram.types.Message | Utilities.aiogram.types.CallbackQuery, State: Utilities.aiogram.fsm.context.FSMContext): print("/Started") Dispatcher.include_router(Router)
解决方案
核心问题
报错源于依赖注入的类型标注不规范,aiogram 3.x的依赖注入系统需要明确的类型标识来自动注入FSMContext,间接引用的类型路径可能无法被正确识别,同时参数名的写法也不符合框架惯例。
修复步骤
修正类型标注与参数名
直接导入FSMContext类,避免间接引用,同时使用框架惯例的小写参数名state:
在Main文件开头添加导入:from aiogram.fsm.context import FSMContext修改
start函数定义:async def start(MessageOrCallback: Utilities.aiogram.types.Message | Utilities.aiogram.types.CallbackQuery, state: FSMContext): print("/Started")修正回调查询过滤器
原代码中Utilities.aiogram.F.data == "start"的写法有误,替换为正确的回调过滤器:@Router.callback_query(Utilities.aiogram.filters.CallbackQueryFilter(data="start"))或者更简洁的lambda写法:
@Router.callback_query(lambda c: c.data == "start")
额外说明
如果坚持使用Utilities模块的间接引用,需确保Utilities.aiogram.fsm.context.FSMContext确实指向FSMContext类,但直接导入的方式更可靠,能避免路径解析错误。
内容的提问来源于stack exchange,提问作者yungmaz13
相关产品推荐
相关产品推荐

