代码之家  ›  专栏  ›  技术社区  ›  Ani

TypeError:“BaseModel”对象的描述符“__pydantic_extra__”不适用于“KeyboardButton”对象

  •  0
  • Ani  · 技术社区  · 2 年前
    aiogram==3.1.1
    pydantic==2.3.0
    pydantic_core==2.6.3
    

    我已经将aiogram更新到了一个新版本,并希望魔法独角兽能让我的代码充满乐趣。然而,现在,由于与pydantic的冲突,过去正常工作的所有软件都无法工作(是的,我已经卸载了所有与aiogram相关的软件包,包括pydantic,这样它就可以自己下载兼容的版本)。我也处理过从aiogram其他地方进口的产品,所以现在一切都应该很好。

    我无法运行所有内容,但我怀疑这部分代码可能包含错误或我自己的错误:

    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).add(view_profile,
                                                              delete_account,
                                                              show_cards,
                                                              send_help)
    

    它会导致以下情况:

    File ~/bots/***/venv/lib/python3.10/site-packages/pydantic/main.py:165 in __init__
        __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__)
    
    TypeError: descriptor '__pydantic_extra__' for 'BaseModel' objects doesn't apply to a 'KeyboardButton' object
    

    在仔细检查了文档后,我感到困惑和愤怒,因为我没有发现相关的更新。也许我注意力不集中?有人能告诉我如何正确地为中的键盘分配键吗 aiogram==3.1.1 ?这是一个bug还是可以处理?我不想降级,尽管无论我做什么,收到的错误信息越多,我就越能接受这个想法。

    1 回复  |  直到 2 年前
        1
  •  0
  •   w0rraps    2 年前

    不知道你是怎么犯这个错误的 (我无法复制) ,但可以肯定的是,您使用的是旧结构。

    很快,对于ReplyKeyboardMarkup,您应该使用以下结构:

    main_menu = ReplyKeyboardMarkup(keyboard=[[
                KeyboardButton(text="My profile 🥷"), KeyboardButton(text="Delete account 🗑" . . .)
                ]]) 
    
    await message.answer("Hello.", reply_markup=main_menu)
    

    对于ReplyKeyboardBuilder来说:

    view_profile = KeyboardButton(text='My profile 🥷')
    delete_account = KeyboardButton(text='Delete account 🗑')
    send_help = KeyboardButton(text='Help 🤯')
    show_cards = KeyboardButton(text='Cards 🃏')
    main_menu = ReplyKeyboardBuilder().add(view_profile, delete_account, show_cards, send_help)
    
    await message.answer("Hello.", reply_markup=main_menu.as_markup())
    

    当然,您可以使用循环和其他工具使其更加紧凑和美观。 ReplyKeyboardMarkup: https://docs.aiogram.dev/en/latest/api/types/reply_keyboard_markup.html
    ReplyKeyboardBuilder+更多内容: https://docs.aiogram.dev/en/latest/utils/keyboard.html

        2
  •  0
  •   Ani    2 年前

    因此,问题在于旧代码与aiogram类型的新pydantic模型不兼容。问题中给出的代码的正确表达方式是@w0raps所写的。

    对于那些从v2转移到v3的人来说,另一个有用的来源是 this official documentation part ,因为标记并不是它影响的唯一球体。不过,有许多新的令人愉快的功能。

    推荐文章