Seite 1 von 1

ArgParse - Sub-Parsers gruppieren

Verfasst: Montag 28. Februar 2022, 22:12
von ChrisB
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?

Re: ArgParse - Sub-Parsers gruppieren

Verfasst: Montag 28. Februar 2022, 22:31
von Sirius3
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')