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

如何定义可多场景复用的通用函数,支持传入不同数量key和cd参数

实现方案

你可以通过传入可变长度的按钮配置参数,无需提前固定key和cd的数量,就能实现多场景复用的通用函数,下面给出两种常用实现方式:


方案1:传入键值对元组列表(推荐,可读性高、不易出错)

直接把所有按钮的(按钮文本key, 回调参数cd)打包成列表传入,内部循环生成按钮即可:

def get_keyboard(button_configs: list[tuple[str, str]], row_width: int = 3):
    # 循环生成所有按钮
    buttons = []
    for key, cd in button_configs:
        cb_data = menu_cb.new(subsection=cd)
        buttons.append(types.InlineKeyboardButton(key, callback_data=cb_data))
    # 生成键盘返回
    return types.InlineKeyboardMarkup(row_width=row_width).row(*buttons)

调用示例:

# 3个按钮的场景
keyboard1 = get_keyboard([
    ("按钮1", "cd1"),
    ("按钮2", "cd2"),
    ("按钮3", "cd3")
])

# 2个按钮的场景
keyboard2 = get_keyboard([
    ("确认", "confirm"),
    ("取消", "cancel")
], row_width=2)

方案2:成对传入位置参数

如果你更习惯get_keyboard(key1, cd1, key2, cd2...)的调用方式,可以用*args接收任意长度的位置参数,内部两两分组即可:

def get_keyboard(*args, row_width: int = 3):
    # 校验传入的参数数量是偶数
    if len(args) % 2 != 0:
        raise ValueError("key和cd必须成对传入")
    # 两两分组生成按钮
    buttons = []
    for i in range(0, len(args), 2):
        key = args[i]
        cd = args[i+1]
        cb_data = menu_cb.new(subsection=cd)
        buttons.append(types.InlineKeyboardButton(key, callback_data=cb_data))
    return types.InlineKeyboardMarkup(row_width=row_width).row(*buttons)

调用示例:

# 3个按钮场景
keyboard1 = get_keyboard("按钮1", "cd1", "按钮2", "cd2", "按钮3", "cd3")
# 1个按钮场景
keyboard2 = get_keyboard("确认", "confirm", row_width=1)

原有参考代码的问题说明

你提供的参考代码里有两处笔误需要修正:

  • 按钮的callback_data参数值拼写错误,cb_dat1应该是cb_data1,cb_dat2、cb_dat3同理
  • 链式调用换行需要包裹在括号内,否则会报语法错误

内容的提问来源于stack exchange,提问作者Fantarics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:18:02