有条件地修饰函数是可能的吗?例如,我想用一个定时器函数(timeit
)修饰函数foo()
,但是只有当doing_performance_analysis
的条件是True
时,如下所示:
if doing_performance_analysis:
@timeit
def foo():
"""
Do something, e.g. sleep, and let timeit
return the time it takes
"""
time.sleep(2)
else:
def foo():
time.sleep(2)
7条答案
按热度按时间polkgigr1#
装饰器只是返回替换的可调用对象,可选的是相同的函数, Package 器,或者完全不同的东西。因此,你可以创建一个条件装饰器:
现在,您可以按如下方式使用它:
装饰器也可以是一个类:
在这里,
__call__
方法扮演的角色与第一个示例中返回的decorator()
嵌套函数相同,并且这里封闭的dec
和condition
参数作为实参存储在示例上,直到应用装饰器为止。wlzqhblo2#
装饰器只是一个应用到另一个函数的函数。你可以手动地应用它:
atmip9wb3#
不如这样:
我想您甚至可以将其 Package 到一个装饰器中,该装饰器将接受一个布尔标记和另一个装饰器,并且仅在标记设置为
True
时才应用后者:bz4sfanl4#
lzfw57am5#
如果你想在每次调用函数的时候都做检查,blckknight的答案很好。但是如果你有一个设置,你可以读取一次,永远不会改变,你可能不想检查设置每次装饰函数被调用。在我们工作的一些高性能守护进程中,我编写了一个装饰器,它在第一次加载python文件时检查一次设置文件,并决定是否应该 Package 它或不是。
以下是一个示例
假设log_function_call记录了对数据库、日志文件或其他内容的调用,并且config.get('RUN_TIMED_FUNCTIONS')检查全局配置,然后将@timed装饰器添加到函数中,将在加载时检查一次,以查看您是否在此服务器、环境如果没有,那么它不会改变生产环境或其他您关心性能的环境中函数的执行。
6rqinv9w6#
以下是对我起作用的方法:
euoag5mw7#
有点晚了,但是这篇文章对我很有帮助,我想添加一些我觉得有用的东西。我想做一个条件装饰器,装饰器接受一些参数。你可以用partial很干净地完成这个。
这允许您部分地应用装饰器所接受的参数,并且仍然使其有条件地应用。
以下面的例子为例,我们有一个装饰器,它将
n
添加到某个函数的结果中:我们可以使用修改后的条件装饰器来添加
n
参数。它打印
5
。