IT박스

assert가 많이 사용되지 않는 이유는 무엇입니까?

itboxs 2020. 12. 12. 10:16
반응형

assert가 많이 사용되지 않는 이유는 무엇입니까?


파이썬의 assert 문절대 일어나서안되는 상황을 포착하는 좋은 방법 이라는 것을 알았 습니다 . 그리고 코드가 정확하다고 신뢰할 때 Python 최적화로 제거 할 수 있습니다.

디버그 모드에서 Python 애플리케이션을 실행하는 완벽한 메커니즘 인 것 같습니다. 그러나 django, twisted 및 zope와 같은 여러 Python 프로젝트를 살펴보면 assert거의 사용되지 않습니다. 그렇다면 왜 이런 일이 발생합니까?

Python 커뮤니티에서 asserts 문이 자주 사용되지 않는 이유는 무엇입니까?


assert자주 사용되지 않는 주된 이유 아무도 Python의 "최적화 된"모드를 사용하지 않기 때문이라고 생각 합니다 .

어설 션은 프로그래밍 실수를 감지하고 예기치 않은 상황으로부터 자신을 보호하기위한 훌륭한 도구이지만이 모든 오류 검사에는 비용이 따릅니다. C / C ++와 같은 컴파일 된 언어에서는 어설 션이 디버그 빌드에서만 활성화되고 릴리스 빌드에서 완전히 제거되므로 이것은 실제로 중요하지 않습니다.

반면에 Python에서는 디버그 모드 릴리스 모드 사이에 엄격한 구분이 없습니다 . 인터프리터에는 "최적화 플래그"( -O)가 있지만 현재 이것은 실제로 바이트 코드를 최적화하지 않고 어설 션 만 제거합니다.

따라서 대부분의 Python 사용자는 -O플래그를 무시하고 "정상 모드"에서 스크립트를 실행합니다.이 모드는 어설 션이 활성화되고 이므로 "프로덕션 준비"로 간주 되기 때문에 일종의 디버그 모드 입니다.__debug__True

기본적으로 "최적화"하고 명시 적 디버그 모드 (*)에서만 어설 션을 활성화하는 등 논리를 전환하는 것이 더 현명 할 수 있지만, 이로 인해 많은 사용자가 혼란을 겪을 수 있으며 이러한 변경 사항을 볼 수 있을지 의심 스럽습니다. .

((*) 이것은 예를 들어 -ea(어설 션 활성화) 스위치를 사용 하여 Java VM이 수행하는 방식 입니다.)


몇 가지 이유가 떠 오릅니다 ...

주요 기능이 아닙니다.

많은 프로그래머는 이론적 근거에 얽매이지 않고 프로그램의 두 번째 기능에 직접 참여하지 않는 모든 것을 무시합니다. assert 문은 디버깅과 테스트를위한 것이며, 따라서 그들이 감당할 수없는 사치입니다.

단위 테스트

단언 문은 단위 테스트의 상승과 상승보다 앞서 있습니다. assert 문이 여전히 그 용도를 가지고 있지만, 유닛 테스트는 이제 서브 루틴과 그 시스템에서 쓰레기를 제거하는 적대적인 환경을 구축하는 데 널리 사용됩니다. 이러한 조건에서 주장 진술은 총격전에서 칼처럼 느껴지기 시작합니다.

테스트에 대한 업계 존중 향상

assert 문은 최후의 방어선 역할을합니다. 새로운 "방어 프로그래밍"을 구현하기위한 좋은 방법으로서 C 언어가 세계를 지배했을 때 그것은 C 언어 하에서 고상하고 만질 수없는 높이로 올라갔습니다. 그것은 위기에 처한 순간 재앙적인 재난을 인식하고 가두어 둡니다. 이것은 테스팅의 가치가 널리 인정되고 존중되기 전이고 재난이 훨씬 더 흔했습니다.

오늘날 심각한 상용 소프트웨어가 어떤 형태로든 테스트없이 출시되는 것은 전례가 없습니다. 테스트는 진지하게 받아 들여지고 방대한 분야로 발전했습니다. 큰 체크리스트와 공식 승인을받은 테스트 전문가와 품질 보증 부서가 있습니다. 이러한 조건에서 프로그래머는 자신의 코드가 너무 지루한 테스트를 거쳐 엉뚱한 재난 직전 조건의 가능성이 무시할 수있을 정도로 멀다는 확신을 가지고 있기 때문에 어설 션에 신경 쓰지 않는 경향이 있습니다. 그렇다고 그들이 옳다는 말은 아니지만 게으른 프로그래밍에 대한 책임이 QA 부서로 옮겨 질 수 있다면 대체 왜 안 될까요?


나는 그러한 프로젝트의 저자가 아니기 때문에 이것은 내 경험을 바탕으로 한 추측 일뿐입니다. 이러한 프로젝트에 참여하는 사람들에게 직접 질문하지 않으면 구체적인 답을 얻지 못할 것입니다.

Assert는 자체 애플리케이션에서 디버깅 등을 수행하려고 할 때 유용합니다. 그러나 제공 한 링크에 명시된 바와 같이 조건부 사용은 애플리케이션이 상태를 예측하고 복구 할 수있을 때 더 좋습니다. 나는 zope를 사용하지 않았지만 Twisted와 Django 모두에서 그들의 응용 프로그램은 코드의 많은 오류에서 복구하고 계속할 수 있습니다. 어떤 의미에서 그들은 실제로 처리 할 수 ​​있기 때문에 이미 주장을 '컴파일'했습니다.

이와 관련된 또 다른 이유는 나열한 것과 같은 외부 라이브러리를 사용하는 애플리케이션이 오류 처리를 원할 수 있다는 것입니다. 라이브러리가 단순히 어설 션을 사용하는 경우 오류가 무엇이든 상관없이 AssertionError. 조건부로 라이브러리는 실제로 애플리케이션이 포착하고 처리 할 수있는 유용한 오류를 발생시킬 수 있습니다.


내 경험에 따르면 asserts는 주로 프로그램의 개발 단계에서 사용자 정의 입력을 확인하는 데 사용됩니다. asserts는 프로그래밍 오류를 포착하는 데 실제로 필요하지 않습니다. 파이썬 자체는 그런 ZeroDivisionError, TypeError정도의 진짜 프로그래밍 오류를 잡아낼 수 있습니다.

참고 URL : https://stackoverflow.com/questions/9097706/why-assert-is-not-largely-used

반응형