#macro-derive #pyo3 #dictionary #derive

macro dict_derive

为一些PyO3特型提供派生宏,将Python字典转换为Rust结构体

10个版本 (5个重大更新)

0.6.0 2024年8月22日
0.5.0 2023年11月3日
0.4.0 2021年8月3日
0.3.1 2021年1月26日
0.1.1 2019年6月16日

#156过程宏

Download history 1631/week @ 2024-05-03 1217/week @ 2024-05-10 4099/week @ 2024-05-17 5101/week @ 2024-05-24 3081/week @ 2024-05-31 1343/week @ 2024-06-07 1569/week @ 2024-06-14 1665/week @ 2024-06-21 1288/week @ 2024-06-28 1787/week @ 2024-07-05 1720/week @ 2024-07-12 1520/week @ 2024-07-19 1018/week @ 2024-07-26 1896/week @ 2024-08-02 1458/week @ 2024-08-09 1859/week @ 2024-08-16

每月6,487次下载
4 crates 中使用

Apache-2.0

11KB
165

Dict-Derive

PyO3的FromPyObjectIntoPy<PyObject>特型的派生宏。派生实现将Python的字典转换为你的Rust结构体,反之亦然。

用法

将库添加到你的Cargo.toml中,并包含PyO3

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

导入派生实现并在你的结构体上使用它

extern crate dict_derive;

use dict_derive::{FromPyObject, IntoPyObject};


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

然后你可以在PyO3函数中将你的结构体用作参数和返回值

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: "[email protected]".to_owned(),
        age: 27,
    })
}

然后使用普通的Python字典调用你的函数

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

旧版PyO3版本

  • 对于PyO3版本0.7.0或更低版本,使用此crate的0.1版本。
  • 对于PyO3版本0.8到0.10,使用此crate的0.2版本。
  • 对于PyO3版本0.11到0.13,使用此crate的0.3版本。
  • 对于PyO3版本0.14到0.19,使用此crate的0.4版本。
  • 对于PyO3版本0.20,使用此crate的0.5版本。

依赖关系

~1.5MB
~35K SLoC