ArgParse - Sub-Parsers gruppieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisB
User
Beiträge: 12
Registriert: Sonntag 13. Februar 2022, 13:27

Hallo,

ich bin gerade dabei ein kleines Tool für mich zu konzeptualisieren und stecke etwas fest bei den Überlegungen meiner Command Line Commands:
Aktuell habe ich es so mir vorgestellt:

Code: Alles auswählen

- Group 1: Load Data Sheet
	- Argument: --load (DIR)
- Group 2: Contracts Manager: 
	- Arguments: --contracts
		- Sub-Arguments
			- --list
			- --insert (NAME, CATEGORY [bereits vorgeschriebene Werte], DATE, AMOUNT --> all required)
			- --delete (ID)
			- --update (ID, NAME, CATEGORY [Optional values], DATE, AMOUNT --> all required)
			- --check
- Group 3: Plots: 
	- Argument --plot
		- Sub-Arguments
			- --total
			- --category (CATEGORY=optional) (TIMESPAN=optional)
Es soll also folgende Commands möglich sein:

Code: Alles auswählen

myscript.py --load [DIR]  	# Load Sheets
myscript.py --contracts --list  	# List all contracts
myscript.py --contracts --insert 	(NAME) (CATEGORY) (DATE) (AMOUNT) 	# Insert contract entry
myscript.py --contracts --delete (ID)  	# delete contract entry
myscript.py --contracts --update (ID) (NAME) (CATEGORY) (DATE) (AMOUNT)  # update contract entry
myscript.py --contracts --check   	# show upcoming contracts 
myscript.py --plot --total  	# show financial situation
myscript.py ---plot --category (CATEGORY) (TIMESPAN)
Ist die oben beschriebene Überlegung so korrekt zu den hier stehenden Commands?
Also insbesondere, dass --load, --contracts, --plot Argumente darstellen und die anderen, wie oben beschrieben Sub Arguments und das alles dann in Gruppen gesammelt werden?

Mein Versuch sieht aktuell so aus:

Code: Alles auswählen

import logging
import pprint
from typing import Optional
from typing import Sequence
import argparse

logger = logging.getLogger('__main__')


def main(argv: Optional[Sequence[str]] = None) -> int:
    parser = argparse.ArgumentParser(
        prog='BudgetManager',
        add_help=True,
        description='An program to evaluate Finanzguru sheet ')

    group_load = parser.add_argument_group('Load')
    group_load.add_argument(
        '-l', '--load',
        nargs='?',
        type=argparse.FileType('r'),
        metavar='Path',
        help='Refresh database with new sheet')

    group_contracts = parser.add_argument_group('Contracts Management')
    group_contracts.add_argument(
        '-c', '--contracts',
        help='Manage your contracts')

    group_contracts = parser.add_argument_group('Plot')
    group_contracts.add_argument(
        '-p', '--plot',
        help='Plot your financial situation')

    args = parser.parse_args(argv)
    pprint.pprint(vars(args))
    return 0


if __name__ == '__main__':
    exit(main())



Ich frage mich dann aber auch, wie Sub Arguments gruppiert werden?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast keine Gruppen, sondern sub-Parser. Die gibt man ohne die -- an.

Code: Alles auswählen

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='sub-command help', dest='cmd')
parser_load = subparsers.add_parser('load', help='Load data sheet')
parser_load.add_argument('sheet', help='the sheet filename')
parser_contracts = subparsers.add_parser('contracts', help='Contracts Manager')
contracts_subparsers = parser_contracts.add_subparsers(help='sub-command help', dest='contracts_cmd')
parser_list = contracts_subparsers.add_parser('list', help='List')
parser_insert = contracts_subparsers.add_parser('insert', help='Insert')
parser_insert.add_argument('name')
parser_insert.add_argument('category')
parser_insert.add_argument('date')
parser_insert.add_argument('amount')
Antworten