You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过装饰器在目标函数调用前修改其参数?附具体代码场景

实现方案与说明

基础功能实现

你现有代码存在两个问题:

  1. display_prev_days内的func没有加调用括号,也没有传递循环变量i,就算传入了正确的函数也不会执行、也拿不到循环值
  2. 直接写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:24:05