为了让我的代码更清晰(主要是)我自己阅读,我试图使用装饰器将大多数函数参数放在@decorator(args)
中,然后调用不带参数的函数。这是我目前的代码:
def dec1(*args, **kwargs):
def dec2(func):
return func(*args, **kwargs)
return dec2
@dec1(1, 2, 3)
def func1(val1, val2, val3):
print(val1)
print(val2)
print(val3)
if __name__ == "__main__":
func1()
但是,它报告了这一点(基本上使用装饰器运行代码,但不是第二个函数调用):
1
2
3
Traceback (most recent call last):
File "/home/shadowrylander/decorator_test.py", line 13, in <module>
f1()
TypeError: 'NoneType' object is not callable
我正在尝试完成的内容类似于Click
库所做的(使用参数定义hello()
,然后使用none调用它):
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
如果有人能帮助我创建一个类似于此的装饰器,我将非常感激,如果之前已经被问过和/或已经回答过,我会道歉;我要么无法正确理解它们,要么找不到问题! 谢谢你的帮助!
在dec2
中,您将返回使用指定参数调用func1
的结果,这不是您想要的。
你想要的是返回一个函数f
,它用指定的参数调用func1
,即:
def dec1(*args, **kwargs):
def dec2(func):
def f():
return func(*args, **kwargs)
return f
return dec2
更详细的解释:
请记住装饰器语法:
@dec1(1, 2, 3)
def func1(val1, val2, val3):
...
在语法上等同于:
def func1(val1, val2, val3):
...
func1 = dec1(1, 2, 3)(func1)
所以dec1(...)
(dec2
)的结果是在装饰函数时用装饰函数(func1
)作为参数调用的。所以你不希望dec2
做任何事情,只是返回一个函数,它将在以后调用时执行某些操作。