MCPcopy Index your code
hub / github.com/Jij-Inc/serde-pyobject

github.com/Jij-Inc/serde-pyobject @v0.8.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.0 ↗ · + Follow
106 symbols 198 edges 12 files 5 documented · 5%
What it actually does AI analysis from the code graph — generated when you open this
loading…
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::attach(|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::attach(|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 | PyInt | 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 } } |

[^1]: Some(value) is serialized as value

License

© 2023 Jij Inc.

This project is licensed under either of

at your option.

Core symbols most depended-on inside this repo

check_revertible
called by 20
tests/check_revertible.rs
test
called by 16
tests/to_json_to_pyobject.rs
from_pyobject
called by 9
src/de.rs
to_pyobject
called by 6
src/ser.rs
deserialize_any
called by 5
src/de.rs
dataclass_as_dict
called by 1
src/dataclass.rs
pydantic_model_as_dict
called by 1
src/pydantic.rs
to_json_to_pyobject
called by 1
tests/to_json_to_pyobject.rs

Shape

Method 42
Function 35
Class 22
Enum 7

Languages

Rust100%

Modules by API surface

src/ser.rs27 symbols
src/de.rs25 symbols
tests/check_revertible.rs23 symbols
tests/to_json_to_pyobject.rs17 symbols
tests/python_dataclass.rs4 symbols
src/error.rs4 symbols
tests/python_pydantic.rs2 symbols
tests/python_custom_class.rs2 symbols
src/pydantic.rs1 symbols
src/dataclass.rs1 symbols

For agents

$ claude mcp add serde-pyobject \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact