[python] 파이썬에서 “어설 션”의 용도는 무엇입니까?

나는 몇 가지 소스 코드를 읽고 여러 곳에서의 사용법을 보았습니다 assert.

정확히 무엇을 의미합니까? 사용법은 무엇입니까?



답변

assert문장은 거의 모든 프로그래밍 언어로 존재합니다. 나중에 다른 작업의 부작용으로 발생하기보다는 원인이 분명한 프로그램의 문제를 조기에 감지하는 데 도움이됩니다.

당신이 할 때 …

assert condition

… 프로그램에 해당 조건을 테스트하라고 지시하고 조건이 거짓이면 즉시 오류를 트리거합니다.

파이썬에서는 대략 다음과 같습니다.

if not condition:
    raise AssertionError()

파이썬 쉘에서 사용해보십시오 :

>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

어설 션에는 선택적 메시지가 포함될 수 있으며 인터프리터를 실행할 때 비활성화 할 수 있습니다.

어설 션이 실패한 경우 메시지를 인쇄하려면

assert False, "Oh no! This assertion failed!"

마십시오 하지 전화 괄호를 사용 assert하는 함수처럼. 성명서입니다. 그렇게 assert(condition, message)하면 첫 번째 매개 변수로 튜플을 assert사용하여를 실행합니다 (condition, message).

그것들을 비활성화하는 것에 관해서 는 , python최적화 모드에서 실행될 때 , 어디 에서 assert 문도 무시됩니다. 플래그를 전달하십시오 .__debug__False-O

python -O script.py

관련 문서는 여기 를 참조 하십시오 .


답변

괄호를 조심하십시오. 위에서 지적했듯이 파이썬 3에서는 assert여전히 구문입니다 . 그래서와 print(..)비슷하게, assert(..)또는을 외삽 할 수도 raise(..)있지만 그렇게해서는 안됩니다.

이것은 다음과 같은 이유로 중요합니다.

assert(2 + 2 == 5, "Houston we've got a problem")

달리 작동하지 않습니다

assert 2 + 2 == 5, "Houston we've got a problem"

첫 번째가 작동하지 않는 이유는로 bool( (False, "Houston we've got a problem") )평가되기 때문 True입니다.

성명서 assert(False)에서 False이것은 그 주위의 중복 괄호 이며 내용으로 평가됩니다. 그러나 assert(False,)괄호는 이제 튜플이며 비어 있지 않은 튜플 True은 부울 컨텍스트에서 평가됩니다 .


답변

다른 답변에서 언급했듯이 assert주어진 조건이 true가 아닌 경우 예외를 던지는 것과 유사합니다. 중요한 차이점은 최적화 옵션을 사용하여 코드를 컴파일하면 어설 션 문이 무시된다는 것 -O입니다. 이 문서assert expression다음과 동등한 것으로 더 잘 설명 될 수 있다고 말합니다

if __debug__:
   if not expression: raise AssertionError

이 방법은 코드를 철저히 테스트 한 다음 어설 션 사례가 실패하지 않는 것이 좋을 때 최적화 된 버전을 릴리스하려는 경우 유용합니다. 최적화가 설정되면 __debug__변수가 False가되고 조건 평가가 중지됩니다. 이 기능은 또한 당신이 주장에 의존하고 그들이 사라 졌다는 것을 모르는 경우에 당신을 붙잡을 수 있습니다.


답변

Python에서 주장의 목표는 개발자에게 프로그램에서 복구 할 수없는 오류 를 알리는 것입니다 .

어설 션은 “파일을 찾을 수 없음”과 같이 사용자가 수정 조치를 취할 수있는 (또는 다시 시도 할 수있는) 예상되는 오류 조건을 나타 내기위한 것이 아닙니다.

그것을 보는 또 다른 방법은 어설 션이 코드의 내부 자체 검사 라고 말하는 것입니다 . 코드에서 일부 조건을 불가능하다고 선언하여 작동 합니다. 이러한 조건이 유지되지 않으면 프로그램에 버그가 있음을 의미합니다.

프로그램에 버그가없는 경우 이러한 조건이 발생하지 않습니다. 그러나 그 중 하나 발생하면 어떤 “불가능한”조건이 트리거되었는지 정확하게 알려주는 어설 션 오류와 함께 프로그램이 중단됩니다. 이를 통해 프로그램의 버그를 훨씬 쉽게 추적하고 수정할 수 있습니다.

다음은 내가 쓴 Python의 주장에 대한 자습서 의 요약입니다 .

Python의 assert 문은 디버깅 오류이며 런타임 오류 처리 메커니즘이 아닙니다. 어설 션 사용의 목표는 개발자가 버그의 근본 원인을 더 빨리 찾을 수 있도록하는 것입니다. 프로그램에 버그가 없으면 어설 션 오류가 발생하지 않아야합니다.


답변

다른 사람들은 이미 문서에 대한 링크를 제공했습니다.

대화식 쉘에서 다음을 시도 할 수 있습니다.

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

첫 번째 문장은 아무 것도하지 않지만 두 번째 문장은 예외를 일으 킵니다. 이것이 첫 번째 힌트입니다. assert는 주어진 코드 위치 (일반적으로 시작 (전제 조건) 및 함수 끝 (사후 조건))에 맞는 조건을 확인하는 데 유용합니다.

어설 션은 실제로 계약에 의한 프로그래밍과 밀접한 관련이 있으며 이는 매우 유용한 엔지니어링 관행입니다.

http://en.wikipedia.org/wiki/Design_by_contract .


답변

문서에서 :

Assert statements are a convenient way to insert debugging assertions into a program

여기에서 더 읽을 수 있습니다 : http://docs.python.org/release/2.5.2/ref/assert.html


답변

주장 진술에는 두 가지 형태가 있습니다.

간단한 형식 assert <expression>

if __debug__:
    if not <expression>: raise AssertionError

확장 된 형식 assert <expression1>, <expression2>

if __debug__:
    if not <expression1>: raise AssertionError, <expression2>