如何在 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