문제

내 배경은 C와 C++입니다.나는 Python을 많이 좋아하지만 컴파일된 언어에 익숙할 때 작업하기 정말 어려운 한 가지 측면(그리고 내 생각에 다른 해석 언어)이 있습니다.

Python으로 무언가를 작성하고 이를 실행할 수 있는 지점에 이르렀을 때 언어 관련 오류가 남아 있지 않다는 보장은 여전히 ​​없습니다.나에게 이는 충돌을 피하기 위해 런타임 방어(입력의 엄격한 테스트, 어설션 등)에만 의존할 수 없다는 것을 의미합니다. 왜냐하면 6개월 후에 다른 좋은 코드가 마침내 실행되면 어리석은 오타로 인해 깨질 수 있기 때문입니다. .

분명히 시스템은 모든 코드가 실행되었는지 확인할 수 있을 만큼 충분히 테스트되어야 하지만, 대부분의 경우 내부 스크립트와 작은 도구에 Python을 사용하는데, 물론 필요한 QA 관심을 전혀 받지 못합니다.또한 일부 코드는 너무 간단해서 (배경이 C/C++인 경우) 컴파일만 하면 잘 작동할 것이라는 것을 알 수 있습니다(예:클래스 내부의 getter 메소드, 일반적으로 멤버 변수의 간단한 반환).

그렇다면 내 질문은 분명합니다. (특수 도구 등을 사용하여) Python 스크립트의 모든 코드가 "컴파일"되고 실행되는지 확인할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

보다 파이체커 그리고 PyLint.

다음은 간단한 프로그램의 결과인 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와 같은 정적으로 컴파일된 언어와 비교할 때 변수 이름과 유형이 올바른지 확인하지 않습니다.자동화된 테스트 포함).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top