python 예제 파이썬에서 "assert"를 사용하는 것은 무엇입니까?




python unittest 예제 (14)

일부 소스 코드를 읽었으며 여러 곳에서 assert 의 사용법을 보았습니다.

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


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

대화 형 셸에서 다음을 시도 할 수 있습니다.

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

첫 번째 명령문은 아무 것도 수행하지 않지만 두 번째 명령은 예외를 발생시킵니다. 이것은 첫 번째 힌트입니다 : asserts는 코드의 주어진 위치 (보통, 함수의 시작 (전제 조건)과 종료 (사후 조건))에 맞는 조건을 검사하는 데 유용합니다.

단언은 실제로 계약에 의한 프로그래밍과 관련이 있습니다. 이는 매우 유용한 엔지니어링 사례입니다.

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


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

어설 션은 사용자가 시정 조치를 취하거나 다시 시도 할 수있는 "파일을 찾을 수 없음"과 같은 예상 오류 조건을 알리기위한 것이 아닙니다.

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

프로그램에 버그가 없으면 이러한 조건이 발생하지 않습니다. 그러나 그 중 하나 발생하면 프로그램은 어설 션 오류로 인해 충돌하여 "불가능한"조건이 발생했는지 정확하게 알려줍니다. 이렇게하면 프로그램에서 버그를 추적하고 수정하는 것이 훨씬 쉬워집니다.

필자가 쓴 파이썬의 주장에 대한 요약서는 다음과 같다.

파이썬의 assert 문은 런타임 오류를 처리하기위한 메커니즘이 아니라 디버깅 지원 기능입니다. 어설 션을 사용하는 목적은 개발자가 버그의 근본 원인을 더 빨리 발견 할 수있게하는 것입니다. 프로그램에 버그가 있지 ​​않으면 어설 션 오류가 발생하지 않아야합니다.


조심해. 위에서 지적했듯이, 파이썬 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") ) 이 작동하지 않는 이유는 bool( (False, "Houston we've got a problem") )True 평가된다는 것입니다.

성명 assert(False)assert(False) 에서 False 둘러싼 중복 괄호만으로 내용을 평가합니다. 그러나 assert(False,) 하면 괄호는 이제 터플이고, 비어 있지 않은 튜플은 부울 컨텍스트에서 True 로 평가됩니다.


다음은 간단한 예입니다. 파일에 저장하십시오 (b.py라고 가정 해 봅시다).

def chkassert(num):
    assert type(num) == int


chkassert('a')

결과는 $python b.py

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    chkassert('a')
  File "b.py", line 2, in chkassert
    assert type(num) == int
AssertionError

format : assert Expression [, arguments] assert가 명령문을 발견하면 Python은 expression을 평가합니다. 명령문이 true가 아닌 경우 예외가 발생합니다 (assertionError). 어설 션이 실패하면 Python은 ArgumentExpression을 AssertionError의 인수로 사용합니다. AssertionError 예외는 try-except 문을 사용하여 다른 예외와 마찬가지로 catch되고 처리 될 수 있지만 처리되지 않으면 프로그램을 종료하고 추적을 생성합니다. 예:

def KelvinToFahrenheit(Temperature):    
    assert (Temperature >= 0),"Colder than absolute zero!"    
    return ((Temperature-273)*1.8)+32    
print KelvinToFahrenheit(273)    
print int(KelvinToFahrenheit(505.78))    
print KelvinToFahrenheit(-5)    

위의 코드를 실행하면 다음과 같은 결과가 생성됩니다.

32.0
451
Traceback (most recent call last):    
  File "test.py", line 9, in <module>    
    print KelvinToFahrenheit(-5)    
  File "test.py", line 4, in KelvinToFahrenheit    
    assert (Temperature >= 0),"Colder than absolute zero!"    
AssertionError: Colder than absolute zero!    


예약 된 함수가 파이썬에서 무엇을하는지 정확히 알고 싶다면 help(enter_keyword)

문자열로 입력하는 예약 된 키워드를 입력했는지 확인하십시오.


다른 대답이 지적한 것처럼 assert 는 주어진 조건이 참이 아닌 경우 예외를 throw하는 것과 유사합니다. 중요한 차이점은 최적화 옵션으로 코드를 컴파일하면 assert 문이 무시된다는 것입니다. documentation 에서는 assert expression

if __debug__:
   if not expression: raise AssertionError

이는 코드를 철저히 테스트하려는 경우 유용 할 수 있습니다. 단, 어설 션이 실패하지 않는 것이 __debug__ 최적화 된 버전을 출시하십시오. 최적화가 설정되고 __debug__ 변수가 False가되어 조건 평가가 중단됩니다. 이 기능은 또한 주장에 의지하고 그들이 사라진 것을 인식하지 못하면 당신을 붙잡을 수 있습니다.


assert 문에는 두 가지 형식이 있습니다.

간단한 폼 인 assert <expression> 은 다음과 같습니다.

if __​debug__:
    if not <expression>: raise AssertionError

확장 된 폼 인 assert <expression1>, <expression2> 는 다음과 같습니다.

if __​debug__:
    if not <expression1>: raise AssertionError, <expression2>

기본적으로 assert 키워드의 의미는 조건이 true가 아니라면 assertionerror를 통해, 그렇지 않으면 python으로 계속 진행한다는 것입니다.

코드 -1

a=5

b=6

assert a==b

산출:

assert a==b

AssertionError

코드 -2

a=5

b=5

assert a==b

산출:

Process finished with exit code 0

assert 문은 거의 모든 프로그래밍 언어로 존재합니다. 이는 나중에 다른 작업의 부작용이 아니라 원인을 분명히하는 프로그램 초기에 문제를 감지하는 데 도움이됩니다.

당신이 할 때 ...

assert condition

... 당신은 그 조건을 테스트하기 위해 프로그램에 지시하고, 조건이 거짓이면 즉시 에러를 트리거합니다.

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

if not condition:
    raise AssertionError()

Python 셸에서 사용해보십시오.

>>> 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!"

__debug__False 인 최적화 된 모드에서 python 을 실행할 때, assert 문은 무시됩니다. 그냥 -O 플래그를 전달하면된다.

python -O script.py

관련 문서는 here 를 참조 here .


어설 션은 버그를 잡는 것을 목표로 프로그래머가 예상 한대로 프로그램의 내부 상태를 확인하는 체계적인 방법입니다. 아래 예제를 참조하십시오.

>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>> 

>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)

>>> #first we try without assert
>>>if test_us == True:
    print("YES! I am right!")
else:
    print("I am Wrong, but the program still RUNS!")

I am Wrong, but the program still RUNS!


>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert test_us
AssertionError
>>> 

Python assert 는 기본적으로 코드의 내부 자체 검사를위한 테스트 조건 인 디버깅 보조 도구입니다. Assert는 코드가 불가능한 경우에 디버깅을 매우 쉽게 만듭니다. 불가능한 경우를 확인하십시오.

할인 후 상품 가격을 계산하는 함수가 있다고 가정 해 보겠습니다.

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

여기서 discounted_price는 0보다 작고 실제 가격보다 클 수 없습니다. 따라서 위의 조건을 어기면 assertion error가 발생하여 개발자는 불가능한 일이 발생했음을 확인할 수 있습니다.

희망이 도움이 :)





assertions