0

如何静态确定 Python 源文件是否支持 Python 3?

如那里所述,这个问题可能无法回答,所以我会更具体:

我的应用程序是选择一个不会产生虚假 SyntaxErrors 的 flake8 版本来运行。出于这个原因,我正在寻找(至少)一些启发式方法来告诉我是应该运行 flake8 的 Python 3 副本还是 Python 2 副本。

我正在使用我的编辑器中的 flake8,它会在我键入时显示 lint 错误,而且我最担心的是有时我会丢失命名错误(例如 F821),这是 pyflakes/flake8 认为某事的副作用是一个语法错误,实际上是正确的语法:当它遇到语法错误时(可以理解)似乎放弃了命名错误之类的东西。

4

2 回答 2

3

这几乎是不可能的。有太多的代码路径需要测试。

此外,可以编写代码以在 Python 2 和 3 上运行并且 flake8 并不总是喜欢使这成为可能的技巧,除非项目专门使用 flake8 进行测试并将这些站点标记为排除在外。因此,您可能会出现误报(flake8 的 Python 2 和 Python 3 版本中的错误),或者代码将简单地在 Python 2 和 3 上运行而没有任何警告。

您可以使用它tox来管理给定项目的版本支持;让 tox 弄清楚要使用什么 flake8 命令(可能是多个):

[tox]
envlist = py27,py35,flake8-27,flake8-35

# ...
[testenv:flake8-27]
basepython=python2.7
deps=flake8
commands=
flake8 projectdir

[testenv:flake8-35]
basepython=python3.5
deps=flake8
commands=
flake8 projectdir

并使用tox -e flake8-27tox -e flake8-35

于 2016-10-21T17:33:21.290 回答
0

如果您只关心SyntaxError(您在问题中特别提到),您可以简单地尝试使用 Python 2 和 3 编译文件:

python -m compileall
python3 -m compileall

如果这些命令中的任何一个失败,您至少知道该代码不适用于该 Python 版本。反过来当然不正确:如果代码在特定版本的 Python 中编译,那并不能保证它在该版本的 Python 中可以正常工作。它只是告诉你没有SyntaxErrors。

于 2016-10-21T18:08:56.737 回答