为了酸洗目的,我在锈蚀中实施了以下方法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 端进行 pickle 时,出现错误:
> 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