PyO3中的自定义结构向量

时间:2019-01-16 08:59:34

标签: python rust pyo3

我是Rust和PyO3(来自Python)的新手,所以这对于更有经验的人可能是显而易见的。

我在PyO3中声明了pyclass结构。

#[pyclass]
struct Block {
    start: i32,
    stop: i32,
}

然后我在锈函数中使用Block,该函数采用Block的向量并输出int的向量(下面的签名)

#[pyfunction]
fn from_blocks(block_list: Vec<Block>) -> Vec<i32>

使用nightly-x86_64-apple-darwin进行编译时,出现以下错误:

#[pyfunction]
^^^^^^^^^^^^^ the trait `pyo3::FromPyObject<'_>` is not implemented for `std::vec::Vec<Block>`

我该如何解决?

编辑: Caio是对的。在追溯错误时我犯了一个错误。 以前我写过

  

然后我在rust函数中使用Block,该函数需要一个int向量并输出一个Block向量(如下所示)

#[pyfunction]
fn to_blocks(list: Vec<i32>) -> Vec<Block>

但是实际的冒犯功能是:

#[pyfunction]
fn from_blocks(block_list: Vec<Block>) -> Vec<i32>

我已经更新了问题以使其更清楚。

3 个答案:

答案 0 :(得分:2)

FromPyObject适用于可以从Python世界中提取的类型。这就是为什么我认为您尝试编写fn to_blocks(list: Vec<Block>) -> Vec<i32>而不是fn to_blocks(list: Vec<i32>) -> Vec<Block>的原因。如果是这样,请转到实现链。

FromPyObject具有any &T that implements PyTryFrom的默认实现,而PyTryFrom具有any T that implements PyTypeInfo的默认实现。 [pyclass]根据impl_class方法实现PyObjectAllocPyObjectWithFreeList,并且两个特征都绑定了PyTypeInfo特征。因此,您的类/结构可以很好地与引用配合使用,例如:

#[pyfunction]
fn to_blocks(list: Vec<&Block>) -> Vec<i32>

您可以在官方文档中以概括的方式看到此说明。

  

FromPyObject由可以提取的各种类型实现   来自Python对象引用

答案 1 :(得分:0)

看起来pyfunction属性生成的代码要求返回类型实现FromPyObject特性。尽管有FromPyObject for Vec<T> where T: FromPyObject的全面实现,但似乎pyclass类型的FromPyObject属性生成的代码不包含Block类型的FromPyObject实现。

由于我不了解PyO3,除了我只是看了几分钟的API文档以验证此答案外,我不确定您如何最好地获得derive的实现-也许有一个{ {1}}吗?

答案 2 :(得分:0)

您正在使用哪个版本的PyO3? 您的代码正在0.5.30.6.0-alpha.1上为我工作。

由于无法对此进行测试,但我想您需要返回一个PyResult

#[pyfunction]
fn to_blocks(list: Vec<i32>) -> PyResult<Vec<Block>>