使用 PyO3,我能够将
&str
和 String
类型从 Rust 传递到 Python:
#[pyfunction]
fn test_str(py: Python) -> &str {
"this is a &str"
}
#[pyfunction]
fn test_string(py: Python) -> String {
"this is a String".to_string()
}
Python 能够很好地调用这些:
>>> test_str(), type(test_str())
('this is a &str', <class 'str'>)
>>> test_string(), type(test_string())
('this is a String', <class 'str'>)
我还可以将它们包装为
PyResult<&str>
和 PyResult<String>
,具有相同的行为。
我需要知道什么(如果有的话)以及需要采取其他步骤来确保内存得到正确处理?如果我不想维护对相同字符串的引用,我是否需要告诉 GIL 有关
String
的信息,以便它可以在必要时释放它们?
如果我需要做更多的事情,我是否也需要对其他方法做同样的事情,例如当我创建 Rust 时
struct
?
#[pyfunction]
fn new_thing(py: Python) -> Thing {
Thing { foo: 1, bar: true }
}
什么也没有。 PyO3 处理一切都很好。
在内部,它需要您的
&str
或 String
,并调用 Python API,将它们复制到新分配的 Python 的 str
(PyO3 中的 PyString
)。 String
像往常一样被删除,并在函数结束时释放其内存,并且 PyString
返回给 Python,由 Python 的 GC 负责。
当您采用
&str
类型的参数时,PyO3 使其指向字符串数据(不复制),如有必要,将编码更改为 UTF-8。 String
类似,只是它在 Rust 堆中分配一个位置并将数据复制到那里,就像普通的 String
一样。