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 用装饰器替换方法的主要内容,如果未能解决你的问题,请参考以下文章