Muszę zabraknąć czegoś oczywistego. Celem jest użycie argparse z pierwszym wymaganym parametrem, opcjonalnie drugim opcjonalnym i dowolnymi pozostałymi parametrami.Python argparse: Połącz opcjonalne parametry z nargs = argparse.REMAINDER
Aby pokazać problem, zrobiłem dwa parsery testowe; jedyną różnicą między nimi jest używanie nargs = argparse.REMAINDER w jednym i nargs = "*" w drugim.
def doParser1(argsin):
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')
parser.add_argument('leftovers', nargs=argparse.REMAINDER,
help='all the other parameters')
argsout = parser.parse_args(args=argsin)
print argsout
return argsout
def doParser2(argsin):
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')
parser.add_argument('leftovers', nargs='*',
help='all the other parameters')
argsout = parser.parse_args(args=argsin)
print argsout
return argsout
Jeśli nie ma żadnych dodatkowych parametrów, parser2 działa. To jest wejście następnie parser1 i parsera 1:
input: ['req1value', '--opt1', 'opt1value']
Namespace(leftovers=['--opt1', 'opt1value'], opt1=None, req1='req1value')
Namespace(leftovers=None, opt1='opt1value', req1='req1value')
Jeśli istnieją dodatkowe parametry, wartość OPT1 pominięcia w parser1 i parser2 tylko pogubi:
input: ['req1value', '--opt1', 'opt1value', 'r1', 'r2']
Namespace(leftovers=['--opt1', 'opt1value', 'r1', 'r2'], opt1=None, req1='req1value')
usage: py-argparse.py [-h] [--opt1 OPT1]
[-leftovers [LEFTOVERS [LEFTOVERS ...]]]
req1
py-argparse.py: error: unrecognized arguments: r1 r2
Oczekiwany wynik powinien być:
Namespace(leftovers=['r1', 'r2'], opt1='opt1value', req1='req1value')
Wygląda na to, że powinien to być prosty przypadek, a to, co jest tutaj, zostało uproszczone z tego, co naprawdę próbuję zrobić. Próbowałem robić resztki opcjonalnie, dodając wiele innych opcji, ale nic nie działa lepiej.
Każda pomoc zostanie doceniona.
Wiedziałem, że musi to być coś prostego. Nie widziałem tego w dokumentach nigdzie, ale działa to dla nargs = argparse.REMAINDER i to wszystko, czego potrzebuję. Dzięki. – OPunWide