我正在尝试学习如何对一些不必要的复杂代码进行模糊处理。例如,我希望能够重写以下代码行:

return ('d' + chr(101) + chr(97) + chr(200 - 100)) # returns 'dead'


至:

return 'dead'


因此,基本上,我需要评估py文件中的所有文字,包括评估为简单整数的复杂表达式。我如何着手编写此阅读器/是否存在可以做到这一点的东西?谢谢!

最佳答案

您想要的是一个程序转换系统(PTS)。

这是一个用于将源代码解析为AST,转换树然后从树中重新生成有效源代码的工具。有关某些背景,请参见rewriting Python text上我的SO答案。

使用像(我公司的)DMS Software Reengineering Toolkiit这样的PTS,您可以编写规则来进行恒定折叠,这实际上意味着进行编译时算法。

对于您显示的示例,以下规则可以完成OP的示例:

     rule fold_subtract_naturals(n:NATURAL,m:NATURAL): sum->sum =
        " \n + \m " ->  " \subtract_naturals\(\n\,\m\) ";

     rule convert_chr_to_string(c:NATURAL): term->term =
       " chr(\c) " -> make_string_from_natural(c) ;

     rule convert_character_literal_to_string(c:CHARACTER): term->term =
       " \c " -> make_string_from_character(c) ;

     rule fold_concatenate_strings(s1:STRING, s2:STRING): sum->sum =
        " \s1 + \s2 " ->  " \concatenate_strings\(\s1\,\s2\) ";

     ruleset fold_strings = {
          fold_subtract_naturals,
          convert_chr_to_string,
          convert_characater_to_string,
          fold_concatenate_strings };


每个单独的规则都与相应的语法/树匹配。它们以仅适用于文字常量的方式编写。

fold_add_naturals查找通过加法运算连接的NATURAL对常量,并使用内置函数将其替换为sum,该内置函数将两个值相加并生成包含该和的文字值节点。

convert_chr_to_string将chr(c)转换为相应的字符串文字。

convert_character_to_string将“ C”转换为相应的字符串“ C”。

fold_concatenate_strings组合了两个文字字符串,由加号运算符分隔。它的工作方式类似于fold_add_naturals的工作方式。

DMS中内置了subtract_naturals和concatenate_strings。需要使用DMS的元编程语言PARLANSE对convert_chr_to_string和convert_character_to_string进行自定义编码,但是这些例程非常简单(也许10行)。

规则集将规则集打包在一起,以便可以全部应用。
没有显示打开文件,调用解析器,调用规则集转换器的基本代码(应用规则直到没有规则适用)。最后一步是调用prettyprinter重新打印修改后的AST。

许多其他PTS也提供类似的功能。

关于python - 去混淆:简化Python3表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40229632/

10-12 16:57