Python 使用decorator调用不带参数的函数

Python 使用decorator调用不带参数的函数,python,decorator,python-decorators,Python,Decorator,Python Decorators,为了让我的代码更清晰(大部分)让我自己阅读,我尝试使用decorator将大多数函数参数放入@decorator(args),然后调用没有参数的函数。这是我当前的代码: def1(*args,**kwargs): def dec2(职能): 返回函数(*args,**kwargs) 12月2日返回 @十二月一日(一、二、三) def func1(val1、val2、val3): 打印(val1) 打印(val2) 打印(val3) 如果名称=“\uuuuu main\uuuuuuuu”: fun

为了让我的代码更清晰(大部分)让我自己阅读,我尝试使用decorator将大多数函数参数放入
@decorator(args)
,然后调用没有参数的函数。这是我当前的代码:

def1(*args,**kwargs):
def dec2(职能):
返回函数(*args,**kwargs)
12月2日返回
@十二月一日(一、二、三)
def func1(val1、val2、val3):
打印(val1)
打印(val2)
打印(val3)
如果名称=“\uuuuu main\uuuuuuuu”:
func1()
但是,它报告了这一点(基本上是使用decorator运行代码,而不是第二个函数调用):

1
2.
3.
回溯(最近一次呼叫最后一次):
文件“/home/shadowrylander/decorator_test.py”,第13行,在
f1()
TypeError:“非类型”对象不可调用
我尝试实现的功能与库的功能类似(使用参数定义
hello()
,然后使用none调用它):

导入单击
@click.command()命令
@单击.option('--count',默认值=1,help='问候语的数量')
@单击.option('--name',prompt='Your name',
帮助打招呼的人
def你好(计数、名称):
“”“与名称打招呼的简单程序,总计计数次数。”“”
对于范围内的x(计数):
单击.echo('Hello%s!'%name)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
你好()
如果有人能帮我创建一个类似的装饰师,我将非常感激,如果之前已经有人问过和/或回答过,我表示歉意;我要么不能正确理解他们,要么找不到问题

谢谢你的帮助

dec2
中,使用指定的参数返回调用
func1
的结果,这不是您想要的结果

您需要返回一个函数
f
,该函数使用指定的参数调用
func1
,即:

def dec1(*args, **kwargs):
    def dec2(func):
        def f():
            return func(*args, **kwargs)
        return f
    return dec2

更详细的解释:

请记住,decorator语法:

@dec1(1, 2, 3)
def func1(val1, val2, val3):
    ...
在语法上等同于:

def func1(val1, val2, val3):
    ...
func1 = dec1(1, 2, 3)(func1)

因此,
dec1(…)
dec2
)的结果在修饰函数时以修饰函数(
func1
)作为参数调用。因此,您不想让
dec2
执行任何操作,只想返回一个函数,该函数在以后调用时会执行某些操作。

如果您只想使用硬编码值,为什么您的函数还要接受这些参数?请在装饰程序中将
func1
更改为
func
。调用包装函数时,
func1
引用修饰函数,而不是原始定义。带参数的装饰器应返回真正的装饰器。看这里。另请参见functools.partialso,您发布的错误不是代码发布版本产生的错误。@user2357112:仅供说明;我想使用几乎所有的函数和一个可以接受任何参数并传递它的装饰器!就这样!谢谢