Czy argparse udostępnia wbudowane funkcje umożliwiające przekształcanie grup lub parserów w ich własne przestrzenie nazw? Czuję, że muszę gdzieś opuścić jakąś opcję.podkomendy argparse z zagnieżdżonymi przestrzeniami nazw
Edycja: Ten przykład prawdopodobnie nie jest dokładnie tym, co powinienem zrobić, aby utworzyć strukturę parsera, aby spełnić mój cel, ale to właśnie opracowałem do tej pory. Moim konkretnym celem jest zapewnienie grupom opcji opcji, które są analizowane w polach nazw. Pomysł, jaki miałem z rodzicem, polegał po prostu na użyciu wspólnych opcji w tym samym celu.
Przykład:
import argparse
# Main parser
main_parser = argparse.ArgumentParser()
main_parser.add_argument("-common")
# filter parser
filter_parser = argparse.ArgumentParser(add_help=False)
filter_parser.add_argument("-filter1")
filter_parser.add_argument("-filter2")
# sub commands
subparsers = main_parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('command_a', help="command_a help", parents=[filter_parser])
parser_a.add_argument("-foo")
parser_a.add_argument("-bar")
parser_b = subparsers.add_parser('command_b', help="command_b help", parents=[filter_parser])
parser_b.add_argument("-biz")
parser_b.add_argument("-baz")
# parse
namespace = main_parser.parse_args()
print namespace
To co mam, oczywiście:
$ python test.py command_a -foo bar -filter1 val
Namespace(bar=None, common=None, filter1='val', filter2=None, foo='bar')
Ale to kim jestem naprawdę, po:
Namespace(bar=None, common=None, foo='bar',
filter=Namespace(filter1='val', filter2=None))
I wtedy nawet więcej grup opcje już przeanalizowane w przestrzeni nazw:
Namespace(common=None,
foo='bar', bar=None,
filter=Namespace(filter1='val', filter2=None),
anotherGroup=Namespace(bazers='val'),
anotherGroup2=Namespace(fooers='val'),
)
Znalazłem related question here, ale wymaga to niestandardowego parsowania i wydaje się, że obejmuje tylko naprawdę specyficzną okoliczność.
Czy istnieje opcja, aby powiedzieć argparse, aby przeanalizować określone grupy w polach z polami nazw?
Nie jestem pewien, jak można się spodziewać to zadziałało. Jak już napisałeś, 'filter1' i' filter2' są w parserze najwyższego poziomu, a nie w parserze potomnym o nazwie 'filter'. W jaki sposób argparse może wiedzieć, że chcesz, aby działał jako dziecko w każdym pod-analizatorze, jeśli tak nie jest? – abarnert
@abarnert: Prawdopodobnie powinienem sformatować mój przykład na podstawie twojego pytania. Ponieważ struktura, którą zestawiłem, nie jest właściwa, jak zauważyłeś. Moim celem jest być w stanie zastosować grupy opcji do formatów i sparsować je w przestrzeń nazw. Byłoby miło, gdyby były powszechne, dlatego próbowałem użyć struktury macierzystej. – jdi
Poszukujesz czegoś takiego jak 'pip',' git', itd., Gdzie oprócz globalnych opcji najwyższego poziomu i opcji specyficznych dla każdej podkomendy, dostępne są również opcje współużytkowane przez wiele różnych podkomend (np. opcje '--verbose',' --upgrade' i '--user' na' pip', odpowiednio) i mogą reprezentować to udostępnianie bezpośrednio, zamiast tworzyć je domyślnie (przez kopiowanie grup opcji do wielu akapitów) ? – abarnert