如何在pytho3中使用rust方法对python int的引用?

fcg9iug3  于 2023-04-30  发布在  Python
关注(0)|答案(1)|浏览(96)

如何从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来实现这一点。

ego6inou

ego6inou1#

我的困惑源于Python和Rust之间如何处理引用,以及如何使用pyo3来实现这一点。
不应该是,要求一个i32
对于从Python对象中获取引用的支持非常少,因为布局不匹配,所以从Python对象中获取Rust对象通常需要复制和重新格式化数据。与pyo3一起提供的唯一例外是&str&[u8](以及Cow<'a, [u8]>)。
另外,这往往是有限的使用,因为它会排除放弃GIL,这往往是你想要的。更不用说&i32i32占用更多的资源,这完全没有意义。

相关问题