如何定义可多场景复用的通用函数,支持传入不同数量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
相关产品推荐
相关产品推荐

