모든 Python 코드가 "컴파일"되는지 어떻게 확인할 수 있나요?
-
06-07-2019 - |
문제
내 배경은 C와 C++입니다.나는 Python을 많이 좋아하지만 컴파일된 언어에 익숙할 때 작업하기 정말 어려운 한 가지 측면(그리고 내 생각에 다른 해석 언어)이 있습니다.
Python으로 무언가를 작성하고 이를 실행할 수 있는 지점에 이르렀을 때 언어 관련 오류가 남아 있지 않다는 보장은 여전히 없습니다.나에게 이는 충돌을 피하기 위해 런타임 방어(입력의 엄격한 테스트, 어설션 등)에만 의존할 수 없다는 것을 의미합니다. 왜냐하면 6개월 후에 다른 좋은 코드가 마침내 실행되면 어리석은 오타로 인해 깨질 수 있기 때문입니다. .
분명히 시스템은 모든 코드가 실행되었는지 확인할 수 있을 만큼 충분히 테스트되어야 하지만, 대부분의 경우 내부 스크립트와 작은 도구에 Python을 사용하는데, 물론 필요한 QA 관심을 전혀 받지 못합니다.또한 일부 코드는 너무 간단해서 (배경이 C/C++인 경우) 컴파일만 하면 잘 작동할 것이라는 것을 알 수 있습니다(예:클래스 내부의 getter 메소드, 일반적으로 멤버 변수의 간단한 반환).
그렇다면 내 질문은 분명합니다. (특수 도구 등을 사용하여) Python 스크립트의 모든 코드가 "컴파일"되고 실행되는지 확인할 수 있는 방법이 있습니까?
해결책
다음은 간단한 프로그램의 결과인 pylint의 출력 예입니다.
print a
보시다시피, py_compile은 (의도적으로) 감지하지 않는 정의되지 않은 변수를 감지합니다.
in foo.py:
************* Module foo
C: 1: Black listed name "foo"
C: 1: Missing docstring
E: 1: Undefined variable 'a'
...
|error |1 |1 |= |
"모든 라인"을 다루더라도 테스트가 충분하지 않은 이유에 대한 간단한 예:
bar = "Foo"
foo = "Bar"
def baz(X):
return bar if X else fo0
print baz(input("True or False: "))
편집하다:PyChecker가 나를 위해 삼항을 처리합니다:
Processing ternary...
True or False: True
Foo
Warnings...
ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()
다른 팁
다른 사람들은 꽤 좋은 PyLint와 같은 도구를 언급했지만, 장단점은 단순히 100%를 수행하는 것이 불가능하다는 것입니다.사실, 하고 싶지 않을 수도 있습니다.Python의 역동성에 대한 이점 중 하나는 사전 액세스를 통해 로컬 범위에 이름을 삽입하는 것과 같은 미친 작업을 수행할 수 있다는 것입니다.
결론은 컴파일 타임에 유형 오류를 잡는 방법을 원한다면 Python을 사용해서는 안 된다는 것입니다.언어 선택에는 항상 일련의 균형이 필요합니다.C 대신 Python을 선택하는 경우 더 빠른 개발, 더 나은 문자열 조작 등을 위해 강력한 유형 시스템을 사용하고 있다는 점에 유의하세요.
나는 당신이 찾고 있는 것이 코드 테스트 라인 범위라고 생각합니다.모든 코드 줄 또는 시간이 있는 만큼 테스트를 받을 수 있도록 스크립트에 테스트를 추가하고 싶습니다.테스트는 엄청난 작업이지만, 원하는 확신을 원한다면 공짜 점심은 없습니다. 죄송합니다. :( .
Eclipse를 사용하는 경우 파이데프 IDE로서 빨간색 물결선으로 즉시 많은 오타를 표시할 수 있으며 Pylint 통합도 있습니다.예를 들어:
foo = 5
print food
"정의되지 않은 변수:음식".물론 이것이 항상 정확하지는 않지만(아마도 음식은 setattr 또는 기타 이국적인 기술을 사용하여 이전에 정의되었을 수 있음) 대부분의 경우 잘 작동합니다.
일반적으로 코드가 실제로 정적인 정도까지만 코드를 정적으로 분석할 수 있습니다.코드가 더 동적일수록 자동화된 테스트가 더 많이 필요합니다.
코드를 실행하면 실제로 컴파일되며, 코드에 구문 오류가 있으면 Python 런타임에서 오류가 발생합니다.C/C++ 또는 Java와 같은 정적으로 컴파일된 언어와 비교할 때 변수 이름과 유형이 올바른지 확인하지 않습니다.자동화된 테스트 포함).