Skip to main content

turns functions into command line interfaces

Project description

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...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arguably-1.0.2.tar.gz (21.1 kB view details)

Uploaded Source

Built Distribution

arguably-1.0.2-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file arguably-1.0.2.tar.gz.

File metadata

  • Download URL: arguably-1.0.2.tar.gz
  • Upload date:
  • Size: 21.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.11.3 Linux/5.15.0-1039-azure

File hashes

Hashes for arguably-1.0.2.tar.gz
Algorithm Hash digest
SHA256 c060cf44bc07441c9fd89ec6170a09c2afcf113ec5821c865316efe1cab0d082
MD5 d8bc0a8a8bfb1ada473704616aaddf6b
BLAKE2b-256 20965ab8b5822ed9a711a2b21318de1a7330ca40081f8950685c26d71219e2f4

See more details on using hashes here.

File details

Details for the file arguably-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: arguably-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 21.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.11.3 Linux/5.15.0-1039-azure

File hashes

Hashes for arguably-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b1ed6370ea76724d2e5b9a53e6114739139f54a62df9dc6f88a3b30c335d21d2
MD5 64a6c224c7b6ef5509ceeea91c1c51f8
BLAKE2b-256 7673538f84f3bafa7f56f4b2515569753231e46959914a0d256f610e9a4cb1a9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page