Python argparse: как изменить `--add` на`add`, оставаясь необязательным аргументом?

Я хочу эту функциональность:

$ python program.py add Peter 
'Peter' was added to the list of names.

Я могу добиться этого с --add вместо add как это:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--add", help="Add a new name to the list of names",
                    action="store")
args = parser.parse_args()
if args.add:
   print "'%s' was added to the list of names." % args.add
else:
   print "Just executing the program baby."

Такой что:

$ python program.py --add Peter
'Peter' was added to the list of names.

Но когда я меняюсь --add в add это больше не является обязательным, как я могу позволить ему быть необязательным, но не иметь тех, -- приметы? (предпочтительно также с использованием argparse библиотека)

2 ответа

Решение

То, что вы хотите, на самом деле называется "позиционные аргументы". Вы можете разобрать их так:

import argparse                                                             
parser = argparse.ArgumentParser()                                             
parser.add_argument("cmd", help="Execute a command",                           
                    action="store", nargs='*')                                 
args = parser.parse_args()                                                     
if args.cmd:                                                                   
    cmd, name = args.cmd                                                       
    print "'%s' was '%s'-ed to the list of names." % (name, cmd)               
else:                                                                          
    print "Just executing the program baby."                                   

Что дает вам возможность указывать различные действия:

$ python g.py add peter
'peter' was 'add'-ed to the list of names.

$ python g.py del peter
'peter' was 'del'-ed to the list of names.

$ python g.py 
Just executing the program baby.

Вы можете использовать подкоманды для достижения этого поведения. Попробуйте что-то вроде следующего

import argparse
parser = argparse.ArgumentParser()

subparsers = parser.add_subparsers(title='Subcommands',
    description='valid subcommands',
    help='additional help')

addparser = subparsers.add_parser('add')
addparser.add_argument('names', nargs='*')

args = parser.parse_args()

if args.names:
    print "'%s' was added to the list of names." % args.names
else:
    print "Just executing the program baby."

Обратите внимание, что использование nargs='*' Значит это args.names теперь список, в отличие от вашего args.add, так что вы можете добавить произвольное количество имен после add (вам придется изменить способ обработки этого аргумента). Вышеуказанное можно затем назвать следующим образом:

$ python test.py add test
'['test']' was added to the list of names.

$ python test.py add test1 test2
'['test1', 'test2']' was added to the list of names.
Другие вопросы по тегам