Вызов другой подкоманды с щелчком Python, похоже, не проверяет поля - PullRequest
1 голос
/ 10 июня 2019

Если я вызываю подкоманду Click из другой команды, не похоже, что вызванная команда проверяет переданные поля. Я что-то не так делаю?

Это небольшой пример:

cli_main.py

import click
import cli_add
import cli_sub
import sys

@click.group()
@click.pass_context
def cli(ctx):
    """Main CLI"""

cli.add_command(cli_add.add)
cli.add_command(cli_sub.subtract)


if __name__ == "__main__":
    sys.exit(cli())

cli_sub.py

import click

@click.group()
@click.pass_context
def subtract(ctx):
    """subtract"""


@subtract.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
    click.echo("Subtract {}".format(number))

cli_add.py

import click
import cli_sub


@click.group()
@click.pass_context
def add(ctx):
    """add"""


@add.command()
@click.option('--number', type=int, required=True)
@click.pass_context
def number(ctx, number):
    if number > 0:
        click.echo("Add {}".format(number))
    else:
        ctx.invoke(cli_sub.number)

Пример звонков:

python cli_main.py add number --number 1
Add 1

python cli_main.py subtract number --number 1
Subtract 1

python cli_main.py subtract number
Usage: cli_main.py subtract number [OPTIONS]
Try "cli_main.py subtract number --help" for help.

Error: Missing option "--number".

Эти работы, как и ожидалось. Однако, если я позвоню по следующему, это не получится неожиданным образом.

python cli_main.py add number --number -1
Subtract None

Он вызывает метод вычитания. Проблема в том, что я не передаю параметр в своем вызове:

ctx.invoke(cli_sub.number)

Итак, я ожидаю, что это не удастся, и предоставлю мне текст использования, тем более что требуется опция number.

Я правильно не вызываю эту подкоманду? Почему вызов, не вызывающий параметр, проверяет так же, как прямой вызов подкоманды без параметра?

1 Ответ

0 голосов
/ 11 июня 2019

Ваш анализ проблемы правильный, вам нужно передать параметры. Вы можете передать параметр как:

ctx.invoke(cli_sub.number, number=number)

Что касается другого вашего вопроса:

Почему вызов, не вызывающий параметр, проверяет так же, как это делает прямой вызов подкоманды без параметра?

Эта проверка выполняется при разборе параметров. Если вы звоните ctx.invoke() напрямую, ожидается, что вы понимаете, что нужно вашей команде.

...