首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从以前的宏生成代码生成宏?

如何从以前的宏生成代码生成宏?
EN

Stack Overflow用户
提问于 2021-05-21 01:34:48
回答 1查看 71关注 0票数 1

为了创建一个pyo3驱动的Python类来处理使用泛型类型的结构,我希望使用包装器来生成所需的代码,而不必为每个特定类型都这样做。

我创建了一个生成代码的宏,但我需要将宏生成的函数注册为Python模块的函数。

一种方法是跟踪宏中使用的标识,以便使用它们并使用另一个宏生成wrap_pyfunction,但我找不到任何相关的东西。

(当然,任何其他生成代码的解决方案都将受到热烈欢迎)

我现在拥有的(简化的)代码:

代码语言:javascript
复制
macro_rules! create_python_function {
    ($name:ident, $objtype:expr) => {
        paste!{
            #[pyclass(unsendable)]
            pub struct [<$name PyIface>] {
                obj: GenericStruct<$objtype>,
            }

            impl [<$name PyIface>]{
                pub fn new() -> [<$name PyIface>]{
                    [<$name PyIface>] {}
                }
            }

            pub fn [<create_object_ $name>]() -> [<$name PyIface>]{
                [<$name PyIface>]::new()
            }
        }
    };
}

create_python_function!(name, SpecificType);

#[pymodule]
fn mymodule(_py: Python, m: &PyModule) -> PyResult<()> {
    /* I want to auto-generate this with macro
     * m.add_function(wrap_pyfunction!(create_object_name, m)?).unwrap(); 
     */
    Ok(())
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-26 15:49:15

宏不能共享其参数或状态。如果不想重复标识符,请将mymodule定义移动到create_python_function宏中,然后将该宏更改为使用repetitions (The Rust Reference)

代码语言:javascript
复制
macro_rules! create_python_function {
    ($($name:ident => $objtype:ty),* $(,)?) => {
        $(
            paste! {
                #[pyclass(unsendable)]
                pub struct [<$name PyIface>] {
                    obj: GenericStruct<$objtype>,
                }

                impl [<$name PyIface>]{
                    pub fn new() -> [<$name PyIface>]{
                        [<$name PyIface>] { obj: todo!() }
                    }
                }

                pub fn [<create_object_ $name>]() -> [<$name PyIface>]{
                    [<$name PyIface>]::new()
                }
            }
        )*

        #[pymodule]
        fn mymodule(_py: Python, m: &PyModule) -> Result<(), ()> {
            $(
                paste! {
                    m.add_function(wrap_pyfunction!([<create_object_ $name>], m)?).unwrap();
                }
            )*
            Ok(())
        }
    };
}

struct Foo;
create_python_function!(
    foo => Foo,
    v => Vec<()>,
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67625388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档