#pyo3 #attributes #class #methods #macro #special #python

pyderive

PyO3 的 Python 特殊方法和类属性的 derive 宏

1 个不稳定版本

0.7.0 2024年6月29日

#1265Rust 模式

MIT/Apache

130KB
647

pyderive

pyderive 提供了用于 Python 特殊方法和 PyO3 类属性的 derive 宏。

// Enable `multiple-pymethods` feature of PyO3
use pyo3::prelude::*;
use pyderive::*;

// Place #[derive(PyNew, ...)] before #[pyclass]
#[derive(PyNew, PyMatchArgs, PyRepr, PyEq, PyHash)]
#[pyclass(get_all)]
#[derive(PartialEq, Hash)]
struct MyClass {
    string: String,
    integer: i64,
    option: Option<String>
}
from rust_module import MyClass

# Derives __new__()
m = MyClass("a", 1, None)

# Derives __match_args__ (supports Pattern Matching by positional arguments)
match m:
    case MyClass(a, b, c):
        assert a == "a"
        assert b == 1
        assert c is None
    case _:
        raise AssertionError

# Derives __repr__()
assert str(m) == "MyClass(string='a', integer=1, option=None)"
assert repr(m) == "MyClass(string='a', integer=1, option=None)"

# Derives __eq__() that depends on PartialEq/Eq trait
assert m == MyClass("a", 1, None)

# Derives __hash__() that depends on Hash trait
assert hash(m) == 3289857268557676066

这提供了以下特殊方法和属性的自定义:

derive 宏 Python 方法/属性
PyNew __new__()
PyMatchArgs __match_args__
PyRepr __repr__()
PyStr __str__()
PyEq __eq__()__ne__()
PyOrd __lt__()__le__()__gt__()__ge__()
PyRichCmp ==!=>>=<<=
PyHash __hash__()
PyIter __iter__()
PyReversed __reversed__()
PyLen __len__()
PyDataclassFields __dataclass_fields__
PyNumeric 数值运算方法(__add__() 等)
PyBitwise 位运算方法(__and__() 等)

字段属性 #[pyderive(..)] 用于自定义实现,类似于 Python 的 dataclasses.field()

模块 pyderive::opspyderive::convert 提供了派生宏,这些宏实现了单个方法,例如对数值类型的枚举(如 __add__() 等)以及由内置函数(如 __int__() 等)调用。

此外,它还提供了一个辅助派生宏

derive 宏 Impl
ToPyObject ToPyObject 特性通过 IntoPy<PyObject> 特性为 pyclass

它需要启用 PyO3 的 multiple-pymethods 功能,因为这将产生多个 #[pymethods]

许可证

MIT 或 Apache-2.0

依赖项

~285–790KB
~18K SLoC