当前位置: 代码迷 >> python >> 注释 C 用基于列表的 python 定义
  详细解决方案

注释 C 用基于列表的 python 定义

热度:87   发布时间:2023-07-16 11:15:19.0

我正在尝试将 python 脚本应用于某个C文件,以便注释其中的一些定义。

我的目标是改变这个:

#define D_FOO
D_ADD_TEST(foo)
#define D_BAR
D_ADD_TEST(bar)

进入这个:

//#define D_FOO
//D_ADD_TEST(foo)
#define D_BAR
D_ADD_TEST(bar)

注释的定义存储在我的 python 脚本的列表中:

> cat myscript.py
#!/usr/bin/env python

var_bar = ['D_FOO']

[Insert the rest of the code here]

我可以尝试什么?

编辑:

结合@sKwa 的回答和一些反复试验,我得到了这个代码:

def comment_define(source, destination, tokens):
    with open(source, 'r') as src, open(destination, 'w') as dst:
        for line in src:
            for token in tokens:
                if "#define D_" + token.upper() in line or "#define\tD_" + token.upper() in line:
                    line = '//{}//{}'.format(line, next(src))
            dst.write(line)

其中,当使用此输出运行( comment_define(foo.c, bar.c, tokens) )时

#define D_ITOA
    D_ADD_TEST(itoa);
#define D_STRTRIM
    D_ADD_TEST(strtrim);
#define D_LSTNEW
    D_ADD_TEST(lstnew);
#define D_LSTDELONE
    D_ADD_TEST(lstdelone);
#define D_LSTDEL
    D_ADD_TEST(lstdel);
#define D_LSTADD
    D_ADD_TEST(lstadd);
#define D_LSTITER
    D_ADD_TEST(lstiter);
#define D_LSTMAP
    D_ADD_TEST(lstmap);

tokens = ['lstnew', 'lstdelone', 'lstdel', 'lstadd', 'lstiter', 'lstmap']

输出:

//#define   D_LSTNEW
//  D_ADD_TEST(lstnew);
////#define D_LSTDELONE
//  D_ADD_TEST(lstdelone);
//#define   D_LSTDEL
    D_ADD_TEST(lstdel);
//#define   D_LSTADD
//  D_ADD_TEST(lstadd);
//#define   D_LSTITER
//  D_ADD_TEST(lstiter);
//#define D_LSTMAP
//  D_ADD_TEST(lstmap);

为什么有些评论两次? 为什么完全没有评论?

如果你试试这个怎么办?

#!/usr/bin/env python3

import re

TKNS=['lstnew', 'lstdelone', 'lstdel', 'lstadd', 'lstiter', 'lstmap']
SRC='test.c'
DST='testbis.c'

def comment_define(source, destination, tokens):
    with open(source, 'r') as src, open(destination, 'w') as dst:
        for line in src:
            for token in tokens:
                if re.match('#define\s+D_%s' % token.upper(), line):
                    line = '//{}//{}'.format(line, next(src))
                    break
            dst.write(line)

if __name__ == '__main__':
    comment_define(SRC, DST, TKNS)

这是基于@sKwa 的回答,但他在我建议添加break之前将其删除(因此可能对同一行进行两次评论)。

我用一些正则表达式匹配替换了in运算符。