Chciałbym móc korzystać z opcji globalnych z obiektu argparse.ArgumentParser w celu przesłonięcia/zwiększenia wartości domyślnych dla pod-polecenia.Domyślne ustawienia podskładne argparse augment za pomocą opcji globalnych
Przykładem może być to, że wyświetlane pomoc odzwierciedla światowe nowości, czyli na poniższym przykładzie zabawki:
import argparse
import os
import sys
# Global parser and options.
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--user",
dest="user",
default=os.environ.get("USER"),
help="Override the setting of the $USER variable.")
# Sub-command parser and options.
subparsers = parser.add_subparsers()
command = subparsers.add_parser(
"command",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
command.add_argument("--config",
dest="config",
default="~%s/config" % os.environ.get("USER"),
help="The config file.")
options = parser.parse_args()
Idealnie podczas gdy uruchomię to w trybie pomocy byłoby uzyskać,
> python example.py --user thing command --help
usage: example.py command [-h] [--config CONFIG]
optional arguments:
-h, --help show this help message and exit
--config CONFIG The config file. (default: ~thing/config)
tj. Ścieżka do pliku konfiguracyjnego jest specyficzna dla użytkownika (rzecz). Zdaję sobie sprawę, że mogę zmienić domyślną konfigurację na "~%(user)s/config"
, a następnie rozwiązać ten problem w czasie wykonywania w przestrzeni nazw opcji, jednak chciałbym, aby pomoc była bardziej wyraźna.
wnoszę alternatywnym rozwiązaniem byłoby, aby spróbować przeanalizować argumenty raz, aby uzyskać opcje globalne, tzn
if "--help" in sys.argv:
# Parse the command minus the help to obtain the global options.
args = sys.argv[1:]
args.remove("--help")
# Update the defaults with the global options.
options = parser.parse_args(args)
command.set_defaults(config="~%s/config" % options.user)
# Re-parse the options.
parser.parse_args()
Choć wydaje się to nieco hacky. Czy istnieje lepsze podejście/rozwiązanie?
Dzięki za odpowiedź. To podejście jest zdecydowanie znacznie czystsze/prostsze niż moje podejście i bardziej podobne do podejścia, które próbowałem bez argparse, tj. Dwukrotnie analizowałem argumenty. Mogę zajrzeć do kodu, aby zobaczyć, jak mogę uzyskać parse_known_args(), aby zwrócić z opcjami (w przeciwieństwie do wychodzenia), gdy podano argument "--help" zamiast usuwania go na mój przykład. – John
Och, zapomniałem o tym. Możesz złapać wyjątek 'SystemExit', który' parse_known_args() 'wyrzuci, gdy wywoła' ArgumentParser.exit' (co jest względnie cienkim opakowaniem wokół 'sys.exit'). – chepner
Hej, tak, próbowałem tego, jednak problem z try/except jest taki, że opcje są niezdefiniowane. – John