2016-10-21 1 views
0

파이썬 소스 파일이 파이썬 3을 지원하는지 어떻게 정적으로 판단 할 수 있습니까?소스 파일이 flake8에 대해 python 3을 지원하는지 여부를 정적으로 결정하는 방법은 무엇입니까?

문제가 언급 한 바와 같이 대답하는 것이 불가능할 수 있으므로 좀 더 구체적 것 : 이것에 대한

내 응용 프로그램은 가짜 SyntaxErrors를 제공하지 않습니다 실행 flake8의 버전을 선택하는 것입니다. 이런 이유로 필자는 (적어도) flake8 또는 Python 2 복사본의 Python 3 복사본을 실행할지 여부를 알려주는 추론을 찾고 있습니다.

필자는 필자가 작성한 lint 오류를 보여주는 필자의 flake8을 사용하고 있으며, 때로는 필자의 이름 인 F821과 같은 이름 오류를 잃어 버리는 경우가 많다. flake8 뭔가 문법 오류가 실제로 구문 올바른지 생각 : 구문 오류가 발생하면 (이해할 수 있음) 명명 오류 같은 것들을 포기하는 것으로 보입니다.

+0

이것은 근처 불가능합니다. 테스트 할 코드 경로가 너무 많습니다. –

+0

'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] 
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-27 또는 tox -e flake8-35를 사용 독극물는 (복수 일 수 있음)를 사용하는 명령을 flake8 알아낼했다. 에서 이러한 명령 중 하나가 실패하면

python -m compileall 
python3 -m compileall 

을 : 당신이 약 SyntaxError (특별히 귀하의 질문에 언급되는)을, 당신은 단순히 파이썬 2와 3을 사용하여 파일을 컴파일 할 수 있습니다 관심이 있다면

+0

성가신 사실은 flake8이 예를 들어 Pyflakes/flake8에 의해 보내지는 F821의 정의되지 않은 이름 - SyntaxError에 부딪 힐 때 나타나는 것을 멈추는 것처럼 보인다는 것입니다. 그래서 믿을 수 없을만큼 유용한 특징이 될 수 있습니다. 분실, 조용히, 2 대 3 처리 할 때 특정 문제에 대한 조언? –

+0

@CroadLangshan : SyntaxError 예외가 전체 파일을 무효화하므로 파일을 분석 할 수있는 것으로 해석 할 수 없습니다. 그것에 대해, 나는 두렵다. flake8에 종료 코드가 없습니까? –

0

코드가 파이썬 버전에서 작동하지 않는다는 것을 최소한 아십시오. 반대의 경우는 사실이 아닙니다 : 특정 버전의 Python에서 코드가 컴파일된다고해서 해당 버전의 Python에서 올바르게 작동한다는 보장은 없습니다. 단지 SyntaxError이 없음을 알려줍니다.

+0

'eval()'또는'exec()'을 사용할 때 여전히 구문 오류가 발생할 수 있으므로 주석에서이를 지적 할 필요가 없음을 알고 있습니다. :) –

관련 문제