52

有没有类似于 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 版本放在光盘上,对每个版本运行脚本,看看会发生什么错误。

4

3 回答 3

41

受这个优秀问题的启发,我最近编写了一个尝试执行此操作的脚本。你可以在 github 上的pyqver上找到它。

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

于 2009-05-04T10:55:39.980 回答
8

不是一个实际有用的答案,但无论如何它都在这里。我认为这应该是可行的(尽管可能是一个相当大的练习),例如,您可以确保您拥有要检查的版本的所有官方语法,例如这个

然后从第一个语法版本开始解析那段代码。接下来,您需要所有内置模块名称空间的类似映射,并从最早的版本开始再次解析代码,尽管区分内置模块和外部模块或介于两者之间的模块(如 ElementTree)可能很棘手。

结果应该是支持代码语法的版本的概述和模块的概述以及使用它需要哪个版本(如果有的话)。使用该结果,您可以计算出最佳的最低和最高版本。

于 2009-04-30T00:35:46.027 回答
5

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,使其易于集成到测试套件中。

于 2019-10-22T09:07:28.760 回答