Python 如何对没有文档的程序进行反向工程

Python 如何对没有文档的程序进行反向工程,python,open-source,Python,Open Source,我有一个python程序的源代码,它没有任何文档或注释。 我确实试过两次去理解它,但大多数时候我都迷失了方向,因为有很多文件。 要全面、快速地理解该程序,应该采取哪些步骤。我从一个好的python IDE开始。请参阅的答案。 在过去,我习惯于理解源代码结构 使用调试器(例如pdb)通过 密码 试着在一天后再次读取代码 休息,这也有帮助 我建议使用epydoc生成一些文档。当然,如果不存在docstring,结果会很差,但它会为您的应用程序提供至少一个视图,并且您将能够更轻松地在类中导航 然后,当

我有一个python程序的源代码,它没有任何文档或注释。 我确实试过两次去理解它,但大多数时候我都迷失了方向,因为有很多文件。
要全面、快速地理解该程序,应该采取哪些步骤。

我从一个好的python IDE开始。请参阅的答案。

  • 在过去,我习惯于理解源代码结构
  • 使用调试器(例如pdb)通过 密码
  • 试着在一天后再次读取代码 休息,这也有帮助

我建议使用epydoc生成一些文档。当然,如果不存在docstring,结果会很差,但它会为您的应用程序提供至少一个视图,并且您将能够更轻松地在类中导航

然后,当您了解一些新内容时,您可以尝试自己编写文档,然后再次重新生成文档。开始一件事永远不会太晚


我希望这能有所帮助。我在工作中做了很多这方面的工作。对我有效的可能与对你有效的不同,但我将分享我的经验

我首先尝试识别正在使用的数据结构,并绘制图表来显示它们之间的关系。不一定是像UML这样的形式化的东西,而是一个你能理解的纸上的草图,它允许你看到被程序操作的数据的整体结构。只有当我对所使用的数据结构有了一些了解之后,我才开始尝试理解数据是如何被操纵的

其次,对于一个庞大的软件体,有时您需要首先攻击一些小的部分。你不会马上得到一个全面的理解,但是如果你理解了小部分的细节,并不断地删减,最终所有的部分都会结合在一起

我将这两种方法结合起来,当我感到极度沮丧或无聊时,我会在这两种方法之间切换。建议定期在街区内散步:)我发现这最终会给我带来好的效果

祝你好运

“”是这类努力的极好起点——并不特别依赖于语言(他的例子使用了几种非python语言,但技术和思维方式确实很好地扩展到了python和几乎任何其他语言)

关键的焦点是,您希望出于某种原因理解代码,即修改和/或移植代码。因此,在漫长而艰难的过程中,使用电池、测试脚手架和跟踪/日志记录来检测遗留代码是安全、负责地理解和修改代码的关键途径


Feathers建议了一些启发式方法和技术,用于在代码完全混乱(因此是“遗留”)的情况下将精力集中在何处以及如何开始—没有文档,或者误导性的文档(描述与代码实际做的事有很大不同,可能以微妙的方式),没有测试,一个不可重构的混乱的意大利面条依赖。这似乎是一个极端的情况,但任何在编程方面花了很长时间的人都知道这实际上比任何人想的都要普遍;-)

幸运的是,它是用Python编写的,易于阅读。但是,当然也可以用Python编写复杂的、难以理解的代码

这些步骤是:

  • 运行软件并学习使用它,至少稍微了解一下它的功能
  • 通读测试(如果有)
  • 通读代码
  • 当你遇到你不理解的代码时,在那里放一个调试中断,然后一步一步地检查代码,看看它做了什么
  • 如果没有任何测试,或者测试覆盖率低,则编写测试以增加测试覆盖率。这是学习系统的好方法
  • 重复上述步骤,直到你感觉自己对代码有了模糊的把握。如果要管理代码,只需要模糊的抓地力。一旦你开始实际使用代码,你就会掌握得很好。对于一个可能需要数年时间的大系统,所以不要试图首先理解它
  • 有一些工具可以帮助你。正如Stephen C所说,IDE是个好主意。我会解释原因:

    许多编辑分析代码。这通常会使您完成代码,但更重要的是,在这种情况下,只需按住ctrl键并单击变量即可查看其来源。当您想要理解Other代码时,这确实会加快速度

    此外,您还需要学习调试器。在代码的复杂部分,您必须在调试器中逐步完成它们,以查看代码的实际功能。Pythons pdb可以工作,但许多IDE都有集成的调试器,这使得调试更容易


    就这样。祝你好运。

    Sparx Systems非常擅长处理源目录和生成类图。它不是免费的,但价格非常合理。(我与这家公司没有任何关系,我只是多年来一直是他们产品的满意用户。)

    Logilab的pyreverse和Andy Bulka的PyNSource对于UML图的生成也很有帮助。

    +1我想知道有多少人因为说“去阅读有效地使用遗留代码”而获得了分数这是一个非常普遍的问题。。