https://github.com/fresh2dev/yapx
The next generation of Python's Argparse.
https://github.com/fresh2dev/yapx
cli parser python tui
Last synced: 9 months ago
JSON representation
The next generation of Python's Argparse.
- Host: GitHub
- URL: https://github.com/fresh2dev/yapx
- Owner: fresh2dev
- License: mit
- Created: 2023-06-05T06:36:05.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-01-02T05:59:04.000Z (about 2 years ago)
- Last Synced: 2025-04-26T19:48:53.628Z (9 months ago)
- Topics: cli, parser, python, tui
- Language: Python
- Homepage: https://www.f2dv.com/r/yapx
- Size: 1000 KB
- Stars: 8
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
Yapx
The next generation of Python's Argparse.
Documentation
| Slide Deck
| Git Repo
*Yapx* is "Yeah, Another Argparse eXtension", a Python library for creating tools with type-safe command-line interfaces (CLIs) -- and even textual user interfaces (TUIs) -- by analyzing type-hints of functions and dataclasses.
> Yeah, Another?
I intended to publish this package as simply `apx`, but PyPi didn't allow it, so I tacked on the *y* to make \*`yapx`\*. The nomenclature "*Yet Another*" seems demeaning considering what this package is capable of.
So, *Yeah, Another Argparse eXtension* :punch:
Think about the repetitive steps involved in creating a command-line application.
1. Define function(s).
2. Define the command-line interface; i.e., build the `ArgumentParser`.
3. Parse arguments.
4. Call the appropriate function(s).
For example:
```python
from argparse import ArgumentParser
# 1. Define function(s).
def say_hello(name: str = 'World'):
print(f"Hello {name}")
# 2. Define the command-line interface.
parser = ArgumentParser()
parser.add_argument("--name", default="World")
# 3. Parse arguments.
parsed_args = parser.parse_args()
# 4. Call the appropriate function(s).
say_hello(name=parsed_args.name)
```
Yapx combines these steps into one:
```python
import yapx
def say_hello(name: str = 'World'):
print(f"Hello {name}")
yapx.run(say_hello)
```
Yapx is a superset of Python's native Argparse `ArgumentParser`, so you can make use of the high-level abstractions or do the low-level work you're familiar with. Either way, Yapx provides benefits including:
- :lock: Type-casting and validation, with or without [*Pydantic*](https://docs.pydantic.dev).
- :question: Automatic addition of "*helpful*" arguments, including `--help`, `--help-all`, `--version`, and most impressively `--tui`.
- :heart: Prettier help and error messages.
- :zap: Command-line autocompletion scripts.
Yapx is among several modern Python CLI frameworks, including [*Typer*](https://github.com/tiangolo/typer) and [*Fire*](https://github.com/google/python-fire). Distinguishing characteristics of Yapx include:
- :package: No 3rd-party dependencies required (but can be opted into)
- :lock: Type-safe argument validation
- :spider_web: Infinitely-nested commands
- :tv: Display your CLI as a TUI
- :question: Handling of unknown arguments using `*args` and `**kwargs`
- :bulb: Most intuitive
- :sweat: Least documented
I'd appreciate a more analytical comparison between Yapx and the array of Python CLI frameworks, but that's too ambitious of a goal right now :grimacing:
## Install
```
pip install 'yapx[extras]'
```
Or, to install without 3rd-party dependencies:
```
pip install yapx
```
## Use
---
[](https://www.f2dv.com/r/yapx/license/)
[](https://www.f2dv.com/r/yapx/changelog/)
[](https://www.f2dv.com/r/yapx/changelog/)
[](https://star-history.com/#fresh2dev/yapx&Date)