Skip to main content

arguably logo

turns functions into command line interfaces

Test status Code coverage Supported Python versions PyPI version


arguably solves this problem:

  1. You've written a Python script
  2. Now you want to pass in parameters from the command line
  3. You don't want to read the docs for your favorite argument parsing library again

By leveraging as many Python idioms as possible, arguably keeps its API small and memorable without sacrificing funcitonality. arguably uses functions and their docstrings to automatically set up argparse. Notably, arguably maps your function signature to a command-line interface like this:

@arguably.command
def some_function(required, not_required="foo", *others, option="bar"):
    ...

becomes

usage: script [--option OPTION] required [not-required] [others ...]

In short, arguably turns your function's positional parameters into positional command-line arguments, and your function's keyword-only arguments into command-line options. From the example above:

Name Type Becomes Usage
required positional, no default value required positional arg required
not_required positional, with default value optional positional arg [not-required]
others positional, variadic (like *args) the rest of the positional args [others ...]
option keyword-only argument an option [--option OPTION]

arguably also enables you to easily add subcommands - just annotate more than one function with @arguably.command. You can even have nested subcommands (more on that later).

arguably reads type annotations and automatically converts arguments to the declared types. It has smart handling for tuple, list, enum.Enum, and enum.Flag. There are also a few special behaviors you can attach to a parameter via Annotated[] and the arguably.arg.* functions.

arguably parses docstrings to generate descriptions for your commands and parameters. If you want to give a parameter the alias -X, prefix its docstring description with [-X]. Wrapping a word in {} changes the metavar that gets printed (this is what's shown in the usage string after an option name, don't worry if you aren't familiar with this). For example:

#!/usr/bin/env python3
"""docstrings for the file become the description for the script."""
__version__ = "1.0.0"  # You can also set `version_flag=True` to add a version flag, it will read `__version__`

import arguably

@arguably.command(alias="h")
def hello(name: str, *, lastname: str | None = None):
    """
    says hello to you
    :param name: your name
    :param lastname: [-l] your {surname}
    """
    full_name = name if lastname is None else f"{name} {lastname}"
    print(f"Hello, {full_name}!")

@arguably.command(alias="g")
def goodbye(name: str, *, is_sad: bool = False):
    """
    says goodbye to you
    :param name: your name
    :param is_sad: [-s] whether or not it's sad to see you go
    """
    print(f"Goodbye, {name}!")
    if is_sad:
        print(f"It's sad to see you go!")

if __name__ == "__main__":
    arguably.run(version_flag=True)

becomes

user@machine:~$ python3 script.py
usage: test_scripts.docs2 [-h] [--version] command ...

docstrings for the file become the description for the script.

positional arguments:
  command
    hello (h)    says hello to you
    goodbye (g)  says goodbye to you

options:
  -h, --help     show this help message and exit
  --version      show program's version number and exit


user@machine:~$ python3 script.py hello --help
usage: test_scripts.docs2 hello [-h] [-l SURNAME] name

says hello to you

positional arguments:
  name                    your name

options:
  -h, --help              show this help message and exit
  -l, --lastname SURNAME  your surname (default: None)

More docs coming soon...

Metadata

Release files for arguably 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for arguably 1.0.2
File Size Uploaded
arguably-1.0.2.tar.gz 21.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for arguably 1.0.2
File Interpreter ABI Platform
arguably-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 42.9 kB

Release files / arguably-1.0.2.tar.gz

Download URL arguably-1.0.2.tar.gz
Size 21.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c060cf44bc07441c9fd89ec6170a09c2afcf113ec5821c865316efe1cab0d082
BLAKE2b-256 checksum
How to use checksums
20965ab8b5822ed9a711a2b21318de1a7330ca40081f8950685c26d71219e2f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.11.3 Linux/5.15.0-1039-azure

Release files / arguably-1.0.2-py3-none-any.whl

Download URL arguably-1.0.2-py3-none-any.whl
Size 21.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b1ed6370ea76724d2e5b9a53e6114739139f54a62df9dc6f88a3b30c335d21d2
BLAKE2b-256 checksum
How to use checksums
7673538f84f3bafa7f56f4b2515569753231e46959914a0d256f610e9a4cb1a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.11.3 Linux/5.15.0-1039-azure

Release history Release notifications | RSS feed

1.3.0

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

This release

1.0.2 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page