Как вернуть пустой кортеж в Python из функции Rust с помощью PyO3?

Для травления я реализую в ржавчине следующие методы pyclass:

#[pymethods]
impl SomePyStruct {
    #[new]
    pub fn new() -> Self { Self {} }

    // Pickling
    pub fn __setstate__(&mut self, state: Bound<'_, PyBytes>) -> PyResult<()> {
        *self = deserialize(state.as_bytes()).unwrap();
        Ok(())
    }
    pub fn __getstate__<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyBytes>> {
        Ok(PyBytes::new_bound(py, &serialize(&self).unwrap()))
    }
    /// THE FOLLOWING FUNCTION FAILS
    pub fn __getnewargs__(&self) -> PyResult<()> {
        Ok(())
    }
    /// THE ABOVE FUNCTION FAILS
}

При травлении на стороне Python я получаю ошибку:

>       bytes = pickle.dumps(obj)
E       TypeError: __getnewargs__ should return a tuple, not 'NoneType'

Почему __getnewargs__ возвращает не пустой кортеж, а возвращает None. А еще лучше, как исправить?

Ошибка немного вводит в заблуждение: __getnewargs__ ожидает кортеж Python, то есть PyTuple, а не кортеж Rust.

freakish 20.08.2024 21:59
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте PyTuple::empty(py) вместо ()

https://pyo3.rs/main/doc/pyo3/types/struct.pytuple#method.empty

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