Python中能否将函数参数传入装饰器?(Pycord场景)
如何将函数参数传递给装饰器(适配Pycord场景)
你需要的是让装饰器能获取到被装饰函数接收到的参数,而非在装饰器初始化阶段传参——毕竟Pycord会自动把参数直接传给函数,没法用@my_decorator("arg")这种带初始化参数的装饰器语法。
完全可以实现这个需求,不需要把逻辑写在函数内部,核心思路是让装饰器的内层包装函数接收并传递参数,在包装函数里直接访问这些参数做处理:
固定参数场景示例
def my_decorator(func): def inner(arg): # 在这里直接使用传给my_func的参数 print(f"装饰器捕获到参数: {arg}") # 执行原函数并保存结果 result = func(arg) # 可根据参数添加额外逻辑,比如校验、日志等 if isinstance(arg, str) and len(arg) < 3: print("警告:参数长度过短") return result return inner @my_decorator def my_func(arg): print(f"原函数接收到参数: {arg}") return f"返回结果: {arg}"
可变参数场景示例(适配Pycord命令的多参数情况)
如果被装饰的Pycord命令函数参数不固定,用*args和**kwargs可以完美适配:
def my_decorator(func): def inner(*args, **kwargs): # 查看所有位置参数 print(f"装饰器捕获位置参数: {args}") # 查看所有关键字参数 print(f"装饰器捕获关键字参数: {kwargs}") # 执行原函数 result = func(*args, **kwargs) return result return inner @my_decorator def my_pycord_command(ctx, user_input, option=None): print(f"命令函数接收到: {ctx}, {user_input}, {option}")
这种写法完全兼容Pycord的调用逻辑,所有扩展逻辑都集中在装饰器里,后续维护只需要修改这一处即可,不用改动多个函数。
内容的提问来源于stack exchange,提问作者Morris van den Bergh
相关产品推荐
相关产品推荐

