A dead simple utility for defining decorators with parameters that make type checkers happy.
Project description
Paramorator
A dead simple utility for defining decorators with parameters that make type checkers happy.
Installation
pip install paramorator
Usage
from typing import Callable, ParamSpec
from paramorator import paramorator
P = ParamSpec("P")
@paramorator
def multiply(func: Callable[P, float], factor: float = 2) -> Callable[P, float]:
def wrapper(*args: P.args, **kwargs: P.kwargs) -> float:
return factor * func(*args, **kwargs)
return wrapper
@multiply(factor=3)
def add_then_triple(a: float, b: float) -> float:
return a + b
assert add_then_triple(2, 3) == 15
# also supports inline usage
sub_then_double = multiply(lambda a, b: a - b, factor=2)
assert sub_then_double(5, 3) == 4
This isn't exactly rocket science, but to achieve the same result without paramorator,
you need to write a bunch boilerplate code just to satisfy your type checker. Here is
the equivalent multiple decorator written without paramorator:
from typing import Any, ParamSpec, Callable, overload, cast
P = ParamSpec("P")
@overload
def multiply(func: Callable[P, float], /, factor: float = ...) -> Callable[P, float]:
...
@overload
def multiply(func: None = ..., /, factor: float = ...) -> Callable[[Callable[P, float]], Callable[P, float]]:
...
def multiply(
func: Callable[P, float] | None = None,
/,
factor: float = 2,
) -> Callable[P, float] | Callable[[Callable[P, float]], Callable[P, float]]:
def decorator(func: Callable[P, float]) -> Callable[P, float]:
def wrapper(*args: P.args, **kwargs: P.kwargs) -> float:
return factor * func(*args, **kwargs)
return wrapper
return decorator(func) if func else decorator
Development
Install flit and run:
flit install
To run tests:
python tests.py
Check the types with Pyright:
pyright paramorator.py tests.py
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 Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file paramorator-1.0.2.tar.gz.
File metadata
- Download URL: paramorator-1.0.2.tar.gz
- Upload date:
- Size: 4.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.32.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e034ef97edb2debbe7f155b9204195864dc141682c3f01fa59ef89c3b79d24e
|
|
| MD5 |
19a1b219903aaa2d595eb6cf78c50c93
|
|
| BLAKE2b-256 |
7a0477c18d2d2c68d5b3af85f1d4952ca4d8f8ecded9c27fe203418f848dc76a
|
File details
Details for the file paramorator-1.0.2-py2.py3-none-any.whl.
File metadata
- Download URL: paramorator-1.0.2-py2.py3-none-any.whl
- Upload date:
- Size: 3.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.32.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ceb908ccb993bcfad153fec69502052cf678d11af0b7a8d122b942233a612652
|
|
| MD5 |
053588ee604d15cbc15e84463e1377fe
|
|
| BLAKE2b-256 |
39a20bab6d3108121a7356e1c4c2843e956fde39466d65959bc9c1476c77d930
|