Python设计带参数的装饰器

设计实现:

有100个函数,分别添加一个计算函数执行时间的装饰器
有的时候需要计算时间,有的时候不需要
希望能通过修改一个变量,能控制这100个函数的装饰器是否执行

实现如下

在Python中,你可以通过设计一个带参数的装饰器来控制是否计算函数的执行时间。这个装饰器可以根据传入的参数来决定是否执行计时功能。下面是一个示例代码,展示了如何实现这个功能:

import time
from functools import wraps

# 全局变量,用于控制是否计算函数执行时间
ENABLE_TIMING = True

def timing_decorator(enable_timing):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if enable_timing:
                start_time = time.time()
                result = func(*args, **kwargs)
                end_time = time.time()
                print(f"Function {func.__name__} executed in {end_time - start_time:.4f} seconds")
            else:
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

# 使用装饰器
@timing_decorator(ENABLE_TIMING)
def example_function_1():
    time.sleep(1)
    print("Function 1 executed")

@timing_decorator(ENABLE_TIMING)
def example_function_2():
    time.sleep(2)
    print("Function 2 executed")

# 测试
example_function_1()
example_function_2()

代码说明:

  1. ENABLE_TIMING:这是一个全局变量,用于控制是否启用计时功能。你可以通过修改这个变量来控制所有函数的装饰器是否执行计时。

  2. timing_decorator:这是一个带参数的装饰器工厂函数。它接受一个布尔值 enable_timing,并根据这个值决定是否启用计时功能。

  3. decorator:这是实际的装饰器函数,它接受一个函数 func 并返回一个新的函数 wrapper

  4. wrapper:这是装饰器的核心逻辑。如果 enable_timingTrue,则在函数执行前后记录时间并打印执行时间;否则,直接执行函数。

  5. @wraps(func):这是 functools.wraps 装饰器,用于保留原始函数的元信息(如函数名、文档字符串等)。

使用方法:

  • 当你希望启用计时功能时,将 ENABLE_TIMING 设置为 True
  • 当你希望禁用计时功能时,将 ENABLE_TIMING 设置为 False

示例输出:

如果 ENABLE_TIMINGTrue,输出可能如下:

Function 1 executed
Function example_function_1 executed in 1.0012 seconds
Function 2 executed
Function example_function_2 executed in 2.0023 seconds

如果 ENABLE_TIMINGFalse,输出可能如下:

Function 1 executed
Function 2 executed

通过这种方式,你可以轻松地控制100个函数的装饰器是否执行计时功能,只需修改 ENABLE_TIMING 变量的值即可。

posted @ 2025-05-16 10:53  Haloiwuhan  阅读(29)  评论(0)    收藏  举报