Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

paramorator-1.0.2.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

paramorator-1.0.2-py2.py3-none-any.whl (3.4 kB view details)

Uploaded Python 2 Python 3

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

Hashes for paramorator-1.0.2.tar.gz
Algorithm Hash digest
SHA256 2e034ef97edb2debbe7f155b9204195864dc141682c3f01fa59ef89c3b79d24e
MD5 19a1b219903aaa2d595eb6cf78c50c93
BLAKE2b-256 7a0477c18d2d2c68d5b3af85f1d4952ca4d8f8ecded9c27fe203418f848dc76a

See more details on using hashes here.

File details

Details for the file paramorator-1.0.2-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for paramorator-1.0.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ceb908ccb993bcfad153fec69502052cf678d11af0b7a8d122b942233a612652
MD5 053588ee604d15cbc15e84463e1377fe
BLAKE2b-256 39a20bab6d3108121a7356e1c4c2843e956fde39466d65959bc9c1476c77d930

See more details on using hashes here.

Supported by

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