Как управляется память с помощью & str и String, собственных типов и PyResult <T>при передаче значений из Rust в Python? - PullRequest
2 голосов
/ 03 марта 2020

Используя 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 s, чтобы он мог освободить их при необходимости?

Если мне нужно сделать больше, могу ли я также нужно сделать то же самое для других методов, например, когда я создаю Rust struct?

#[pyfunction]
fn new_thing(py: Python) -> Thing {
    Thing { foo: 1, bar: true }
}
...