我正在为我的库编写一个 Rust 后端,我需要在以下函数中实现等价的功能pyo3:
def f(x):
return x
这应该返回与输入相同的对象,并且获取返回值的函数应该持有对输入的新引用。如果我在 C API 中写这个,我会写成:
PyObject * f(PyObject * x) {
Py_XINCREF(x);
return x;
}
在PyO3PyObject中,我发现导航, PyObjectRef, &PyObject, Py<PyObject>,之间的差异非常令人困惑Py<&PyObject>。
这个函数最幼稚的版本是:
extern crate pyo3;
use pyo3::prelude::*;
#[pyfunction]
pub fn f(_py: Python, x: &PyObject) -> PyResult<&PyObject> {
Ok(x)
}
除其他外,的生命周期x和返回值不一样,加上我看不到pyo3增加引用计数的机会x,事实上编译器似乎同意我的观点:
error[E0106]: missing lifetime specifier
--> src/lib.rs:4:49
|
4 | pub fn f(_py: Python, x: &PyObject) -> PyResult<&PyObject> {
| ^ expected lifetime parameter
|
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `_py` or `x`
我可能有一种方法可以使用参数手动增加引用计数_py并使用生命周期注释来使编译器满意,但我的印象是pyo3打算使用对象生命周期来管理引用计数本身。
编写此函数的正确方法是什么?我应该尝试将其包装在Py容器中吗?