#macro-derive #pyo3 #dict #derive

macro dict_derive

Derive macros for some PyO3 traits to convert python dicts into rust structs

10 releases (5 breaking)

0.6.0 Aug 22, 2024
0.5.0 Nov 3, 2023
0.4.0 Aug 3, 2021
0.3.1 Jan 26, 2021
0.1.1 Jun 16, 2019

#753 in Procedural macros

Download history 1820/week @ 2024-08-17 1392/week @ 2024-08-24 3236/week @ 2024-08-31 1421/week @ 2024-09-07 1238/week @ 2024-09-14 1120/week @ 2024-09-21 1842/week @ 2024-09-28 1221/week @ 2024-10-05 1965/week @ 2024-10-12 1551/week @ 2024-10-19 1422/week @ 2024-10-26 1444/week @ 2024-11-02 1713/week @ 2024-11-09 1341/week @ 2024-11-16 1150/week @ 2024-11-23 753/week @ 2024-11-30

5,152 downloads per month
Used in 4 crates

Apache-2.0

11KB
165 lines

Dict-Derive

Derive macro for PyO3's FromPyObject and IntoPy<PyObject> traits. The derived implementation turns a Python's dict into your Rust struct and back.

Usage

Add the library to your Cargo.toml together with PyO3:

[dependencies]
pyo3 = { version = "0.22", features = ["gil-refs"] }
dict_derive = "0.6"

Import the derive implementation and use it on your structs:

extern crate dict_derive;

use dict_derive::{FromPyObject, IntoPyObject};


#[derive(FromPyObject, IntoPyObject)]
struct User {
    name: String,
    email: String,
    age: u32,
}

Then you can use your structs as arguments and return values in your PyO3 functions:

extern crate pyo3;
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

// Requires FromPyObject to receive a struct as an argument
#[pyfunction]
fn get_contact_info(user: User) -> PyResult<String> {
    Ok(format!("{} - {}", user.name, user.email))
}

// Requires IntoPyObject to return a struct
#[pyfunction]
fn get_default_user() -> PyResult<User> {
    Ok(User {
        name: "Default".to_owned(),
        email: "default@user.com".to_owned(),
        age: 27,
    })
}

And then call your functions using normal python dicts:

>>> import mylib
>>> mylib.get_contact_info({"name": "Thor", "email": "thor@asgard.com", "age": 23})
'Thor - thor@asgard.com'
>>> mylib.get_default_user()
{'name': 'Default', 'email': 'default@user.com', 'age': 27}

Older PyO3 versions

  • For PyO3 version 0.7.0 or lower, use version 0.1 of this crate.
  • For PyO3 version 0.8 to 0.10, use version 0.2 of this crate.
  • For PyO3 version 0.11 to 0.13, use version 0.3 of this crate.
  • For PyO3 version 0.14 to 0.19, use version 0.4 of this crate.
  • For PyO3 version 0.20, use version 0.5 of this crate.

Dependencies

~1.5MB
~37K SLoC