Python 在包含不同板条箱类型的rust结构上使用pyo3 pyclass

Python 在包含不同板条箱类型的rust结构上使用pyo3 pyclass,python,rust,pyo3,Python,Rust,Pyo3,我有一个rust结构,它使用pyo3 pyclass宏来允许在python中使用。这对于简单的结构很好,但是如果我有一个包含来自不同库的类型的结构,它就变得更加困难 例如: 使用geo::Point; #[pyclass] #[派生(克隆、复制)] pub结构单元状态{ 酒吧编号:u32, 酒吧位置:点, 酒吧人口:u32, } 上面我们使用rust geo库中的点类型。编译器提供了以下错误: 没有为`geo::Point`实现特性`pyo3::PyClass` 如果我尝试在这一点上实现PyC

我有一个rust结构,它使用pyo3 pyclass宏来允许在python中使用。这对于简单的结构很好,但是如果我有一个包含来自不同库的类型的结构,它就变得更加困难

例如:

使用geo::Point;
#[pyclass]
#[派生(克隆、复制)]
pub结构单元状态{
酒吧编号:u32,
酒吧位置:点,
酒吧人口:u32,
}
上面我们使用rust geo库中的点类型。编译器提供了以下错误:
没有为`geo::Point`实现特性`pyo3::PyClass`

如果我尝试在这一点上实现PyClass:

impl PyClass用于点{}
它给出了以下编译器错误:
impl不仅使用当前板条箱内部的类型


有没有干净简单的方法来解决这个问题?

在找到更好的答案之前,我的解决方案是将该类嵌套在python类中,但随后我不得不手动编写getter和setter

#[pyclass]
#[衍生(克隆)]
pub结构CellStatePy{
酒吧内部:CellState,
}
#[方法]
简单细胞状态{
#[新]
pub fn new(id:u32,pos:(f64,f64),population:u32)->Self{
牢骚满腹{
内部:细胞状态{
id:CellIndex(id),
位置:点!(x:位置0,y:位置1),
人口,,
},
}
}
}
然后实现PyObjectProtocol:

#[pyproto]
CellStatePy的impl PyObjectProtocol{
fn_uuustr_uuu(&self)->PyResult(&a self)->PyResult{
Ok(格式!(“CellStateObj id:{:?}”,self.inner.id))
}
fn\uuu getattr\uuuu(&'a self,name:&str)->PyResult{
释放:字符串=匹配名称{
“id”=>self.internal.id.into(),
“position”=>format!(“{},{}”,self.inner.position.x(),self.inner.position.y()),
“population”=>format!(“{}”,self.inner.population),
&_=>“无效字段”。到_owned(),
};
好(出去)
}
}

在找到更好的答案之前,我的解决方案是将类嵌套在python类中,但随后我不得不手动编写getter和setter

#[pyclass]
#[衍生(克隆)]
pub结构CellStatePy{
酒吧内部:CellState,
}
#[方法]
简单细胞状态{
#[新]
pub fn new(id:u32,pos:(f64,f64),population:u32)->Self{
牢骚满腹{
内部:细胞状态{
id:CellIndex(id),
位置:点!(x:位置0,y:位置1),
人口,,
},
}
}
}
然后实现PyObjectProtocol:

#[pyproto]
CellStatePy的impl PyObjectProtocol{
fn_uuustr_uuu(&self)->PyResult(&a self)->PyResult{
Ok(格式!(“CellStateObj id:{:?}”,self.inner.id))
}
fn\uuu getattr\uuuu(&'a self,name:&str)->PyResult{
释放:字符串=匹配名称{
“id”=>self.internal.id.into(),
“position”=>format!(“{},{}”,self.inner.position.x(),self.inner.position.y()),
“population”=>format!(“{}”,self.inner.population),
&_=>“无效字段”。到_owned(),
};
好(出去)
}
}

FYI上述代码现在编译FYI上述代码现在编译