Как осуществляется управление памятью с помощью & str и String, собственных типов и PyResult <T> при передаче значений из Rust в Python?
Используя 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 }
}