有效但不是我想要的最小示例:
use std::collections::HashMap;
use pyo3::class::basic::CompareOp;
use pyo3::class::PyObjectProtocol;
use pyo3::prelude::*;
#[pyclass]
struct MyStruct {
foo: HashMap<i32, Vec<i32>>,
}
#[pyproto]
impl PyObjectProtocol for MyStruct {
fn __richcmp__(&self, other: PyRef<MyStruct>, op: CompareOp) -> Py<PyAny> {
let gil = Python::acquire_gil();
let py = gil.python();
if let CompareOp::Eq = op {
let other_foo = &(other.foo);
let res = self.foo == *other_foo;
return res.into_py(py);
}
py.NotImplemented();
}
}
所以这将引用一个MyStruct
生活在python堆中的人并对其进行比较,我的理解是不会发生复制/克隆。
但这不是pythonic的方式。参数other
不必是同一类型。TypeError
比较方法应该只返回,而不是提高 a NotImplemented
。
我正在尝试更改签名,以便
- 我可以接受任意 python 对象。我以为
&PyAny
会恰到好处 - 然后我可以检查类型,或尝试转换,但无需将对象从 Python 堆克隆到 Rust 堆。
有什么方法可以将 a&PyAny
转换为 a
PyRef<MyStruct>
吗?