Skip to main content

FunCLI

Supported Python versions Build status Coverage Downloads License

Automatically generate a simple CLI.

Installation

uv add funcli

Basic Usage

def main(*args: int):
	"""
		Adds numbers together.
		
		:param args: some numbers
	"""
	print("Sum:", sum(args))

if __name__ == '__main__':
	import funcli
	funcli.main()

# $ python sum.py 1 2 3
# Sum: 6

--help is autogenerated by the backend (argparse):

$ python sum.py -h
usage: sum.py [-h] [args [args ...]]

Adds numbers together.

positional arguments:
	args        some numbers

optional arguments:
	-h, --help  show this help message and exit

Advanced Usage

def foo(): pass
def bleep(): pass
async def bloop_it(a, second_arg: int = 0, *c: str, d: list[float] | None = None):
	print("Args:", a, second_arg, c, d)

if __name__ == '__main__':
	import funcli
	funcli.main({ 'foo': foo, 'bar': { bleep, bloop_it } })

# $ python advanced.py bar bloop-it arg0 c0 c1 --second-arg=987 --d 42 -0.3
# Args: arg0 987 ('c0', 'c1'), [42, -0.3]

Note that underscores in variable and function names are automatically converted to dashes in the command-line argument (second_arg -> --second-arg). You can disable this by passing dash = False to funcli.main or funcli.run.

Reference

funcli.main(spec = None, converters = None, dash = True)

Sugar. spec defaults to the main function from the caller's scope. Calls funcli.run on spec, and calls sys.exit with the return value. converters is a mapping from types (or whatever you want to use as annotations) to a function that parses a command-line argument. If dash == True, underscores in Python parameters will be changed to dashes in the corresponding command-line arguments.

funcli.run(spec, args = None, converters = None, dash = True)
  • spec is either a callable, a sequence of callables, or a dict mapping strings to nested specs
  • args default to sys.argv[1:]
  • converters is a mapping from types (or whatever you want to use as annotations) to a function that parses a command-line argument
  • if dash == True, underscores in Python parameters or function names will be changed to dashes in the corresponding command-line arguments

Given functions foo, bar, baz, here are some sample invocations:

funcli.run(foo, ['arg0']) # Calls foo('arg0')
funcli.run({ foo, bar }, ['bar', 'arg0']) # Calls bar('arg0')
funcli.run({ 'beep': foo, 'bloop': [bar, baz] }, ['beep', 'arg0']) # Calls foo('arg0')
funcli.run({ 'beep': foo, 'bloop': [bar, baz] }, ['bloop', 'bar', 'arg0']) # Calls bar('arg0')

bool arguments

Non-optional bool values should be passed as True and False on the command line. Optional bool values, on the other hand, must be omitted.

def f(warnings: bool = False): ...
funcli.run(f, ['--warnings']) # f(warnings = True)

Note: currently, if the default value is True, there is no way to pass False.

Converters

Built-in converters handle int, float, bool, and pathlib.Path. Unannotated args are kept as a str. Basic sequence types (list[T], set[T], tuple[T, ...], Iterable[T], Sequence[T]) are supported, but only as optional arguments, e.g.:

def f(mylist: List[int] = []): ...
funcli.run(f, ['--mylist', '1', '2']) # f([1, 2])

Optionals (T | None) are supported, but there's currently no way to explicitly pass None values.

Notes

Because of argparse limitations:

  • **kwargs aren't supported; if your function has them, they'll always be empty
  • optional arguments cannot be positional; f(a = 'default') has to be invoked as python foo.py --a=nondefault

Prior art

Metadata

Release files for funcli 0.9.0

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

Built distribution (wheel)

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

Release files / funcli-0.9.0-py3-none-any.whl

Download URL funcli-0.9.0-py3-none-any.whl
Size 6.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
836f4c7042f45bd9bf49d1e04c2fb4c3b40c399f2e151bb9468f187349627ca4
BLAKE2b-256 checksum
How to use checksums
af19951a2496d92764a58acdb9c1b44e072a165f5761aa6fcbabb74e27693bd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release history Release notifications | RSS feed

This release

0.9.0 This release

1 release file

0.8.1

1 release file

0.8.0

1 release file

0.7.1

1 release file

0.7.0

1 release file

0.6.2

1 release file

0.6.1

1 release file

0.6.0

1 release file

0.5.0

1 release file

0.4.0

1 release file

0.3.0

1 release file

0.2.0

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

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