gpt4 book ai didi

rust - 如何使用 PY03 实现返回 Python 对象的 Rust 函数

转载 作者:行者123 更新时间:2023-12-03 11:26:22 27 4
gpt4 key购买 nike

在 Python 中,我想调用一个返回 Python 对象的 Rust 函数:

my_rust_module.my_function()  # => <object>

我不知道如何创建这个函数,因为 PYO3 guide on class instantiation描述如何将此类对象实例化为 PyRef ,但是我不知道如何从 pyfunction 返回这样的引用.

这就是我正在尝试的:
#[pyfunction]
fn my_function(py: Python) -> PyRef {
let gil = Python::acquire_gil();
let py = gil.python();
PyRef::new(py, MyStruct { }).unwrap()
}

然而, PyRef似乎不是有效的返回类型(编译器说“类型参数的数量错误:预期为 1,发现为 0”),而且我不知道如何转换 PyRef变成可以返回的东西,例如 PyObject .

最佳答案

鉴于适当的脚手架已就位,例如 pymodulepyclass定义,有多种方法可以实现这一点:

#[pyfunction]
fn my_function() -> PyResult<PyObject> {
let gil = Python::acquire_gil();
let py = gil.python();
let pyref = PyRef::new(py, MyStruct {})?;

Ok(pyref.to_object(py))
}
或者:
#[pyfunction]
fn my_function() -> PyResult<Py<MyStruct>> {
let gil = Python::acquire_gil();
let py = gil.python();

Py::new(py, MyStruct {})
}
我也冒昧地将退回的对象包装在 PyResult 中为了将可能的错误传播到 python 领域。您可以在 Rust 中解包并返回裸露的对象,但我认为建议使用这种处理错误的方式。

编辑:上一个答案不完整,有点误导。最简单的方法实际上只是:
#[pyfunction]
fn my_function() -> PyResult<MyStruct> {
Ok(MyStruct {})
}
The PYO3 pyclass guide状态:

You can use pyclasses like normal rust structs.

However, if instantiated normally, you can't treat pyclasses as Python objects.

To get a Python object which includes pyclass, we have to use some special methods.


我相信只有当所述值不跨越 Rust/Python 边界时,这才是正确的。如果是, pyfunction宏自动将 Python 对象转换为 Rust 值,并将 Rust 返回值转换回 Python 对象。 PYO3 指南在这里可能更具体。

关于rust - 如何使用 PY03 实现返回 Python 对象的 Rust 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59204849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com