Возможно, самое близкое решение argparse
, по крайней мере, без прохождения маршрута субпарсера, может быть:
import argparse
import sys
print(sys.argv)
parser = argparse.ArgumentParser()
parser.add_argument('-k', '--keyvalue')
parser.add_argument('-v', '--verbose', action='store_true')
parser.add_argument('-d', '--data')
parser.add_argument('-f', '--file')
parser.add_argument('pos1', choices = ['help', 'get', 'post'])
parser.add_argument('pos2')
args = parser.parse_args()
print(args)
Полученная помощь:
1744:~/mypy$ python stack54383659.py get aurl -h
['stack54383659.py', 'get', 'aurl', '-h']
usage: stack54383659.py [-h] [-k KEYVALUE] [-v] [-d DATA] [-f FILE]
{help,get,post} pos2
positional arguments:
{help,get,post}
pos2
optional arguments:
-h, --help show this help message and exit
-k KEYVALUE, --keyvalue KEYVALUE
-v, --verbose
-d DATA, --data DATA
-f FILE, --file FILE
Подходитне идеально.Например, вы можете дать help
, но вы можете указать -h
.2-е позиционное значение может быть любой строкой, «get», действительным URL или чем-то еще.Ваш собственный код должен подтвердить это.Бит key:value
требует вашего собственного анализа.
При анализе argparse
синтаксический анализ optionals
может происходить в любом порядке.Два позиционера должны быть в указанном порядке (относительно друг друга).
В более новых питонах я могу изменить последний позиционер на «необязательный» и использовать новый синтаксический анализатор intermixed
.Это позволило бы мне просто дать «помощь» (или просто «получить»):
parser.add_argument('pos2', nargs='?')
args = parser.parse_intermixed_args()
intermixed
необходимо, если два позиционных значения разделены флагами.По некоторым сложным причинам регулярный анализ может потреблять '?'аргумент преждевременно оставляя вас с дополнительной нераспознанной строкой.
Другой подход заключается в определении всех отмеченных аргументов и использовании parse_known_args
.Значения, не являющиеся флагами, будут в списке extras
, который вы можете анализировать по своему усмотрению.Старые парсеры, такие как optparse
, делали это по существу.argparse
добавлена ограниченная возможность обрабатывать позиционные аргументы, но строго по положению, а не по значению.