serde-pyobject

Crates.ioserde-pyobject
lib.rsserde-pyobject
version0.6.2
created_at2023-11-20 07:46:09.706383+00
updated_at2025-05-24 07:17:01.256289+00
descriptionPyO3's PyAny as a serde data format
homepage
repositoryhttps://github.com/Jij-Inc/serde-pyobject
max_upload_size
id1041837
size71,280
Developers (github:jij-inc:developers)

documentation

https://docs.rs/serde-pyobject/

README

serde-pyobject

crate docs.rs

PyO3's PyAny as a serde data format

Usage

Serialize T: Serialize into &'py PyAny:

use serde::Serialize;
use pyo3::{Python, Bound, types::{PyAny, PyAnyMethods, PyDict}};
use serde_pyobject::{to_pyobject, pydict};

#[derive(Serialize)]
struct A {
    a: u32,
    b: String,
}

Python::with_gil(|py| {
    let a = A { a: 1, b: "test".to_string() };
    let obj: Bound<PyAny> = to_pyobject(py, &a).unwrap();
    assert!(obj.eq(pydict! { py, "a" => 1, "b" => "test" }.unwrap()).unwrap());
});

Deserialize &'py PyAny into T: Deserialize<'de>:

use serde::Deserialize;
use pyo3::{Python, Bound, types::{PyAny, PyAnyMethods, PyDict}};
use serde_pyobject::{from_pyobject, pydict};

#[derive(Debug, PartialEq, Deserialize)]
struct A {
    a: u32,
    b: String,
}

Python::with_gil(|py| {
    let a: Bound<PyDict> = pydict! { py,
      "a" => 1,
      "b" => "test"
    }
    .unwrap();
    let a: A = from_pyobject(a).unwrap();
    assert_eq!(a, A { a: 1, b: "test".to_string() });
});

Mapping between Python and serde data model

serde data model PyO3 type Rust Python
i8, i16, i32, i64, isize,
u8, u16, u32, u64, usize
PyLong 123 123
f32, f64 PyFloat 1.0 1.0
bool PyBool true true
char, string PyString 'a', "test" "a", "test"
option PyAny 1 None, Some(1) None, 1
unit PyTuple () ()
unit struct PyTuple struct Unit ()
unit variant PyDict E::A in enum E { A, B } "A"
newtype struct PyDict A(32) of struct A(u8) 32
newtype variant PyDict E::N(41) of enum E { N(u8) } { "N": 41 }
seq PyList vec![1, 2, 3] [1, 2, 3]
tuple PyTuple (1, "test") (1, "test")
tuple struct PyDict T(1, "a") of struct T(u32, String) (1, "a")
tuple variant PyDict E::S(1, 2) of enum E { S(u8, u8) } { "S": (1, 2) }
map PyDict hashmap!{ "a".to_string() => 1, "b".to_string() => 2 } { "a": 1, "b": 2 }
struct PyDict A { a: 1, b: "test" } of struct A { a: u32, b: String } { "a": 1, "b": "test"}
struct variant PyDict E::S { r: 1, g: 2, b: 3 } of enum E { S { r: u8, g: u8, b: u8 } } { "S": { "r": 1, "g": 2, "b": 3 } }

License

© 2023 Jij Inc.

This project is licensed under either of

at your option.

Footnotes

  1. Some(value) is serialized as value

Commit count: 125

cargo fmt