PyO3 将 Rust 结构转换为 PyObject
PyO3 convert rust struct to PyObject
我有一个简单的 class 注释 #[pyclass]
#[pyclass]
pub struct A {
...
}
现在我有了一个函数
fn f(slf: Py<Self>) -> PyObject{
//... some code here
let output = A{...};
output.to_object() // Error: method `to_object` not found for this
}
我是否应该用某些东西来注释我的结构以使其派生 pyo3::ToPyObject
?
如果你对函数签名有控制权,你可以把它改成fn f(slf: Py<Self>) -> A
只要可能,我更喜欢这种方法,因为这样转换就在幕后发生。
如果您需要保持签名通用,因为您可能会返回不同类型的结构,则需要调用正确的转换方法。
标记为 #[pyclass]
的结构将实现 IntoPy<PyObject>
,但转换方法不是调用 to_object
而是调用 into_py
,它需要一个 gil 令牌.所以这就是你要做的:
fn f(slf: Py<Self>) -> PyObject {
//... some code here
let gil = Python::acquire_gil()?;
let py = gil.python();
output.into_py(py)
}
我有一个简单的 class 注释 #[pyclass]
#[pyclass]
pub struct A {
...
}
现在我有了一个函数
fn f(slf: Py<Self>) -> PyObject{
//... some code here
let output = A{...};
output.to_object() // Error: method `to_object` not found for this
}
我是否应该用某些东西来注释我的结构以使其派生 pyo3::ToPyObject
?
如果你对函数签名有控制权,你可以把它改成fn f(slf: Py<Self>) -> A
只要可能,我更喜欢这种方法,因为这样转换就在幕后发生。
如果您需要保持签名通用,因为您可能会返回不同类型的结构,则需要调用正确的转换方法。
标记为 #[pyclass]
的结构将实现 IntoPy<PyObject>
,但转换方法不是调用 to_object
而是调用 into_py
,它需要一个 gil 令牌.所以这就是你要做的:
fn f(slf: Py<Self>) -> PyObject {
//... some code here
let gil = Python::acquire_gil()?;
let py = gil.python();
output.into_py(py)
}