如何通过装饰器在目标函数调用前修改其参数?附具体代码场景
实现方案与说明
基础功能实现
你现有代码存在两个问题:
display_prev_days内的func没有加调用括号,也没有传递循环变量i,就算传入了正确的函数也不会执行、也拿不到循环值- 直接写
display_date(today, ???)会立刻执行该函数,而不是把函数作为参数传入display_prev_days
按照如下方式修改即可实现输出过往10天日期:
from datetime import date, timedelta # 修改display_prev_days,循环时将i作为参数传入调用的函数 def display_prev_days(num_days, func): for i in range(0, num_days): func(i) def display_date(date, subtract): print(date - timedelta(subtract)) today = date.today() # 用lambda固定date参数为today,接收循环传入的i作为subtract参数 display_prev_days(10, lambda i: display_date(today, i))
装饰器修改函数参数说明
装饰器本质是函数封装器,可以在不修改原函数代码的前提下,拦截目标函数的入参,修改完成后再传递给原函数执行,示例如下:
# 定义参数预处理装饰器 def preprocess_args(func): def wrapper(*args, **kwargs): # args为位置参数元组,kwargs为关键字参数字典,可按需修改 # 示例:自动将subtract参数限制在0~365范围内,避免出现不合理的日期计算 args_list = list(args) if len(args_list) >= 2: args_list[1] = max(0, min(args_list[1], 365)) # 将修改后的参数传给原函数执行 return func(*tuple(args_list), **kwargs) return wrapper # 给目标函数添加装饰器即可生效 @preprocess_args def display_date(date, subtract): print(date - timedelta(subtract))
添加装饰器后,每次调用display_date前都会自动执行参数修改逻辑,无需改动原函数和调用逻辑。
内容的提问来源于stack exchange,提问作者alexx0186
相关产品推荐
相关产品推荐

