我对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是对的。我在追溯错误时犯了一个错误。以前我写过
然后,我在一个锈蚀函数中使用块,该函数接受int的向量,并输出块的向量(签名如下)
#[pyfunction]
fn to_blocks(list: Vec<i32>) -> Vec<Block>但实际的冒犯职能是:
#[pyfunction]
fn from_blocks(block_list: Vec<Block>) -> Vec<i32>我更新了这个问题,使它更清楚。
发布于 2019-01-16 13:55:37
FromPyObject用于可以从Python中提取的类型。这就是为什么我认为您试图编写fn to_blocks(list: Vec<Block>) -> Vec<i32>而不是fn to_blocks(list: Vec<i32>) -> Vec<Block>。如果是这样的话,让我们继续讨论实现链。
FromPyObject有实现PyTryFrom的any &T的默认实现,PyTryFrom有任何实现PyTypeInfo的T的默认实现。[pyclass]根据impl_class方法实现了PyObjectAlloc或PyObjectWithFreeList,这两个特征都具有PyTypeInfo特征约束。因此,您的类/结构可以很好地处理引用,例如:
#[pyfunction]
fn to_blocks(list: Vec<&Block>) -> Vec<i32>您可以在正式文档中以总结的方式看到这一解释。
FromPyObject由各种类型实现,这些类型可以从Python 引用中提取。
发布于 2019-01-16 10:00:33
看起来,pyfunction属性生成的代码要求返回类型实现FromPyObject特性。虽然FromPyObject for Vec<T> where T: FromPyObject有一个全面的实现,但是为pyclass属性生成的代码似乎不包括FromPyObject类型的Block实现。
由于我不熟悉PyO3,除了我刚才查看它的API文档来验证这个答案的几分钟外,我不知道如何最好地得到一个FromPyObject实现--也许它有一个derive?
发布于 2019-01-16 15:15:30
您使用的是哪个版本的PyO3?您的代码在0.5.3和0.6.0-alpha.1上适用于我。
由于这个原因,我无法测试这个,但我猜您需要返回一个PyResult
#[pyfunction]
fn to_blocks(list: Vec<i32>) -> PyResult<Vec<Block>>https://stackoverflow.com/questions/54213443
复制相似问题