MST

星途 面试题库

面试题:Python装饰器的嵌套与复杂功能实现

假设有一个函数,需要对其进行多层装饰。第一层装饰器用于检查函数传入参数是否为整数类型,如果不是则抛出异常;第二层装饰器用于记录函数调用的日志到文件中,日志内容包含函数名、传入参数和返回值。请实现这两个装饰器并对一个简单函数进行装饰。
37.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import logging


def check_int_params(func):
    def wrapper(*args, **kwargs):
        for arg in args:
            if not isinstance(arg, int):
                raise ValueError("参数必须为整数类型")
        for value in kwargs.values():
            if not isinstance(value, int):
                raise ValueError("参数必须为整数类型")
        return func(*args, **kwargs)

    return wrapper


def log_to_file(func):
    logging.basicConfig(filename='function_log.log', level=logging.INFO,
                        format='%(asctime)s - %(message)s')

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        log_message = f"函数名: {func.__name__}, 传入参数: {args}, {kwargs}, 返回值: {result}"
        logging.info(log_message)
        return result

    return wrapper


@log_to_file
@check_int_params
def add_numbers(a, b):
    return a + b


你可以这样调用这个函数:

try:
    result = add_numbers(3, 5)
    print(result)
except ValueError as e:
    print(e)

上述代码定义了两个装饰器:

  1. check_int_params 装饰器用于检查传入函数的参数是否为整数类型,如果不是则抛出 ValueError 异常。
  2. log_to_file 装饰器用于记录函数调用的日志到 function_log.log 文件中,日志内容包含函数名、传入参数和返回值。

add_numbers 函数被这两个装饰器依次装饰,在调用 add_numbers 函数时,会先检查参数类型,然后记录日志。如果传入参数不是整数,会抛出异常。