MST

星途 面试题库

面试题:Python装饰器的元编程深度应用

设计一个装饰器框架,该框架可以让用户通过配置文件来灵活定义不同的装饰器行为。例如,配置文件中可以指定对某个函数在执行前进行权限验证,执行后进行结果缓存等不同组合。请阐述设计思路并给出关键代码片段。
37.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 读取配置文件:使用Python的configparser库读取配置文件,解析出不同函数对应的装饰器配置。
  2. 定义装饰器:编写权限验证、结果缓存等基础装饰器。
  3. 装饰器框架:创建一个装饰器工厂,根据配置文件内容动态应用装饰器到目标函数。

关键代码片段

import configparser
import functools


# 权限验证装饰器
def auth_required(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 简单模拟权限验证
        print("进行权限验证...")
        return func(*args, **kwargs)

    return wrapper


# 结果缓存装饰器
def result_cache(func):
    cache = {}

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]

    return wrapper


def decorate_functions_from_config():
    config = configparser.ConfigParser()
    config.read('config.ini')

    def decorator_factory(func):
        func_name = func.__name__
        if func_name in config:
            for option in config[func_name]:
                if option == 'auth':
                    func = auth_required(func)
                elif option == 'cache':
                    func = result_cache(func)
        return func

    return decorator_factory


# 使用示例
@decorate_functions_from_config()
def example_function(a, b):
    print(f"计算 {a} + {b}")
    return a + b


配置文件config.ini示例:

[example_function]
auth = true
cache = true