Как осуществляется управление памятью с помощью & 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 оStrings, чтобы освободить их при необходимости?

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

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

0 ответов

Другие вопросы по тегам