欢迎访问宙启技术站
智能推送

10个常用的Python装饰器函数:如何优化你的代码

发布时间:2023-07-02 14:32:20

装饰器是Python中一种有用的编程工具,它可以用于在不修改原始代码的情况下扩展或修改函数。在这篇文章中,我将介绍10个常用的Python装饰器函数,并说明如何使用它们来优化你的代码。

1. 计时器装饰器:这个装饰器可以用来计算函数的执行时间。你可以将它应用到任何函数上,并在函数执行完毕后打印出执行时间。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 的执行时间为: {end_time-start_time}秒")
        return result
    return wrapper

@timer
def my_function():
    # 函数代码

2. 缓存装饰器:这个装饰器可以用来缓存函数的计算结果,以避免重复计算。当函数以相同的参数被多次调用时,装饰器将直接返回缓存的结果。

def memoize(func):
    cache = {}
    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

3. 类型检查装饰器:这个装饰器可以用来检查函数的参数类型是否与预期一致。如果传入的参数类型不正确,装饰器将抛出一个TypeError。

def type_check(func):
    def wrapper(*args, **kwargs):
        for i, arg in enumerate(args):
            if not isinstance(arg, int):
                raise TypeError(f"参数 {i} 的类型不正确")
        for key, value in kwargs.items():
            if not isinstance(value, int):
                raise TypeError(f"参数 {key} 的类型不正确")
        return func(*args, **kwargs)
    return wrapper

@type_check
def add(a, b):
    return a + b

4. 日志记录装饰器:这个装饰器可以用来记录函数的日志。你可以将它应用到任何函数上,并在函数执行时将相关信息写入日志文件中。

import logging

def logger(func):
    logging.basicConfig(filename='log.txt', level=logging.INFO)
    def wrapper(*args, **kwargs):
        logging.info(f"函数 {func.__name__} 被调用了")
        return func(*args, **kwargs)
    return wrapper

@logger
def my_function():
    # 函数代码

5. 授权验证装饰器:这个装饰器可以用来验证用户的授权信息。你可以将它应用到任何需要授权访问的函数上,以确保只有授权用户才能执行该函数。

def authorized(func):
    def wrapper(*args, **kwargs):
        if not is_authorized():
            raise PermissionError("用户没有授权")
        return func(*args, **kwargs)
    return wrapper

@authorized
def my_function():
    # 函数代码

6. 重试装饰器:这个装饰器可以用来自动重试函数的执行,以应对可能出现的失败情况。你可以指定重试的次数和延迟时间。

import time

def retry(func):
    def wrapper(*args, **kwargs):
        max_retries = 3
        delay = 1
        for i in range(max_retries):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                print(f"函数执行出错,正在重试 ({i+1}/{max_retries})")
                time.sleep(delay)
        print("函数执行失败")
    return wrapper

@retry
def my_function():
    # 函数代码

7. 输入验证装饰器:这个装饰器可以用来验证函数的输入参数是否符合特定的规则。如果参数不符合规则,装饰器将抛出一个ValueError。

def validate(func):
    def wrapper(*args, **kwargs):
        if not is_valid(*args, **kwargs):
            raise ValueError("参数不符合规则")
        return func(*args, **kwargs)
    return wrapper

@validate
def my_function():
    # 函数代码

8. 参数转换装饰器:这个装饰器可以用来将函数的输入参数转换成不同的类型。你可以根据需求将其应用到指定的参数,以确保函数能正常工作。

def convert_args(*types):
    def decorator(func):
        def wrapper(*args, **kwargs):
            converted_args = []
            for i, arg in enumerate(args):
                converted_args.append(types[i](arg))
            converted_kwargs = {}
            for key, value in kwargs.items():
                converted_kwargs[key] = types[len(args) + list(kwargs.keys()).index(key)](value)
            return func(*converted_args, **converted_kwargs)
        return wrapper
    return decorator

@convert_args(str, int)
def my_function(name, age):
    # 函数代码

9. 缓存带参数的装饰器:这个装饰器可以用来缓存带参数的函数的计算结果。不同于之前的缓存装饰器,这个装饰器根据参数来缓存不同的结果。

def cache_with_args(cache_size):
    def decorator(func):
        cache = {}
        def wrapper(*args):
            if args in cache:
                return cache[args]
            if len(cache) >= cache_size:
                cache.popitem()
            result = func(*args)
            cache[args] = result
            return result
        return wrapper
    return decorator

@cache_with_args(cache_size=10)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

10. 记录函数执行次数装饰器:这个装饰器可以用来记录函数被调用的次数。你可以将它应用到任何函数上,并在函数被调用时将调用次数打印出来。

def count_calls(func):
    count = 0
    def wrapper(*args, **kwargs):
        nonlocal count
        count += 1
        print(f"函数 {func.__name__} 被调用了 {count} 次")
        return func(*args, **kwargs)
    return wrapper

@count_calls
def my_function():
    # 函数代码

以上是10个常用的Python装饰器函数,它们可以帮助你优化你的代码,提高代码的可维护性和可扩展性。通过合理运用装饰器,你可以轻松地实现一些常见的编程需求,从而使你的代码更加高效和健壮。