Как сказано в официальном документе argparse, ,
Один из особенно эффективных способов обработки подкоманд состоит в том, чтобы объединить использование метода add_subparsers () с вызовами set_defaults ()
Я хотел бы реализовать некоторые команды, такие как foo и bar, где foo - это команда по умолчанию . Какой самый простой способ? Эти команды имеют общие и не общие аргументы и параметры. Команда foo по умолчанию имеет только параметры, без аргументов.
Обязательная командная строка и вывод:
$ python m.py
foo
$ python m.py -a
foo(a)
$ python m.py foo
foo
$ python m.py foo -a
foo(a)
$ python m.py bar
bar
$ python m.py bar -b
bar(b)
Заранее спасибо!
ДОБАВЛЕНО:
My код в настоящее время выглядит следующим образом:
import argparse
def a(args):
print(f'a({args})')
def b(args):
print(f'b({args})')
def main():
parser = argparse.ArgumentParser()
parser.set_defaults(func=a) # default command
sp = parser.add_subparsers()
pa = sp.add_parser('a') # subcommand
pa.set_defaults(func=a)
pa.add_argument('-p')
pa.add_argument('-q')
pb = sp.add_parser('b') # subcommand
pb.set_defaults(func=b)
pb.add_argument('-p')
pb.add_argument('-x')
args = parser.parse_args() # https://docs.python.org/ja/3/library/argparse.html#sub-commands
args.func(args)
if __name__ == "__main__":
main()
Поскольку -p и -q являются параметрами команды a, анализатор по умолчанию не распознает их. Если я добавлю parser.add_argument ('- p'), это будет работать. Однако если я укажу -p для основного и вспомогательного синтаксических анализаторов на python m.py -p 1 a -p 2
, это будет позволено , и последний имеет приоритет. Это подвержено ошибкам, и я хотел бы поднять некоторые исключения для конфликта. Кроме того, , если я добавлю required=True
, это требуется обоим парсерам, парсер требует конфликта, которого я бы хотел избежать.