gpt4 book ai didi

python - 如何在 PyO3 中实现 python 运算符

转载 作者:行者123 更新时间:2023-12-01 01:40:01 24 4
gpt4 key购买 nike

我正在尝试为我的数学库实现一个 rust 中的向量类。

#[pyclass]
struct Vec2d {
#[pyo3(get, set)]
x: f64,
#[pyo3(get, set)]
y: f64
}

但我不知道如何重载标准运算符(+、-、*、/)

我尝试从 std::ops 实现 Add 特征,但没有成功
impl Add for Vec2d {
type Output = Vec2d;
fn add(self, other: Vec2d) -> Vec2d {
Vec2d{x: self.x + other.x, y: self.y + other.y }
}
}

我还尝试添加 __add__ #[pymethods] block 的方法
fn __add__(&self, other: & Vec2d) -> PyResult<Vec2d> {
Ok(Vec2d{x: self.x + other.x, y: self.y + other.y })
}

但仍然无法正常工作。

使用第二种方法,我可以看到该方法存在,但 python 不将其识别为运算符重载
In [2]: v1 = Vec2d(3, 4)
In [3]: v2 = Vec2d(6, 7)
In [4]: v1 + v2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-08104d7e1232> in <module>()
----> 1 v1 + v2

TypeError: unsupported operand type(s) for +: 'Vec2d' and 'Vec2d'

In [5]: v1.__add__(v2)
Out[5]: <Vec2d object at 0x0000026B74C2B6F0>

最佳答案

根据 PyO3 文档,
Python 的对象模型为不同的对象行为定义了几种协议(protocol),例如序列、映射或数字协议(protocol)。 PyO3 为它们中的每一个定义了单独的特征。 要提供特定的 python 对象行为,您需要为您的结构实现特定的特征。
重要提示,每个协议(protocol)实现 block 必须用 注释#[ pyproto ] 属性。__add__ , __sub__等在 PyNumberProtocol 中定义特征。
所以你可以实现 PyNumberProtocol为您的Vec2d结构重载标准操作。

#[pyproto]
impl PyNumberProtocol for Vec2d {
fn __add__(&self, other: & Vec2d) -> PyResult<Vec2d> {
Ok(Vec2d{x: self.x + other.x, y: self.y + other.y })
}
}
此解决方案未经测试,对于完整的工作解决方案,请检查@Neven V 的答案。

关于python - 如何在 PyO3 中实现 python 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com