argparse-deco is basically syntatic sugar for argparse using decorators. Although it inherited some ideas and concepts from Kevin L. Mitchell’s cli_tools (https://github.com/klmitch/cli_tools), it does not share its source code.
Its main difference is the possibility to abuse Python’s class syntax to define complex CLI tools with nested subcommands and the use of inspect.signature to autogenerate a command’s arguments from a function’s signature.
Simple CLI
The API suffices to use three imports.
>>> from argparse_deco import CLI, Arg, Flag
An an example for a simple CLI, one may use CLI as decorator for a function in order to transform it:
>>> @CLI(prog="prog")
... def prog(
... integers: Arg(metavar='N', nargs='+', type=int,
... help="an integerfor the accumulator"),
... accumulate: Arg('--sum', action='store_const', const=sum,
... help="sum the integers (default: find the max)"
... )=max):
... """Process some integers."""
... print(accumulate(integers))
The decorator CLI transforms the function prog into an Command instance. Effectively prog takes some command line argument like [ “1”, “2”, “4”, “–sum” ] as cli_args keyword, which is transformed by the argparse module into arguments integer and accumulate passed down to the original function prog:
>>> prog(["1", "2", "4", "--sum"]) 7 >>> prog(["1", "2", "4"]) 4
In order to obtain the ArgumentParser instance, prog has the class method setup_parser:
>>> parser = prog.setup_parser() >>> print(parser) ArgumentParser(prog='prog', usage=None, description='Process some integers.', formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) >>> parser.print_usage() usage: prog [-h] [--sum] N [N ...]
>>> parser.print_help() usage: prog [-h] [--sum] N [N ...] <BLANKLINE> Process some integers. <BLANKLINE> positional arguments: N an integerfor the accumulator <BLANKLINE> optional arguments: -h, --help show this help message and exit --sum sum the integers (default: find the max)
Arguments
In order for a function’s arguments to be processed as ArgumentParser argument, they have to annotated by Arg. Basically Arg allows a the type as keyword, and arbitrary keyword arguments which are passed almost unchanged to ArgumentParser.add_argument.
Parser
While the ArgumentParser instance’s description is usually the function’s docstring, one may want to further customise it using the CLI.parser decorator which accepts any argument ArgumentParser would.
Groups
Arguments can be groupsed by using the Group instead of Arg in the argument’s annotation, which accepts a group name as first keyword and the type as second one. The group can be customised (title, description) using the CLI.group decorator:
>>> @CLI("prog")
... @CLI.group('foo', title="Foo", description="Foo group")
... def prog(
... bar: Arg['foo'](help="Bar option"),
... baz: Arg['foo'](help="Baz option")):
... pass
>>> prog.setup_parser().print_help()
usage: prog [-h] bar baz
<BLANKLINE>
optional arguments:
-h, --help show this help message and exit
<BLANKLINE>
Foo:
Foo group
<BLANKLINE>
bar Bar option
baz Baz option
Similarily using the CLI.mutually_exclusive decorator, arguments can be turned into a mutually exclusive group.
Subcommands
>>> @CLI("prog")
... @CLI.subparsers(help="sub-command help")
... class prog:
... def __call__(foo: Flag('--foo', help="foo help")):
... pass
... def a(bar: Arg(type=int, help="bar help")):
... """a help"""
... def b(baz: Arg('--baz', choices='XYZ', help="baz help")):
... """b help"""
>>> prog.parser.print_help()
usage: prog [-h] [--foo] {a,b} ...
<BLANKLINE>
positional arguments:
{a,b} sub-command help
a a help
b b help
<BLANKLINE>
optional arguments:
-h, --help show this help message and exit
--foo foo help
>>> prog.parser.parse_args(['a', '12']) Namespace(_func=<function prog.a at 0x...>, _parser=..., bar=12, foo=False) >>> prog.parser.parse_args(['--foo', 'b', '--baz', 'Z']) Namespace(_func=<function prog.b at 0x...>, _parser=..., baz='Z', foo=True)
Deeper levels of subcommands can be generated using class definitions within:
>>> @CLI("prog")
... class prog:
... class foo:
... """foo subcommand"""
... def bar():
... """foo bar subsubcommand"""
... def baz():
... """foo baz subsubcommand"""
... class oof:
... def rab():
... """oof rab subsubcommand"""
... def zab():
... """oof zab subsubcommand"""
>>> prog.parser.print_help()
usage: prog [-h] {foo,oof} ...
<BLANKLINE>
positional arguments:
{foo,oof}
foo foo subcommand
<BLANKLINE>
optional arguments:
-h, --help show this help message and exit
Metadata
Release files for argparse-deco 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| argparse-deco-0.6.0.tar.gz | 20.9 kB | Without provenance | Details for argparse-deco-0.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| argparse_deco-0.6.0-py3-none-any.whl | Python 3 | none | any | Details for argparse_deco-0.6.0-py3-none-any.whl |
Total release size: 44.1 kB
Release files / argparse-deco-0.6.0.tar.gz
| Download URL | argparse-deco-0.6.0.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7c838efc0ba6c51835942e0d158738c59a13f4fa36dd75394cb4b9a31f4414f8
|
|
BLAKE2b-256 checksum How to use checksums |
0097d4526806355b8d2bdf056565580fdc3716b8ba2effbb2448625aab167c5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/2.0.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.7.5
|
Release files / argparse_deco-0.6.0-py3-none-any.whl
| Download URL | argparse_deco-0.6.0-py3-none-any.whl |
|---|---|
| Size | 23.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
27360fff90e80ff122d0383db23ba1076119fa66e96aae936ed9acc1c7a219ba
|
|
BLAKE2b-256 checksum How to use checksums |
83cbbc8eb24290d79eb2195465c4b6cd1868be572493064e87f988bf36ac5c39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/2.0.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.7.5
|
Security for argparse-deco 0.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.