Как реализовать такой сценарий cli, используя argsparse? - PullRequest
1 голос
/ 29 марта 2019

Недавно я научился optdoc писать свой сценарий cli, был пример, который легко реализовать с использованием optdoc в качестве участника:

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]
  naval_fate.py -h | --help
  naval_fate.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

Я также хотел реализовать такой сценарий cli, используя argparse, однако я обнаружил, что это намного сложнее, чем я думал.

Как

naval_fate.py ship new <name>...
naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]

Я обозначаю ship и mine как две группы, мой код:

    parser = argparse.ArgumentParser(description="Naval Fate.")
    sub_parse = parser.add_subparsers()

    # ship command
    ship_parser = sub_parse.add_parser("ship", help="ship command info.")

    # mine command
    mine_parser = sub_parse.add_parser("mine", help="mine command info.")

Для shine new <name> я обозначаю new <name> как подкоманду группы ship, но как реализовать new <name> с использованием argparse? Я попытался использовать ship_parser.add_argument("new", action="store", help="give a new name to the ship"), в то время как new будет анализироваться как аргументы позиции, которые не могут иметь значения:

 ✘ ⚙  args_parse  python3 naval_args.py ship new "new_name"
usage: naval_args.py [-h] {ship,mine} ...
naval_args.py: error: unrecognized arguments: new_name

Системный ток new_name в качестве аргументов новой позиции, а не значение new.

У меня также был вопрос с орудием naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting].

Так как я могу реализовать скрипт, используя argparse? Заранее спасибо.

...