Используя 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 }
}