将值从 Rust 传递到 Python 时,如何使用 &str 和 String、本机类型和 PyResult<T> 管理内存?

问题描述 投票:0回答:1

使用 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 }
}
rust pyo3
1个回答
0
投票

什么也没有。 PyO3 处理一切都很好。

在内部,它需要您的

&str
String
,并调用 Python API,将它们复制到新分配的 Python 的
str
(PyO3 中的
PyString
)。
String
像往常一样被删除,并在函数结束时释放其内存,并且
PyString
返回给 Python,由 Python 的 GC 负责。

当您采用

&str
类型的参数时,PyO3 使其指向字符串数据(不复制),如有必要,将编码更改为 UTF-8。
String
类似,只是它在 Rust 堆中分配一个位置并将数据复制到那里,就像普通的
String
一样。

© www.soinside.com 2019 - 2024. All rights reserved.