如何从rust
类方法中解包一个python整数作为引用?
我试图将一个rust结构体暴露给python,但解释器抱怨引用了i32
。
这就是代码:
#[pyclass]
pub struct DataMap {
entries: HashMap<i32, DataEntry>,
}
#[pymethods]
impl DataMap {
#[new]
fn new() -> DataMap {
DataMap {
entries: HashMap::new(),
}
}
fn insert(&mut self, key: i32, x: i32, y: i32) {
let entry = DataEntry::new(x, y);
self.entries.insert(key, entry);
}
fn get_entry(&self, key: &i32) -> Option<DataEntry> {
if self.entries.contains_key(key) {
Some(self.entries[key])
} else {
None
}
}
}
这就是错误:
--> src/data_structure.rs:46:30
|
46 | fn get_entry(&self, key: &i32) -> Option<DataEntry> {
| ^ the trait `PyClass` is not implemented for `&i32`
|
= help: the following other types implement trait `PyClass`:
DataEntry
DataMap
= note: required for `&i32` to implement `FromPyObject<'_>`
= note: required for `&i32` to implement `PyFunctionArgument<'_, '_>`
note: required by a bound in `extract_argument`
--> /Users/gareth/.cargo/registry/src/github.com-1ecc6299db9ec823/pyo3-0.18.3/src/impl_/extract_argument.rs:86:8
|
86 | T: PyFunctionArgument<'a, 'py>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `extract_argument`
它似乎要求为i32
实现PyClass trait,但我不确定在这种上下文中如何实现。我的困惑源于Python和Rust之间如何处理引用,以及如何使用pyo3
来实现这一点。
1条答案
按热度按时间ego6inou1#
我的困惑源于Python和Rust之间如何处理引用,以及如何使用pyo3来实现这一点。
不应该是,要求一个
i32
。对于从Python对象中获取引用的支持非常少,因为布局不匹配,所以从Python对象中获取Rust对象通常需要复制和重新格式化数据。与pyo3一起提供的唯一例外是
&str
和&[u8]
(以及Cow<'a, [u8]>
)。另外,这往往是有限的使用,因为它会排除放弃GIL,这往往是你想要的。更不用说
&i32
比i32
占用更多的资源,这完全没有意义。