Skip to main content

A tiny opinionated Python library for parsing script options.

Project description

quickopts

Tiny opinionated Python library for parsing script options.

Overview

quickopts parses POSIX getopts-style command-line arguments from the same docstring you use for help text. It supports:

  • single-letter options, with clustering, so -Cz behaves like -C -z and -Czbmain behaves like -C -z -b main;
  • positional arguments, where the first positional argument stops option parsing, plus -- to stop option parsing explicitly.

It is intentionally small and does not support long options like --flag, optional flag values, or validation of Synopsis: patterns.

Sample usage

quickopts works well for single-file scripts using PEP 723 inline dependency metadata. Tools such as uv can read the script header, create an environment with quickopts installed, and then run the file directly from its shebang.

#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = [
#   "quickopts",
# ]
# ///

"""A cool tool

Synopsis:
  $prog [-L]
  $prog -C [-zb BRANCH]
  $prog -D VAL
  $prog -W [--] [ARGS...]

Commands:
  -C  Create a value.
  -D  Delete a value.
  -L  List all the values.
  -W  Wrap a command.
  -h  Show this message and exit.

Options:
  -b BRANCH  Name of the value's branch.
  -z         Sleep for a little while first.
"""

import quickopts


if __name__ == "__main__":
    q = quickopts.parse_or_exit(__doc__, program_var="prog")
    match q.command or "L":
        case "C": _create(branch=q.flags["b"], sleep="z" in q.switches)
        case "D": _delete(q.args[0])
        case "L": ...
        case "W": ...

Parsing rules

quickopts reads option definitions from Commands: and Options: sections in the docstring. Blank lines end the current section. Synopsis: is not parsed; it is only help text.

Command entries define mutually exclusive commands. We recommend using uppercase letters for these, other than the standard -h help command:

Commands:
  -C  Create a value.
  -L  List all values.
  -h  Show help.

Option entries define either value flags or switches. In Options:, an entry is a value flag when non-whitespace text appears between the option name and the two-or-more-space gap before the description. Otherwise it is a switch. We recommend lowercase letters in this section:

Options:
  -b BRANCH  Value flag.
  -z         Switch.

parse(doc, args) parses args without a program name and returns a Parsed object with the following attributes:

  • command: the selected command, or None;
  • flags: value flags, for example {"b": "main"};
  • switches: switch repeat counts, for example {"z": 2}; use "z" in q.switches to check presence;
  • args: remaining positional arguments.

Single-dash options use POSIX getopts-style clustering:

Args Result
-Cz command C, switch z
-Cb main command C, flag b=main
-Czbmain command C, switch z, flag b=main
value -z args ["value", "-z"]; -z is not parsed
-- -z args ["-z"]; -z is not parsed

When a value flag appears inside a cluster, it consumes the rest of that token as its value. If no characters remain, it consumes the following arg. Repeated value flags use the last value. Repeated switches are counted.

parse_or_exit(doc, program_var="prog") reads sys.argv, prints parse errors to stderr with exit code 2, and handles -h by printing the docstring and exiting with code 0.

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

quickopts-0.3.1.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

quickopts-0.3.1-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file quickopts-0.3.1.tar.gz.

File metadata

  • Download URL: quickopts-0.3.1.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quickopts-0.3.1.tar.gz
Algorithm Hash digest
SHA256 dffb553dda61d98a8bdd51613182e17ac10da18f0a9303db37dfdb49918777c0
MD5 ecd33703c8479c0d05c04bea4de8cd64
BLAKE2b-256 c98d7682e6c079a46d7a93c80e23bd6af8c5e2eab7def6ad6de7dcb2be3ace73

See more details on using hashes here.

Provenance

The following attestation bundles were made for quickopts-0.3.1.tar.gz:

Publisher: ci.yaml on mtth/quickopts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file quickopts-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: quickopts-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 6.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quickopts-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3ebb19378affd7fe8f4565edba467cb1c3372270d3097533b511971d89fae4e8
MD5 806626304ce92065028b6d42385532be
BLAKE2b-256 cc6ef759707f66742fba8f663b93bc2dcac7850dc7895ed5722f9b620dbb39c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for quickopts-0.3.1-py3-none-any.whl:

Publisher: ci.yaml on mtth/quickopts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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