我正在try 使用Py03从Rust构建一个Python包.现在,我在try 将enums Rust类型返回到Python时陷入了困境.

我有一个如下所示的简单枚举:

pub enum Lang {
    Deu,
    Eng,
    Fra
}

lib.rs年内

#[pyfunction]
fn detect_language(text: &str) -> PyResult<????> {
   // Do some stuff ....
   res:Lang = Do_some_stuff(text)
   Ok(res)
}

#[pymodule]
fn pymylib(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(detect_language, m)?)?;
    Ok(())
}

在Python代码中

from pymylib import detect_language

res=detect_language('Ceci est un test')
print(res) # Lang:Fra ???

推荐答案

一种方法是使用#[pyclass]属性从Rust Enum生成Python类.还要确保从Rust代码中导出这个类,这样您就可以在python层上进行比较. 也就是说,

use pyo3::prelude::*;

#[pyclass]
pub enum Lang {
    Deu,
    Eng,
    Fra
}

#[pyfunction]
fn detect_language(text: &str) -> PyResult<Lang> {
    // Write your actual code here
    // But for testing purpose let's return `Deu` varient.
    Ok(Lang::Deu)
}

/// A Python module implemented in Rust.
#[pymodule]
fn pymylib(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(detect_language, m)?)?;
    m.add_class::<Lang>()?;
    Ok(())
}

现在在Python解释器中,您可以执行以下操作:

>>> from pymylib import Lang
>>> import pymylib
>>> 
>>> pymylib.detect_language("1")
Lang.Deu
>>> pymylib.detect_language("1") == Lang.Deu
True

另请参阅

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

Select 用a和i标签包裹的复选框?

即使在可见的情况下也不相互作用

使用numpy提取数据块

根据不同列的值在收件箱中移动数据

使用miniconda创建环境的问题

大小为M的第N位_计数(或人口计数)的公式

有没有一种方法可以从python的pussompy比较结果中提取文本?

从嵌套的yaml创建一个嵌套字符串,后面跟着点

如何在Python中使用另一个数据框更改列值(列表)

网格基于1.Y轴与2.x轴显示在matplotlib中

为什么t sns.barplot图例不显示所有值?'

如何合并具有相同元素的 torch 矩阵的行?

使用类型提示进行类型转换

如何反转一个框架中列的值?

提取最内层嵌套链接

如何在Polars中将列表中的新列添加到现有的数据帧中?

如何在Polars中处理用户自定义函数的多行结果?

当lambda函数作为参数传递时,pyo3执行

Fake pathlib.使用pyfakefs的类变量中的路径'