在我当前的工作环境中,我们产生了大量供内部使用的Python包(如果不是100,则为10)。每个程序包都有一些依赖项,通常依赖于内部和外部程序包的混合,并且其中一些依赖项是共享的。

随着我们接近dependency hell,更新依赖项成为一个耗时的过程。尽管我们关心的是新版本可能会引入的功能更改,但同样重要的API更改也会破坏代码。

尽管针对较新版本的依赖项运行单元/集成测试有助于我们发现一些问题,但我们的覆盖率还不足100%,无法使其成为可靠的策略。发行说明和变更日志可帮助您从高层识别主要变更,但是内部开发的工具很少存在这些变更,也没有足够详细的内容来了解​​新版本对(公共(public))API的影响。

我正在寻找使该过程自动化的方法。

我希望能够自动比较两个版本的Python包并报告它们之间的API差异。特别是,这将包括向后不兼容的更改,例如删除函数/方法/类/模块,向函数/方法/类添加位置参数以及更改函数/方法返回的项数。作为开发人员,基于生成的报告,我应该对该版本更改将带来的代码级含义有更深入的了解,因此需要时间进行集成。

在其他地方,我们使用C++ abi-compliance-checker并正在研究Java api-compliance-checker来帮助完成此过程。是否有适用于Python的类似工具?我发现了很多 Lint /分析/重构工具,但是没有任何工具可以提供这种级别的功能。我了解Python的动态类型将使全面的报告成为不可能。

如果不存在这样的工具,那么它们是否有任何可以帮助实现解决方案的库?例如,我当前的方法是使用ast.NodeVisitor遍历包并构建一棵树,其中每个节点代表一个模块/类/方法/函数,然后将该树与同一包的另一个版本的树进行比较。

编辑:自发布问题以来,我发现pysdiff涵盖了我的一些要求,但仍希望看到替代方法。

编辑:还发现Upstream-Tracker是我想最终获得的这类信息的一个很好的例子。

最佳答案

使用AST模块解析文件呢?

import ast

with file("test.py") as f:
    python_src = f.read()

    node = ast.parse(python_src) # Note: doesn't compile the src
    print ast.dump(node)

ast节点上有walk方法(描述了http://docs.python.org/2/library/ast.html)

astdump可能有效(在pypi上可用)

这款过时的 pretty-print
http://code.activestate.com/recipes/533146-ast-pretty-printer/

文档工具Sphinx还会提取您要查找的信息。也许看看。

因此,对AST进行遍历,并用所需的信息构建一棵树。有了树后,您可以将其腌制并稍后进行比较,或将树转换为文本表示形式。
您可以使用difftools或某些外部diff程序进行比较的文本文件。

ast具有parse()和compile()方法。唯一的事情是我不确定在解析后有多少可用信息(因为您不想compile())。

关于Python API兼容性检查器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21924287/

10-12 21:13