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

dbr*_*dbr 48 python code-analysis

是否有类似于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
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?我想最简单的方法是在光盘上安装所有Python版本,运行每个版本的脚本,看看发生了什么错误.

Gre*_*ill 41

受到这个优秀问题的启发,我最近整理了一个尝试这样做的脚本.你可以在pyqver的 github上找到它.

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


Mar*_*wig 8

不是一个真正有用的答案,但无论如何它都在这里.我认为这应该是可行的(尽管可能是一个练习),例如,你可以确保你拥有你想要检查的版本的所有官方语法,就像这个.

然后解析从第一个语法版本开始的代码.接下来,您需要一个类似的所有内置模块命名空间的映射,并从最早的版本开始再次解析代码,尽管区分内置模块和外部模块或者像ElementTree之间的某些模块可能很棘手.

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


Sam*_*uel 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
Run Code Online (Sandbox Code Playgroud)

奖励:使用该参数,-t=V您可以定义V要与之兼容的目标版本。如果不满足此版本要求,脚本将以退出代码退出1,使其易于集成到测试套件中。