Python, CLI, Нажмите: передача моего собственного списка аргументов

#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 как анализирует его автоматически, и аргументы доступны по их имени.