You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aiogram 3.1.1创建KeyboardButton时报TypeError错误求助(与Pydantic 2.x兼容问题)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:02:58