rust 字段为pyO3的枚举的最接近实现

9rygscc1  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(125)

从PyO3版本0.18.1开始,只支持无字段枚举。
如果手动实现的话,支持使用PyO3字段的枚举的潜在实现是什么??pyclass在这里没有用(如果我错了,请纠正我)。
例如,如果我必须实现以下枚举?

pub enum Prop {
    Str(String),
    I32(i32),
    I64(i64),
    U32(u32),
    U64(u64),
    F32(f32),
    F64(f64),
    Bool(bool),
}

请建议。

iqih9akk

iqih9akk1#

从github复制。
这种方法的问题是它不是很Python化。只有当用户可以提供一个Prop列表作为字典时,它才是理想的。我已经成功地实现了它,如下所示:

use pyo3::prelude::*;
use std::collections::HashMap;

#[derive(FromPyObject, Debug)]
pub enum Prop {
    Int(usize),
    String(String),
    Vec(Vec<usize>),
}

#[pyfunction]
pub fn get_props(props: HashMap<String, Prop>) -> PyResult<()> {
    let v = props.into_iter().collect::<Vec<(String, Prop)>>();
    for i in v {
        println!("K = {}, V = {:?}", i.0, i.1)
    }
    Ok(())
}

来自python:

import pyo3_example

pyo3_example.get_props({
                   "name": "Shivam Kapoor", 
                   "age": 35,  
                   "hobbies": [1, 2, 3]
                 })
# K = name, V = String("Shivam Kapoor")
# K = age, V = Int(35)
# K = hobbies, V = Vec([1, 2, 3])

相关问题