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

Python函数装饰器:增强现有函数功能

发布时间:2023-06-11 05:41:01

Python函数装饰器是一种特殊的函数,用于修改、增强或包装其他函数的功能。函数装饰器是Python语言的一项重要特性,它可以将原来的函数包装在装饰器函数中,从而实现函数的增强或修改。

函数装饰器的语法:

@decorator
def function_name():
    pass

这里的decorator是一个装饰器函数,它接受一个函数对象作为参数,并返回一个新的函数对象。装饰器函数的定义如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        # do something before the function is called
        result = func(*args, **kwargs)
        # do something after the function is called
        return result
    return wrapper

这里的wrapper函数就是装饰器函数,它接受任意数量的参数*args**kwargs,然后在调用原函数之前和之后执行一些操作。

函数装饰器的主要作用是增强现有函数的功能,例如增加日志、计时、缓存或权限验证等。下面来介绍几种常见的装饰器用法。

1. 增加日志

我们可以编写一个简单的日志装饰器,它可以在函数被调用时打印出函数名和参数信息,以便调试和测试。

def log(func):
    def wrapper(*args, **kwargs):
        print(f'Calling {func.__name__} with arguments: {args}, {kwargs}')
        result = func(*args, **kwargs)
        print(f'Finished calling {func.__name__}')
        return result
    return wrapper

@log
def add(x, y):
    return x + y

result = add(2, 3)  # prints "Calling add with arguments: (2, 3), {}" and "Finished calling add"
print(result)  # prints 5

2. 计时器

我们可以编写一个简单的计时器装饰器,它可以计算函数执行的时间,并打印出来。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f'{func.__name__} took {end_time - start_time:.4f} seconds to run')
        return result
    return wrapper

@timer
def slow_add(x, y):
    time.sleep(1)  # simulate slow function
    return x + y

result = slow_add(2, 3)  # prints "slow_add took 1.0002 seconds to run"
print(result)  # prints 5

3. 缓存结果

我们可以编写一个简单的缓存装饰器,它可以缓存函数的结果并返回缓存值。

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

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

result = fibonacci(10)  # computes and caches fibonacci(0) to fibonacci(10)
print(result)  # prints 55

4. 验证权限

我们可以编写一个简单的权限验证装饰器,它可以验证用户是否有权执行某个函数并返回结果。

def require_admin(func):
    def wrapper(*args, **kwargs):
        if is_admin():
            result = func(*args, **kwargs)
            return result
        else:
            raise NotAuthorizedError('You do not have permission to access this resource')
    return wrapper

@require_admin
def delete_user(user_id):
    # delete user from database
    pass

result = delete_user(123)  # raises NotAuthorizedError if user is not an admin

总之,函数装饰器是Python语言中非常强大的特性,它可以大大简化代码,并提高函数的可重用性和维护性。通过装饰器,我们可以轻松地增加日志、计时、缓存或权限验证等功能,极大地提升了程序的可靠性和效率。