Aiogram 3.1.1创建KeyboardButton时报TypeError错误求助(与Pydantic 2.x兼容问题)
兄弟我太懂你这种升级后代码突然全崩的崩溃感了!你遇到的这个TypeError其实是两个问题叠加导致的:一是Aiogram 3.1.1和Pydantic 2.x的适配还存在小bug,二是你创建键盘的写法在Aiogram 3.x里已经不推荐(甚至会触发验证冲突)。咱们直接上解决方案:
问题根源
Aiogram 3.x把所有核心类型都改成了基于Pydantic BaseModel实现,而3.1.1版本对Pydantic 2.x的兼容还没完全打磨好,你之前那种链式换行调用add()的写法,会触发Pydantic的模型验证逻辑异常,就出现了那个诡异的__pydantic_extra__错误。
正确的键盘创建方式(两种可选)
方式1:构造器直接传入布局(新版推荐)
把按钮按行分组,直接在ReplyKeyboardMarkup的构造参数里定义键盘布局,这种写法最稳妥,不会触发验证问题:
from aiogram.types import KeyboardButton, ReplyKeyboardMarkup # 先定义单个按钮 view_profile = KeyboardButton(text='My profile 亮') delete_account = KeyboardButton(text='Delete account ') send_help = KeyboardButton(text='Help 勞') show_cards = KeyboardButton(text='Cards ') # 按行组织按钮,每行是一个列表 main_menu = ReplyKeyboardMarkup( keyboard=[ [view_profile, delete_account], # 第一行显示两个按钮 [show_cards, send_help] # 第二行显示两个按钮 ], resize_keyboard=True )
方式2:用row()方法链式构建
如果你习惯链式调用,换成row()方法来分组按钮,而不是直接用add()(add()在新版里是追加单个按钮到最后一行,容易布局混乱):
from aiogram.types import KeyboardButton, ReplyKeyboardMarkup view_profile = KeyboardButton(text='My profile 亮') delete_account = KeyboardButton(text='Delete account ') send_help = KeyboardButton(text='Help 勞') show_cards = KeyboardButton(text='Cards ') main_menu = ReplyKeyboardMarkup(resize_keyboard=True) main_menu.row(view_profile, delete_account) # 一行放两个按钮 main_menu.row(show_cards, send_help)
额外建议
如果之后还遇到其他Pydantic相关的兼容问题,建议把Aiogram升级到3.2.0及以上版本——官方在这个版本之后完善了对Pydantic 2.x的支持,能少踩很多坑。当然,你要是实在不想升级,上面的两种写法也能解决当前的键盘创建错误。
最后再确认下导入路径,Aiogram 3.x里KeyboardButton和ReplyKeyboardMarkup都在aiogram.types下面,不要从旧的aiogram.keyboard之类的路径导入,避免额外的冲突。
备注:内容来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

