26
submitted 1 year ago* (last edited 1 year ago) by bloopernova@programming.dev to c/programming@programming.dev

This is solved, I was being dumb. Please see second EDIT below

This isn't really language specific, but if it helps I'm using Python. I can get the parameters just fine with the Traitlets module, but I'm still a novice really and figuring out which patterns to use is challenging.

Say you have a bunch of command line parameters. Some are booleans, where their presence means True, absence means False. Other parameters must accept one text string, and others can be used multiple times to build a list of strings.

It feels inefficient/wrong to use a bunch of IF/THEN/ELSE statements to decide what to do with the parameters, and prone to edge case errors. Is there a pattern that would invoke the correct method based on the combination of input parameters?

Examples:

app thing --dry-run --create --name=newname01 --name=newname02 --verbose

app thing --create --name=newname01 --name=newname02 --name=newname03

app job --cancel -i 01 -i 02 -i 03

EDIT: Via the Traitlets module, I get those arguments parsed and accessible as self.argname, so getting them into my app is working great. It's just deciding what to do with them that is confusing me.

Thank you, sorry for my noobness.

EDIT2: I think I understand where I'm going wrong:

I'm creating subcommands based on objects, not actions. i.e. appname thing --action should really be appname action --thing. Once things are divided up into actions, assigning things to those actions will be much, much easier and straightforward.

Sorry for a confusing and fairly pointless post :(

you are viewing a single comment's thread
view the rest of the comments
[-] nickwitha_k@lemmy.sdf.org 18 points 1 year ago

As a few others mentioned, the argparse module from the stdlib is the way to go for Python. It takes care of most of this for you in an optimized way. Here's a minimal example of the above:

#!/bin/env python3

import argparse


# Setup main parser
parser = argparse.ArgumentParser(
    prog="app",
    description="App that manages things and jobs",
)
parser.add_argument(
    "-v",
    "--verbose",
    action="store_true",
)
subparsers = parser.add_subparser(
    help="Sub commands",
    dest="command",
)

# Setup sub-parsers
thing_parser = subparsers.add_parser(
    "thing",
    help="Manage things",
)
# thing_parser args
thing_parser.add_argument(
    "--dry_run",
    action="store_true",
    help="dry run",
)
thing_parser.add_argument(
    "--create",
    action="store_true",
    help="Create thing",
)
thing_parser.add_argument(
    "--name",
    action="store",
    type=str,
    required=True,
    nargs="+",
    help="Thing name",
)

job_parser = subparsers.add_parser(
    "job",
    help="Manage jobs",
)
job_parser.add_argument(
    "--cancel",
    "-c",
    action="store_true",
    help="Cancel job",
)
job_parser.add_argument(
    "--index",
    "-i",
    action="store",
    type=int,
    required=True,
    nargs="+",
    help="Job index",
)


def main():
    args=parser.parse_args()
    if args.verbose:
        print("Verbose mode")
    # Match-Case statement for cleaner logic
    match args.command:
        case "thing":
            # thing logic and function calls here
        case "job":
            # job logic and function calls here
        case _:
            parser.print_usage()

if __name__ == "__main__":
    main()
load more comments (4 replies)
this post was submitted on 23 Aug 2023
26 points (93.3% liked)

Programming

17028 readers
205 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 1 year ago
MODERATORS