Python 用装饰器替换方法

Posted

技术标签:

【中文标题】Python 用装饰器替换方法【英文标题】:Python replace method with a decorator 【发布时间】:2021-11-20 22:24:38 【问题描述】:

我有一本 Python 字典 篮子=水果:'苹果',蔬菜:'羽衣甘蓝'

还有一个辅助函数,它在执行查询中看到水果和蔬菜的任何地方,都会分别用苹果和羽衣甘蓝替换它。

辅助功能:

      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)
   ......
   ......

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

【问题讨论】:

查询总是dict类型吗? 不,字典是有映射的篮子。查询是一个字符串。例如:select * from table where column1=fruit。 您没有将任何替换传递给replaceQuery()。如果你打算使用全局变量basket,它不应该是函数参数。 否则应该是query = replaceQuery(query, **basket) 当您执行此替换时,它不会在查询中将kale 放在引号中。 【参考方案1】:

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

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(),所以你可以在replace func中运行装饰函数(executeQuery)之前添加你想要执行的功能,然后调用executeQuery。

【讨论】:

以上是关于Python 用装饰器替换方法的主要内容,如果未能解决你的问题,请参考以下文章

python装饰器内获取函数有用信息方法

Python 函数装饰器和闭包

Python装饰器实现类Java注解功能

python装饰器

怎么在Python装饰器中自定义功能呢?用这种方法让你“为所欲为”

怎么在Python装饰器中自定义功能呢?用这种方法让你“为所欲为”