一个简单的实用工具,用于定义让类型检查器满意的参数化装饰器。
项目描述
Paramorator
一个简单的实用工具,用于定义让类型检查器满意的参数化装饰器。
安装
pip install paramorator
用法
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
这并不是真正的火箭科学,但要在不使用paramorator
的情况下达到相同的结果,你需要编写一大堆样板代码来满足你的类型检查器。以下是不使用paramorator
编写的等效multiple
装饰器
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
开发
安装 flit
并运行
flit install
运行测试
python tests.py
使用Pyright检查类型
pyright paramorator.py tests.py
项目详情
关闭
paramorator-1.0.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 05a600eb881ea65f2cf62c8e11505f1b48773bd90b1c8160df126197e28fe72a |
|
MD5 | fcf4d928935a25e57136846426939f28 |
|
BLAKE2b-256 | cd6d590729e40efc8f3342e465a645dd575630b8ba7cc936ac67146f8e8de250 |
关闭
paramorator-1.0.1-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d6c66167006684228dfd3c4f1209b97979aef528b749e19fa3788e57591d6d24 |
|
MD5 | 7a8fdef307ee068646c041fd5e8d29b5 |
|
BLAKE2b-256 | ffad8abdbb6d42f354b6d2b2f6ffb9c8a394e6988b2faae1db1b57bd833e9be3 |