Почему этот вызов не требует 2 аргументов, как определено? - PullRequest
0 голосов
/ 03 апреля 2020

Почему этот код работает? В частности, почему я могу вызывать функцию 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()

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Синтаксис декоратора

@decorator
def func():
    pass

на самом деле просто синтаксис c сахар для:

def func():
    pass

func = decorator(func)

IOW, он связывает имя функции с возвращаемым значением декоратора - что чаще всего возвращает другую функцию, которая оборачивает декорированную.

Итак, в вашем примере функция run(), которую вы вызываете в главном разделе, на самом деле не определенная вами функция run(), а функция, которая была возвращена вашими декораторами - что не вместо этого он ожидает аргументы, поскольку целью декораторов является сбор и предоставление этих аргументов вашей исходной функции; -)

0 голосов
/ 03 апреля 2020

это не похоже на обычную функцию, нам не нужно передавать параметры, как обычно. 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!
...