Для травления я реализую в ржавчине следующие методы 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
. А еще лучше, как исправить?
Используйте PyTuple::empty(py)
вместо ()
https://pyo3.rs/main/doc/pyo3/types/struct.pytuple#method.empty
Ошибка немного вводит в заблуждение:
__getnewargs__
ожидает кортеж Python, то естьPyTuple
, а не кортеж Rust.