python клик - переход от словаря к командной строке? - PullRequest
0 голосов
/ 11 марта 2020

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

@click.command()
@click.option('--achoice', type=click.Choice(["a","b","d"]), default="a")
@click.argument('script', type=click.Path(exists=True, dir_okay=False))
def run_via_click(**kwargs):
   ....

python test_click.py --achoice b test_click.py

{
    "achoice": "b",
    "script": "test_click.py"
}

Начиная со словаря , вы можете проанализировать декорированную функцию, найти в ней Option.achoice, добавить ее длинное имя, а затем значение. Argument.script даже не нужно дополнительное имя.

Так что теперь у вас есть ["--achoice", "b", "test_click.py"], который вы можете отправить обратно, чтобы щелкнуть, с standalone_mode = False для подтверждения.

Очевидно, что нет никакого смысла в этом, если вы уже в командной строке. Вот и весь смысл клика. Однако что делать, если вы получили словарь из данных http POST? Некоторое приложение GUI? Или если вы хотите сделать это для целей тестирования? Вы нажимаете sh вычисленную командную строку, чтобы щелкнуть и подтвердить, что она удовлетворена полученными параметрами.

Простые случаи, подобные этому, тривиальны. Но вы быстро сталкиваетесь с крайними случаями с такими вещами, как флаги кликов или с параметрами variadi c (несколько экземпляров).

Есть ли у клика это во внутренних органах? Я огляделся и не мог с готовностью опознать такую ​​вещь. Существует ли где-нибудь существующая эталонная реализация для сопоставления словаря с его командной строкой click, учитывая базовую функцию click? Я считаю, что есть несколько GUI сборщиков, которые используют Click для спецификаций. Я пользуюсь им, с большим успехом, нажимаю для динамического создания Django форм. И, да, я проверяю, используя сам клик, но мне пришлось ограничить подмножество конфигураций кликов, которые я использую - например, я не использую флаги, а вместо этого логические значения с явными значениями.

import json
import click

@click.command()
@click.option('--achoice', type=click.Choice(["a","b","d"]), default="a")
@click.argument('script', type=click.Path(exists=True, dir_okay=False))
def run_via_click(**kwargs):
    try:
        print(json.dumps(kwargs, sort_keys=True, indent=4))

    except (Exception,) as e:  # pragma: no cover
        raise

run_via_click()

...