Использование PyAny для передачи созданных в Rust объектов из Python обратно в Rust - PullRequest
2 голосов
/ 06 марта 2020

У меня есть реализация struct + в Rust, которую я возвращаю Python. Этот объект также может быть передан назад в Rust для дальнейшей работы. (В моем реальном коде я использую HashMap<String, MyStruct>, но даже простое использование структуры, по-видимому, вызывает те же проблемы, поэтому мой пример использует struct Person для простоты.)

Похоже, что я нужно impl FromPyObject for Person, но Rust не может найти PyAny s downcast метод

#[pyclass]
struct Person {
    name: String,
    age: u8,
    height_cm: f32,
}

impl pyo3::FromPyObject<'_> for Person {
    fn extract(any: &PyAny) -> PyResult<Self> {
        Ok(any.downcast().unwrap())
               ^^^^^^^^ method not found in `&pyo3::types::any::PyAny`
    }
}

#[pyfunction]
fn make_person() -> PyResult<Person> {
    Ok(Person {
        name: "Bilbo Baggins".to_string(),
        age: 51,
        height_cm: 91.44,
    })
}

#[pyfunction]
fn person_info(py:Python, p: PyObject) -> PyResult<()> {
    let p : Person = p.extract(py)?;
    println!("{} is {} years old", p.name, p.age);
    Ok(())
}

Это правильный способ передать объект Rust из Python обратно в ржавчину? Если да, то как правильно использовать PyAny здесь?

...