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

如何为Python的executeQuery方法添加装饰器实现查询字符串自动替换

实现前的基础修正

你当前代码里有两个需要先修正的语法问题:

  • 定义字典时字符串类型的键需要加引号,否则会报NameError,正确写法为basket = {'fruit': 'apple', 'vegetable': 'kale'}
  • 原replaceQuery函数里的self参数冗余,你当前的调用逻辑没有用到类实例,不需要保留该参数

装饰器实现方案

按照你的需求,提供两种常用实现方式:

方式1:不带参数的装饰器(适合全局固定替换规则)

如果你的替换规则不需要频繁修改,可以直接把规则写在装饰器里,完全符合你预期的写法:

# 固定替换规则
BASKET = {'fruit': 'apple', 'vegetable': 'kale'}

def replaceQuery(func):
    def wrapper(Client, query, *args, **kwargs):
        # 自动执行query替换逻辑
        for key, value in BASKET.items():
            if key in query:
                query = query.replace(key, value)
        # 调用原executeQuery执行查询
        return func(Client, query, *args, **kwargs)
    return wrapper

# 直接加装饰器即可
@replaceQuery
def executeQuery(Client, query):
    result = Client.query(query)
    return result

方式2:带参数的装饰器(灵活支持不同替换规则)

如果需要给不同查询方法配置不同的替换规则,可以用带参数的装饰器,使用时传入指定的basket即可:

def replaceQuery(basket):
    def decorator(func):
        def wrapper(Client, query, *args, **kwargs):
            for key, value in basket.items():
                if key in query:
                    query = query.replace(key, value)
            return func(Client, query, *args, **kwargs)
        return wrapper
    return decorator

# 使用时传入自定义的basket规则
basket = {'fruit': 'apple', 'vegetable': 'kale'}
@replaceQuery(basket=basket)
def executeQuery(Client, query):
    result = Client.query(query)
    return result

两种方式完成后,都可以直接调用executeQuery,不需要提前手动处理query:

# 示例调用,query会自动完成替换
client = 你的数据库客户端实例
executeQuery(client, "select * from table where type = fruit")

实现建议

  • 替换逻辑建议加关键词边界判断,避免误伤:可以用正则替换re.sub(rf'\b{key}\b', value, query),避免出现类似fruitbasket被误替换成applebasket的问题
  • 可以给query加字符串类型校验,避免非字符串参数传入时报错
  • wrapper里保留*args, **kwargs可以兼容后续executeQuery新增参数,不需要修改装饰器代码
  • 如果需要动态更新替换规则,可以在带参数的装饰器版本里给wrapper新增修改basket的方法,不需要重新定义装饰器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:03