pyo3 可选地为 rust 结构生成 python 绑定

pyo3 optionally generate python bindings for rust struct

我在我的代码中定义了一些结构,如果在 crate 上启用了某个功能,我也想为这些结构生成 Python 绑定。现在我无法正确获取它。假设我有一个结构 MyStruct,我想为其选择性地生成 Python 绑定。

我试过类似下面的方法

cfg_if! {
    if #[cfg(feature = "python-bindings")] {
        #[pyclass]
    } 
    else {
    }  
}
struct MyStruct{
   value: i32
}

如果 feature python-bindings 启用,我只想添加 #[pyclass],否则不添加。

如果 python-bindings 未启用,这会正常工作。但是如果我用 --features python-bindings 编译,我会得到以下错误。

error: expected item after attributes

尽量不要重复代码。喜欢

cfg_if! {
    if #[cfg(feature = "python-bindings")] {
        #[pyclass]
        struct MyStruct{
           value: i32
        }
    } 
    else {
        struct MyStruct{
            value: i32
        }
    }  
}

有没有不重复代码的方法?

是的,#[cfg_attr]:

#[cfg_attr(feature = "python-bindings", pyclass)]
struct MyStruct {
    value: i32
}