如何在 Python 中制作一个可选的装饰器
How to make an optional decorator in Python
我有一组 python 脚本,我想使用 kernprof https://github.com/rkern/line_profiler 进行概要分析,但我也希望能够 运行 在没有 kernprof 的情况下正常执行。
在没有 kernprof 的情况下,在执行期间忽略未定义的 @profile 的优雅方法是什么?或任何其他装饰器。
示例代码:
@profile
def hello():
print('Testing')
hello()
运行:
kernprof -l test.py
在@profile 方法上正确执行探查器
运行:
python test.py
Returns一个错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
@profile
NameError: name 'profile' is not defined
希望避免在任何地方捕获此错误,因为我希望代码在不使用 kernprof 调用时就好像 @profile 是空操作一样执行。
谢谢!
-劳拉
编辑:我最终将 cProfile 与 kcachegrind 一起使用并完全避免了装饰器。
Using cProfile results with KCacheGrind
python -m cProfile -o profile_data.pyprof run_cli.py
pyprof2calltree -i profile_data.pyprof && qcachegrind profile_data.pyprof.log
如果不从 kernprof 执行,则定义一个空操作装饰器:
if 'profile' not in globals():
def profile(func):
return func
Daniel 提出的方法的一种变体是使用以下一行代码,然后根据您是否需要进行分析来对其进行注释:
# Optional no-op decorator, comment when you want to profile
def profile(func): return func
我有一组 python 脚本,我想使用 kernprof https://github.com/rkern/line_profiler 进行概要分析,但我也希望能够 运行 在没有 kernprof 的情况下正常执行。
在没有 kernprof 的情况下,在执行期间忽略未定义的 @profile 的优雅方法是什么?或任何其他装饰器。
示例代码:
@profile
def hello():
print('Testing')
hello()
运行:
kernprof -l test.py
在@profile 方法上正确执行探查器
运行:
python test.py
Returns一个错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
@profile
NameError: name 'profile' is not defined
希望避免在任何地方捕获此错误,因为我希望代码在不使用 kernprof 调用时就好像 @profile 是空操作一样执行。
谢谢! -劳拉
编辑:我最终将 cProfile 与 kcachegrind 一起使用并完全避免了装饰器。
Using cProfile results with KCacheGrind
python -m cProfile -o profile_data.pyprof run_cli.py
pyprof2calltree -i profile_data.pyprof && qcachegrind profile_data.pyprof.log
如果不从 kernprof 执行,则定义一个空操作装饰器:
if 'profile' not in globals():
def profile(func):
return func
Daniel 提出的方法的一种变体是使用以下一行代码,然后根据您是否需要进行分析来对其进行注释:
# Optional no-op decorator, comment when you want to profile
def profile(func): return func