python function to command translator
Project description
A tiny Converter that making executable command script from python function. If the function is type annotated, it is also used.
Please using as_command() decorator.
as_command()
greeting.py
from handofcats import as_command
@as_command
def greeting(message: str, is_surprised: bool = False, name: str = "foo") -> None:
"""greeting message"""
suffix = "!" if is_surprised else ""
print("{name}: {message}{suffix}".format(name=name, message=message, suffix=suffix))
$ python greeting.py -h
usage: greeting.py [-h] [--expose] [--is-surprised] [--name NAME] message
greeting message
positional arguments:
message
optional arguments:
-h, --help show this help message and exit
--expose
--is-surprised
--name NAME
$ python greeting.py hello
foo: hello
$ python greeting.py --is-surprised hello
foo: hello!
$ python greeting.py --is-surprised --name=bar bye
bar: bye!
(TODO: detail description)
–expose
calling with –expose option, generationg the code that dropping dependencies of handofcats module.
$ python greeting.py --expose
def greeting(message: str, is_surprised: bool = False, name: str = "foo") -> None:
"""greeting message"""
suffix = "!" if is_surprised else ""
print("{name}: {message}{suffix}".format(name=name, message=message, suffix=suffix))
def main(argv=None):
import argparse
parser = argparse.ArgumentParser(description='greeting message')
parser.print_usage = parser.print_help
parser.add_argument('message')
parser.add_argument('--is-surprised', action='store_true')
parser.add_argument('--name', default='foo', required=False)
args = parser.parse_args(argv)
greeting(**vars(args))
if __name__ == '__main__':
main()
–inplace
With inplace option, when –expose, overwrite target source.
handofcats command
sum.py
def sum(x: int, y: int) -> None:
print(f"{x} + {y} = {x + y}")
It is also ok, calling the function that not decorated via handofcats command.
$ handofcats sum.py:sum 10 20
10 + 20 = 30
$ handofcats sum.py:sum -h
handofcats sum.py:sum -h
usage: handofcats [-h] [--expose] x y
positional arguments:
x
y
optional arguments:
-h, --help show this help message and exit
--expose
experimental
sequences
from typing import List, Optional
def psum(xs: List[int], *, ys: Optional[List[int]] = None):
# treated as
# parser.add_argument('xs', nargs='*', type=int)
# parser.add_argument('--ys', action='append', required=False, type=int)
..
choices
from typing_extensions import Literal
DumpFormat = Literal["json", "csv"] # this: (experimental)
def run(*, format: DumpFormat = "json"):
# treated as
# parser.add_argument("--format", defaul="json", choices=("json", "csv"), required=False)
...
2.4.0
some refactoring
use magicalimport for reducing code
use fastentrypoint for fast bootstrap time editable installed
2.3.2
fix, with Literal Types, detect type is failed
2.3.1
fix, choices’s type is list, not dict
2.3.0
support Literal types
fix, error is occured, running with from __future__ import annotations
fix, generated code is invalid when positional arguments with “_”
fix, unable to use the function named “main”
–typed option, with –expose
2.2.0
–inplace option, with –expose
2.1.0
choices function
fix bug that it is not working, importing with physical filepath
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file handofcats-2.4.0-py3-none-any.whl
.
File metadata
- Download URL: handofcats-2.4.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.31.1 CPython/3.8.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f18af14e390ee8c64b3d1775523dbf9add7013504de78c9730c813c92d4ecc45 |
|
MD5 | e063ffd106a78e761e7cfa8755865e04 |
|
BLAKE2b-256 | 1331e9e1eef6464e5a3bce9ecc55ffc1d104085734f37d44d35beeddc01df70c |