2016-10-21 65 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()'時仍然會出現語法錯誤,所以不需要在評論中指出。 :) –