I'm not a huge fan of the argparse library that ships with Python.
Personally, I much prefer typer or click.
But argparse
is often used so this is my approach in bringing at least attribute autocompletion to the argparse library.
Let us take a look at the official documentation and use their examples:
import argparse
parser = argparse.ArgumentParser(
prog = 'ProgramName',
description = 'What the program does',
epilog = 'Text at the bottom of help')
parser.add_argument('filename') # positional argument
parser.add_argument('-c', '--count') # option that takes a value
parser.add_argument('-v', '--verbose',
action='store_true') # on/off flag
args = parser.parse_args()
print(args.filename, args.count, args.verbose)
Why isn't the argparse.ArgumentParser
a container class, like a dataclass?
So my approach to solve this looks like this:
from aaargs import ArgumentParser, Argument
class MyParser(ArgumentParser):
rog = "ProgramName"
description = "What the program does"
epilog = "Text at the bottom of help"
# You can define arguments directly
filename = Argument(positional=True) # positional argument
encoding = Argument() # keyword argument '--encoding'
# or pass the 'name_or_flags' argument
count = Argument("-c", "--count")
verbose = Argument("-v", "--verbose", action="store_true")
# annotations are also supported for boolean arguments
debug: bool = Argument() # --debug with action="store_true"
parser: argparse.ArgumentParser = MyParser.get_parser()
args: MyParser = MyParser.parse_args()
You can also print the parser just like the original:
args = MyParser.parse_args(
["README.md", "--encoding", "utf-8", "-c", "3", "--debug"]
)
print(args)
>>> MyParser(count='3', debug=True, encoding='utf-8', filename='README.md', verbose=False)
print(args.encoding) # this will autocomplete 🎉
>>> "utf-8"
You can also create a Parser using keyword arguments if you prefer (I don't):
from aaargs import ArgumentParser
class MyParser(
ArgumentParser,
prog="ProgramName",
description="What the program does",
epilog="Text at the bottom of help",
):
...