2016-10-21 60 views
0

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

的问题是不可能的回答,因为说有,所以我会更具体:

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

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

+0

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

+0

'if re.findall(“print [^(] + ['\”],file_text)> 0:print“PY2”'...虽然它可能不能保证它总是正确的... –

+1

@JoranBeasley: 'from __future__ import print_function',或者简单地使用'print(...)'作为单个值的事情。 –

回答

2

这几乎不可能。有太多的代码路径要测试。此外,代码可以被编写为在上运行,两者都是 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

+0

这里的麻烦事是flake8似乎停止发射,例如F821未定义的名称 - 这通常是pyflakes/flake8发送的天赐之物 - 当它遇到SyntaxError时,所以看起来这个令人难以置信的有用的特性可能是在处理2 vs 3时丢失了,默默无闻?对该特定问题有任何建议? –

+0

@CroadLangshan:SyntaxError异常使整个文件无效;文件不能被分析成任何可以进一步分析的东西。关于这一点,我很害怕。不flake8有退出代码? –

0

如果你只关心SyntaxError(你明确你的问题中提到),你可以简单地尝试编译的文件与Python 2和3:

python -m compileall 
python3 -m compileall 

如果这些命令失败,则可以在最不知道该代码不适用于该Python版本。反之,当然并非如此:如果代码是在特定版本的Python中编译的,那么并不能保证它能在该版本的Python中正常工作。它只是告诉你没有SyntaxError s。

+0

我知道在使用'eval()'或'exec()'时仍然会出现语法错误,所以不需要在评论中指出。 :) –