Я хочу использовать несколько вариантов вместе или не использовать вообще, как следует из названия, но мои методы кажутся относительно уродливыми, и мне было интересно, есть ли более чистый способ реализовать это. Кроме того, я просмотрел это о том, как это может быть сделано в argparse
, но я хотел бы реализовать это в click
, если это возможно (я стараюсь избегать использования nargs=[...]
).
Пока это то, что у меня есть:
@click.group(invoke_without_command=True, no_args_is_help=True)
@click.option(
"-d",
"--group-dir",
type=click.Path(),
default="default",
help='the directory to find the TOML file from which to run multiple jobs at the same time; defaults to the configuration directory of melmetal: "~/.melmetal" on Unix systems, and "C:\\Users\\user\\.melmetal" on Windows',
)
@click.option("-f", "--group-file", help="the TOML file name")
@click.option(
"-n", "--group-name", help="name of the group of jobs"
)
@click.option(
"--no-debug",
is_flag=True,
type=bool,
help="prevent logging from being output to the terminal",
)
@click.pass_context
@logger.catch
def main(ctx, group_dir, group_file, group_name, no_debug):
options = [group_file, group_name]
group_dir = False if not any(options) else group_dir
options.append(group_dir)
if not any(options):
pass
elif not all(options):
logger.error(
colorize("red", "Sorry; you must use all options at once.")
)
exit(1)
else:
[...]
И второй пример:
if any(createStuff):
if not all(createStuff):
le(
colorize("red", 'Sorry; you must use both the "--config-dir" and "--config-file" options at once.')
)
exit(1)
elif any(filtered):
if len(filtered) is not len(drbc):
le(
colorize("red", 'Sorry; you must use all of "--device", "--repo-name", "--backup-type", and "--config-dir" at once.')
)
exit(1)
else:
ctx = click.get_current_context()
click.echo(ctx.get_help())
exit(0)
Как сделать так, чтобы текст справки отображался, когда не заданы никакие подкоманды? Насколько я понимаю, это должно происходить автоматически, но для моего кода это автоматически переходит в основную функцию. Пример моего обходного пути находится во втором примере, то есть под оператором else
.