删除函数内容的 Pythonic 方法
Posted
技术标签:
【中文标题】删除函数内容的 Pythonic 方法【英文标题】:Pythonic way to remove a function's contents 【发布时间】:2015-02-24 11:03:36 【问题描述】:我想解析一个目录树,找到每个*.cpp
,然后剔除函数,给我留下模拟。
解析树没问题。取出内脏比较困难。
我目前正在将源文件读入一个字符串并逐个字符地循环它。如果我看到一个封闭的圆括号 )
并且下一个非空白字符是一个左括号 那么我有一个函数 start。
然后我可以停止写入输出,同时计算左大括号和右大括号,直到在函数末尾找到匹配的大括号 。
代码很糟糕,有漏洞,并且不断变化,因此几乎不值得发布。
是否有一个优雅的解决方案,可能涉及正则表达式,它将删除文件中所有函数的主体,保持其余部分不变?
如果它可以检测到函数的类型并生成一个返回语句,那么我可以自己解决这个问题。
【问题讨论】:
“剔除功能”,多么好的程序! 正则表达式在嵌套块中很糟糕,例如
和 ()
。相关问题:***.com/questions/1444961/…
C++ 不是常规语言,而是上下文无关语言。你需要一个合适的解析器,正则表达式会让你的麻烦更大。
如果您使用处理递归的新正则表达式模块,这是可能的(并且使用精心设计的模式很快)。但是你不能用 re 模块做到这一点。您是否搜索过 C++ 解析器模块是否已经存在,或者您是否尝试过词法分析器模块?但是,改进您已经编写的代码可能是一种方式。
@Lucho:很容易避免这种情况,以避免将某些内容包含在字符串中。您只需要在之前匹配它们即可。
【参考方案1】:
您可以使用解析器,clang api 提供它并且您有 python 绑定:https://github.com/llvm-mirror/clang/tree/master/bindings/python
这篇文章可以给你一些关于如何使用它的见解:http://szelei.me/code-generator/
还有一些包装器可以让您的工作更轻松,例如:https://github.com/sztomi/cmonster
【讨论】:
以上是关于删除函数内容的 Pythonic 方法的主要内容,如果未能解决你的问题,请参考以下文章
模块函数 vs 静态方法 vs 类方法 vs 无装饰器:哪个成语更 Pythonic?