#python #command-line-arguments #argparse
Вопрос:
Есть ли способ sys.argv
заменить мой собственный список для утилиты, работающей по щелчку мыши? С argparse
этим все просто и выглядит так:
def _retrieve_args(argv: List[str]) -> Any:
parser = argparse.ArgumentParser(
...
args = parser.parse_args(argv)
...
return args
тогда ты можешь делать все, что тебе заблагорассудится:
ARGS = _retrieve_args(sys.argv[1:])
или
ARGS = _retrieve_args(['-v', '--count', '4', '.'])
если понадобится.
Возможно ли это с click
помощью ?
Я понятия не имею, где sys.argv
вставляется в характеристическую click
настройку:
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@click.option(
"-p", "--pretty", is_flag=True, help=click.style("Pretty output.", fg="green")
)
@click.option(
"-e",
"--file-type",
type=str,
default=None,
help="Accept only specified audio files.",
)
@click.option(
"-b",
"--album-num",
type=int,
default=None,
help="Prepend INTEGER to the destination root directory name.",
)
@click.argument("tgt_dir", type=click.Path(exists=True, resolve_path=True))
def main(*, version="", **kwargs):
"""
My utility.
"""
print(f'version: "{version}"')
for key, val in kwargs.items():
print(f"key: {key}, val: {val}")
UPD:
Что-то очень близкое к тому, что я хочу, входит в структуру тестирования:
from click.testing import CliRunner
def run(*, argv: List[str]):
runner = CliRunner()
result = runner.invoke(main, argv)
print(result.output)
Могу ли я вызвать main
функцию более или менее так, без лишних затрат на тестирование? Особенно без хранения result.output
?
Комментарии:
1. Вам это нужно для тестирования вашего приложения CLI? В противном случае я не вижу смысла в использовании
args
, такclick
как анализирует его автоматически, и аргументы доступны по их имени.