鱼C论坛

 找回密码
 立即注册
查看: 2218|回复: 6

[已解决]含参函数如何使用装饰器

[复制链接]
发表于 2023-3-5 14:00:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

我先定义一个闭包
def logger(func):
    def call_func():
        print("----------")
        func()
        print("----------")
    return call_func

再给一个含参函数加上该闭包的装饰器
@logger
def sayhi(name):
    print("hi,{}".format(name))

然后函数sayhi()就没法用了
sayhi("小甲鱼")
Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    sayhi("小甲鱼")
TypeError: logger.<locals>.call_func() takes 0 positional arguments but 1 was given

求帮助
最佳答案
2023-3-5 14:10:07
一个函数在使用装饰器后会被替换成装饰器的返回值,

而装饰器的返回值 call_func 不接受任何参数,故而你给 sayhi 传参会报错,

所以就是要让 call_func 接收跟 sayhi 的参数个数一样的形参,并在 call_func 调用 sayhi 的时候把参数传递给 sayhi

故对你的代码修改如下:
def logger(func):
    def call_func(name):                         # 改了这里
        print("----------")
        func(name)                         # 改了这里
        print("----------")
    return call_func

@logger
def sayhi(name):
    print("hi,{}".format(name))

sayhi("小甲鱼")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-5 14:10:07 | 显示全部楼层    本楼为最佳答案   
一个函数在使用装饰器后会被替换成装饰器的返回值,

而装饰器的返回值 call_func 不接受任何参数,故而你给 sayhi 传参会报错,

所以就是要让 call_func 接收跟 sayhi 的参数个数一样的形参,并在 call_func 调用 sayhi 的时候把参数传递给 sayhi

故对你的代码修改如下:
def logger(func):
    def call_func(name):                         # 改了这里
        print("----------")
        func(name)                         # 改了这里
        print("----------")
    return call_func

@logger
def sayhi(name):
    print("hi,{}".format(name))

sayhi("小甲鱼")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-5 14:16:27 | 显示全部楼层
isdkz 发表于 2023-3-5 14:10
一个函数在使用装饰器后会被替换成装饰器的返回值,

而装饰器的返回值 call_func 不接受任何参数,故而 ...

OK, 谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-5 15:05:34 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-3-5 16:41 编辑
def logger(func):
    def call_func(**args, **kwargs):                         # 改了这里
        print("----------")
        func(**args, **kwargs)                         # 改了这里
        print("----------")
    return call_func

@logger
def sayhi(name):
    print("hi,{}".format(name))

sayhi("小甲鱼")
这样就兼容所有函数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-5 16:33:37 | 显示全部楼层
歌者文明清理员 发表于 2023-3-5 15:05
这样就兼容所有函数了

真是太厉害了,没有想到收集参数能这么用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-5 16:40:30 | 显示全部楼层
九歌当下 发表于 2023-3-5 16:33
真是太厉害了,没有想到收集参数能这么用

可惜了我的最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-5 16:48:55 | 显示全部楼层

下次看了得晚点在设最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表