为什么这个调用不需要定义的 2 个参数?

Why does this call not require 2 arguments as defined?

为什么这段代码有效?具体来说,当 运行() 函数特别需要计数和名称时,为什么我可以调用不带参数的函数。 PyLinter 抱怨这段代码并说没有带有 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()

这不像是一个普通的函数,我们不需要像往常一样传递参数。 Click 帮助您创建命令行界面。
所以当你在命令提示符下 运行 时,它会要求你输入值。

>>python your_file_name.py
>>Your name: Sanjay
>>Hello Sanjay!

这里会打印 Sanjay 一次,因为默认计数设置为 1。

如果你通过了计数那么它会多次打印名字

>>python your_file_name.py --count=3
>>Your name: Sanjay
>>Hello Sanjay!
>>Hello Sanjay!
>>Hello Sanjay!

装饰器语法

@decorator
def func():
    pass

实际上只是语法糖:

def func():
    pass

func = decorator(func)

IOW,它将函数名称重新绑定到装饰器的 return 值 - 通常,return 是包装装饰器的另一个函数。

所以在你的例子中,你在主要部分调用的 run() 函数确实不是你定义的 run() 函数,而是已经 returned 的函数由你的装饰器——它不期望参数,因为装饰器的目的是收集这些参数并将其提供给你的原始函数;-)