【问题标题】:Python replace method with a decoratorPython 用装饰器替换方法
【发布时间】: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 放在引号中。

标签: python python-3.x python-2.7 decorator


【解决方案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。

【讨论】:

    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2020-01-11
    • 2010-10-13
    • 2012-02-09
    • 2018-07-14
    • 2014-01-14
    相关资源
    最近更新 更多