1 个不稳定版本
0.7.0 | 2024年6月29日 |
---|
#1265 在 Rust 模式
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::ops
和 pyderive::convert
提供了派生宏,这些宏实现了单个方法,例如对数值类型的枚举(如 __add__()
等)以及由内置函数(如 __int__()
等)调用。
此外,它还提供了一个辅助派生宏
derive 宏 | Impl |
---|---|
ToPyObject |
ToPyObject 特性通过 IntoPy<PyObject> 特性为 pyclass |
它需要启用 PyO3 的 multiple-pymethods
功能,因为这将产生多个 #[pymethods]
。
许可证
MIT 或 Apache-2.0
依赖项
~285–790KB
~18K SLoC