首页 > 解决方案 > 为什么此调用不需要定义的 2 个参数?

问题描述

为什么这段代码有效?具体来说,当 run() 函数特别需要计数和名称时,为什么我可以不带参数调用它。PyLinter 抱怨此代码并说没有函数 run() 与 0 参数。但随后代码运行良好。

这是因为装饰器添加了一个同名“run”但没有参数的附加函数吗?

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 run(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__":
    run()

标签: pythonpython-3.xclick

解决方案


装饰器语法

@decorator
def func():
    pass

实际上只是语法糖:

def func():
    pass

func = decorator(func)

IOW,它将函数名称重新绑定到装饰器的返回值 - 大多数情况下,它返回另一个包装装饰器的函数。

因此,在您的示例中,run()您在 main 部分中调用的函数确实不是run()您定义的函数,而是您的装饰器返回的函数 - 它不期望参数,因为装饰器的重点是收集并将这些参数提供给您的原始函数;-)


推荐阅读