用于确定所需的最低Python版本的工具是什么?

54

有类似于Pylint的工具吗?它能够查看Python脚本(或运行它),并确定每行代码(或函数)需要哪个版本的Python。

例如,理论上的使用方式:

$ magic_tool <EOF
with something:
    pass
EOF
1: 'with' statement requires Python 2.6 or greater

$ magic_tool <EOF
class Something:
    @classmethod
    def blah(cls):
        pass
EOF
2: classmethod requires Python 2.2 or greater
$ magic_tool <EOF
print """Test
"""
EOF
1: Triple-quote requires Python 1.5 of later

这种事情可能吗?我想最简单的方法就是将所有Python版本都放在磁盘上,使用每个版本运行脚本,看看会出现什么错误。


3
这是一个很棒的问题。最近我也在寻找类似的内容。 - Zifre
肯定是可能的。然而,很可能还没有被实现。 - lothar
4
好的问题。在连续的 Python 版本中运行大型项目并不是十分明确的,除非你有比如说神奇地实现了 100% 代码覆盖率的单元测试,所以拥有这样一个工具会很不错。 - Jarret Hardie
3个回答

41

受到这个优秀问题的启发,我最近编写了一个脚本来尝试实现这一功能。您可以在pyqver上找到它。

它相当完整,但仍有一些方面尚未处理(如README文件中所述)。随意fork并改进它!


9

来自Greg Hewgill的工具pyqver已经有一段时间没有更新了。

vermin是一个类似的实用工具,在详细模式(-vvv)下显示哪些行被考虑在内。

% pip install vermin
% vermin -vvv somescript.py
Detecting python files..
Analyzing using 8 processes..
!2, 3.6      /path/to/somescript.py
  L13: f-strings require 3.6+
  L14: f-strings require 3.6+
  L15: f-strings require 3.6+
  L16: f-strings require 3.6+
  print(expr) requires 2+ or 3+

Minimum required versions: 3.6
Incompatible versions:     2

加分项:通过参数-t=V,您可以定义目标版本V,以便与其兼容。如果未满足此版本要求,则脚本将以退出代码1退出,使其易于集成到测试套件中。


这个工具太棒了。强烈推荐使用。 - Mitch McMabers

8
不是一个实际有用的答案,但我还是会尽力而为。我认为这应该是可以做到的(虽然可能需要一些练习),例如您可以确保您拥有要检查的所有官方语法版本,比如这个
然后解析以第一个语法版本开头的代码片段。 接下来,您需要一个类似的内置模块命名空间映射,并再次解析代码,从最早的版本开始,尽管区分内置模块和外部模块或介于两者之间的模块(如ElementTree)可能有些棘手。
结果应该是支持代码语法的版本概述以及模块的概述以及需要使用哪个版本(如果有的话)。通过该结果,您可以计算出最佳的最低和最高版本。

1
对于像这样尝试任务的大学生,以及你在使用ElementTree示例时提到的困难的评论,我给予+1。这个问题几乎暗示了静态分析,正如你所指出的那样,对于动态语言来说非常难以实现。Python偶尔使用"from future import blah",这使得它变得更加困难。再加上鸭子类型 :-) 你的回答很好,介绍了所有这些棘手的问题。 - Jarret Hardie
看看我对这个问题的新回答,我编写了一个脚本,试图确定所需的最低Python版本。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接