我正在为我的库编写一个 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
容器中吗?