Dodajeję parsery do mojego parsera w celu symulacji funkcjonalności podkomend (na przykład kod zobacz: Simple command line application in python - parse user input?). Teraz chcę dodać polecenie/arsenał quit
, które nie przyjmuje żadnych argumentów i ma załączoną akcję "zakończ". Czy to możliwe ? Jak mogę to zrobić?python argparse - dodaj akcję do akapitu bez argumentów?
11
A
Odpowiedz
13
Dokumentacja dla subcommands
podaje dwa przykłady identyfikacji ciarki.
https://docs.python.org/dev/library/argparse.html#sub-commands
Jednym z nich jest dać add_subparsers
dest
:
def do_quit(args):
# action
quit()
parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd # displays 'quit'
if args.cmd == 'quit':
do_quit(args)
druga jest użycie set_defaults
połączyć subparser z funkcją:
parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)
Włączone dalsza myśl, Oto sposób, używając niestandardowego Action
. To jest jak _HelpAction
(który jest używany przez -h
). Jest wywoływana przez argument pozycyjny z nargs=0
(lub "?"). Taki argument jest zawsze wywoływany, nawet jeśli nie ma ciągów pasujących do niego (lub raczej 0 pasujących do siebie). Jest to logiczna, ale nieco niejasna konsekwencja sposobu traktowania pozycji.
class QuitAction(argparse.Action):
def __call__(self, parser, *args, **kwargs):
parser.exit(message="QUITTING\n")
p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])
produkcji (jeśli jest uruchomiony w ipython):
QUITTING
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
Powiązane problemy
- 1. Argparse - działanie niestandardowe bez argumentów?
- 2. Python argparse: oddzielne opcje dla argumentów pozycyjnych
- 3. argparse: Uzyskaj niezdefiniowaną liczbę argumentów
- 4. Dodaj akcję bez zmiany wyniku do notacji refactora
- 5. Python argparse: nazwa parametry
- 6. Python argparse toggle flags
- 7. Podawanie argumentów (dla argparse) z unittest discover
- 8. Python: argparse opcjonalne argumenty bez kresek
- 9. Uzyskiwanie pozostałych argumentów w argparse
- 10. Obsługa argumentów Enum w argparse
- 11. Python argparse: wzajemnie się wykluczają grupa z kilkoma kompatybilnymi argumentów
- 12. Python Argparse warunkowo wymagane argumenty
- 13. Python argparse: wartość domyślna lub podana wartość
- 14. Python 2.7 argparse
- 15. Dodaj nową akcję na trasie
- 16. python argparse: nierozpoznane argumenty
- 17. Python argparse wymagania warunkowe
- 18. Python argparse argument z cytatami
- 19. Jak utworzyć python argparse wzajemnie wykluczające argumenty grupy bez prefiksu?
- 20. Dodaj argument do argumentów następnie zastosuj
- 21. Python: Sprawdzanie poprawności podczas sprawdzania argumentów
- 22. Python argparse ignoruje nierozpoznane argumenty
- 23. Python - Dodaj znaczniki ID3 do pliku mp3 bez znaczników
- 24. pyton argparse: arg bez flagi
- 25. Dodaj akcję niestandardową w Rails Admin
- 26. Dodaj niestandardową akcję do obiektu wbudowanego Django w interfejsie administratora
- 27. Python: Dodaj listę do ustawienia?
- 28. python - dodaj ciasteczko do cookiejar
- 29. OptionParse bez argumentów pokaż banner
- 30. Python argparse: W jaki sposób mogę osobno pobrać obiekty Namespace dla grup argumentów?
Dzięki! Jeśli spojrzysz na połączony kod: http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374 zobaczysz, że chcę parsowanie odbywa się automatycznie - nie chcę dodawać logiki poza parserem. Żaden inny sposób ? Czy mogę dodać argument "quit" do głównego parsera (bez '-quit')? edit: [github] (https://github.com/Utumno/psync/blob/master/watcher/cli.py) –
Sure - podklasa 'ArgumentParser', która redefiniuje' parse_args'. Najpierw wywołałoby to 'super() .parse_args' (lub' parse_known_args'), a następnie wykonało "logikę poza parserem". Tylko ty wiesz dokładnie, co kryje się za tą definicją metody. – hpaulj
Dodałem metodę, używając opcjonalnego argumentu postionalnego. – hpaulj