我是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>
我已经更新了问题以使其更清楚。
答案 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
方法实现PyObjectAlloc
或PyObjectWithFreeList
,并且两个特征都绑定了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.3
和0.6.0-alpha.1
上为我工作。
由于无法对此进行测试,但我想您需要返回一个PyResult
:
#[pyfunction]
fn to_blocks(list: Vec<i32>) -> PyResult<Vec<Block>>