Python 用装饰器替换方法

Python replace method with a decorator

我有一本 Python 字典 篮子={水果:'apple',蔬菜:'kale'}

和一个辅助函数,无论它在执行查询中看到单词 fruits 和 vegetables 的什么地方,它都会分别用 apple 和 kale 替换它。

辅助函数:

      def replaceQuery(self,query,**basket):


            for key , value in basket.items():

                if key in query:
                    query=query.replace(key,value)

            return query

接下来,我将使用从此方法返回的查询并传递给执行方法

      query =replaceQuery(query,basket)
      
      executeQuery(Client, query)

执行方法如下:

     def executeQuery(Client,query):

        result=Client.query(query)

我一直在学习装饰器,想知道我是否可以在 executeQuery() 上添加一个装饰器 方法,这样每次它被调用时,它都会首先替换查询字符串以替换所有水果和蔬菜值。类似于此

@replaceQuery
def executeQuery(Client,query)
   ......
   ......

任何有关向此过程添加装饰器的帮助或建议都会有所帮助

您可以使用装饰器实现相同的功能, 如下例所示

def replaceQuery(decorated):
    @wraps(decorated)
    def replace(Client, query, basket):
        # code to run before the decorated func
        for key , value in basket.items():
            if key in query:
                query=query.replace(key,value)

        # running the decorated func
        return decorated(Client, query, basket)
    return replace

@replaceQuery
def executeQuery(Client, query, basket):
    ......
    ......

在 Python 中,函数就像任何其他对象一样, 通过将 @replaceQuery 装饰器添加到 executeQuery 函数,您实际上使用 executeQuery replaceQuery(executeQuery) 调用 replaceQuery,因此装饰对象指的是 executeQuery 函数。 当运行 executeQuery() replace() 会被调用,所以你可以在运行装饰函数(executeQuery)之前添加你想要执行的功能在replace func中,然后再调用executeQuery。