如何为自定义信息查询功能创建独立类以优化Python代码
实现方法
步骤1:新建独立文件存放封装类
创建名为order_extractor.py的单独文件,放入以下代码:
import re class OrderInfoExtractor: def __init__(self, db): # 初始化时传入全局数据库实例,降低耦合度 self.db = db def parse(self, message_text: str) -> tuple[int, int]: """ 输入消息文本,返回 (订单ID, 用户Telegram ID) """ # 提取订单ID order_id_part = message_text.split('\n')[0].split("№ ")[1] order_id = int(re.search(r'\d+', order_id_part).group(0)) # 关联查询用户ID cl_id_part = str(self.db.get_user_id_admin(order_id)) cl_id = int(re.search(r'\d+', cl_id_part).group(0)) user_id_part = str(self.db.get_user_telegram_id_admin(cl_id)) user_tg_id = int(re.search(r'\d+', user_id_part).group(0)) return order_id, user_tg_id
步骤2:在原有业务代码中调用
首先在你原来的代码文件头部导入类:
from order_extractor import OrderInfoExtractor
在项目初始化阶段(和数据库实例初始化同位置)创建提取器全局实例,不用每次请求都重复创建:
# 项目启动时执行一次即可 order_extractor = OrderInfoExtractor(db=db)
修改原有回调函数,替换掉#----之间的代码:
@dp.callback_query_handler(text="accept_ord", state=None) async def process_order_callback_4(query: types.CallbackQuery): answ_date_2 = query.data # 替换原有逻辑,仅需一行调用 id_1, user_id_clear = order_extractor.parse(str(query.message.text)) await bot.send_message(user_id_clear, text=f'The status of the order has been change №{id_1} изменен!\n\nPlease check main menu (/start)') if answ_date_2 == "accept_ord": status = 2 db.set_new_status(id_1, status) # 顺便修正原代码拼写错误:assepted → accepted await bot.send_message(query.from_user.id, text=f'The order №{id_1} has been accepted.', reply_markup=nav.back_admin_menu_order)
额外优化建议
- 后续其他业务场景需要提取订单和用户ID时,直接调用
order_extractor.parse方法即可,无需重复写逻辑 - 如果后续订单号的匹配规则、数据库查询逻辑变动,仅需要修改
OrderInfoExtractor类内部的代码,不需要改动所有业务层代码 - 可根据需求在
parse方法内添加异常捕获逻辑,比如消息文本无匹配订单号、数据库无对应数据时返回指定错误,方便排查问题
内容的提问来源于stack exchange,提问作者Ivan W
相关产品推荐
相关产品推荐

