简单的接口代码生成

举报
Amrf 发表于 2019/11/21 18:49:55 2019/11/21
2.8k+ 0 0
【摘要】 尽管EA也可以生成接口代码,但是当我们想自定义目录结构或者从一些配置信息里来生成接口时,或者一些更自定义的要求时可以考虑下面这种方案; 原文地址:https://www.codeproject.com/Articles/571645/Really-simple-Cplusplus-code-generation-in-Python原文摘录:从Python可以读取的任何数据中快速生成重复的C ...

尽管EA也可以生成接口代码,但是当我们想自定义目录结构或者从一些配置信息里来生成接口时,

或者一些更自定义的要求时可以考虑下面这种方案;

 原文地址:

https://www.codeproject.com/Articles/571645/Really-simple-Cplusplus-code-generation-in-Python

文中CodeGen.py地址:

https://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=571645

原文摘录:

从Python可以读取的任何数据中快速生成重复的C ++,C#或Java代码。

介绍

您对学习曲线过敏,并想立即生成代码这是一个易于定制的100行Python模块,位于上方f.writeline

使用代码

让我们从一个非常简单的示例开始(请指出,请不要main返回int!这是一个示例。

隐藏   复制代码

from CodeGen import *
 
cpp = CppFile("test.cpp")
 
cpp("#include <iostream>")
 
with cpp.block("void main()"):
    for i in range(5):
        cpp('std::cout << "' + str(i) + '" << std::endl;')
    
cpp.close()

输出:

隐藏   复制代码

#include <iostream>
void main()
{
    std::cout << "0" << std::endl;
    std::cout << "1" << std::endl;
    std::cout << "2" << std::endl;
    std::cout << "3" << std::endl;
    std::cout << "4" << std::endl;
}

利用Python的with关键字,我们可以将语句封装在{}具有正确缩进的自动封闭的语句块中,以使输出保持可读性。

换人

当生成更复杂的代码时,您将很快意识到Python脚本变得越来越难理解,而且各处都有难看的字符串连接。那就是subs方法的所在:

隐藏   复制代码

from CodeGen import *
 
cpp = CppFile("test.cpp")
 
cpp("#include <iostream>")
 
with cpp.block("void main()"):
    for i in range(5):
        with cpp.subs(i=str(i), xi="x"+str(i+1)):
            cpp('int $xi$ = $i$;')
    
cpp.close()

产生:

隐藏   复制代码

#include <iostream>

void main()
{
    int x1 = 0;
    int x2 = 1;
    int x3 = 2;
    int x4 = 3;
    int x5 = 4;
}

替换在with可嵌套的Python 块内有效。

差不多了

最后,这是一个更复杂的示例,生成以下代码:

隐藏   收缩 arrow-up-16.png   复制代码

class ClassX
{
protected:
    A a;
    B b;
    C c;
public:
    ClassX(A a, B b, C c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
    }
    A getA()
    {
        return this->a;
    }
    B getB()
    {
        return this->b;
    }
    C getC()
    {
        return this->c;
    }
};
class ClassY
{
protected:
    P p;
    Q q;
public:
    ClassY(P p, Q q)
    {
        this->p = p;
        this->q = q;
    }
    P getP()
    {
        return this->p;
    }
    Q getQ()
    {
        return this->q;
    }
};

看看CodeGen.py,看看该怎么label功能对于如何将代码与特定语言功能扩展的提示来实现。

隐藏   收缩 arrow-up-16.png   复制代码

from CodeGen import *
 
cpp = CppFile("test.cpp")
 
CLASS_NAMES = ["ClassX", "ClassY"]
VAR_NAMES = { "ClassX": ["A", "B", "C"], 
                      "ClassY": ["P","Q"] }
 
for className in CLASS_NAMES:
    with cpp.subs(ClassName=className):
        with cpp.block("class $ClassName$", ";"):
            cpp.label("protected")
            for varName in VAR_NAMES[className]:
                with cpp.subs(A=varName, a=varName.lower()):
                    cpp("$A$ $a$;")
            cpp.label("public")
            with cpp.subs(**{"A a": ", ".join([x + " " + x.lower() for x in VAR_NAMES[className]])}):
                with cpp.block("$ClassName$($A a$)"):
                    for varName in VAR_NAMES[className]:
                        with cpp.subs(a=varName.lower()):
                            cpp("this->$a$ = $a$;")
            for varName in VAR_NAMES[className]:
                with cpp.subs(A=varName, a=varName.lower(), getA="get"+varName):
                    with cpp.block("$A$ $getA$()"):
                        cpp("return this->$a$;")
    
cpp.close()

/*---------------------------------------------------分割线---------------------------------*/

https://github.com/AxioDL/CodeGen

https://medium.com/%40jasonrigden/jinja2-templating-engine-tutorial-4bd31fb4aea3

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。