글쎄, 이것은 공개적인 질문이며, 내가 다루고 싶은 두 가지 측면이 있습니다 : 어설 션을 추가 할 때와 오류 메시지를 작성하는 방법.
목적
초보자에게 그것을 설명하기 위해-주장은 오류를 일으킬 수있는 진술이지만 오류를 잡을 수는 없습니다. 그리고 그들은 보통 자라서는 안되지만, 실제로는 어쨌든 자라기도합니다. 그리고 이것은 심각한 상황으로, 코드를 복구 할 수없는 심각한 오류입니다.
다음으로, '디버깅 목적'을위한 것인데, 이는 정확하지만 매우 불쾌하게 들립니다. 나는 다른 초보자들에게는 다르게 작동하지만 '불변하지 않아야 함'을 선언하는 것이 더 좋습니다. 어떤 초보자는 다르게 행동하지만 다른 사람들은 그것을 사용하지 않거나 정상적인 예외를 대체합니다. 또는 그것으로 제어 흐름.
스타일
파이썬에서는 assert
함수가 아닌 서술문입니다! (생각해 내다assert(False, 'is true')
올려서는 안된다는 .
선택적 '오류 메시지'를 언제 어떻게 작성해야합니까?
이 acually 자주 (주장을 할 많은 전용 방법이 유닛 테스트 프레임 워크에 적용 assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
등). 또한 종종 주장에 대해 의견을 제시 할 수있는 방법을 제공합니다.
버리기 코드에서는 오류 메시지없이 할 수 있습니다.
어떤 경우에는 어설 션에 추가 할 것이 없습니다.
데프 덤프 (무언가) : assert isinstance (무언가, 덤프 가능) # ...
그러나 그 외에도 메시지는 다른 프로그래머 (예 : Ipython / Jupyter 등의 대화 형 사용자)와 통신하는 데 유용합니다.
내부 구현 세부 정보를 유출하는 것이 아니라 정보를 제공하십시오.
대신에:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
쓰다:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
또는 아마도 :
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
나는 알고 있습니다. 이것은 정적 주장의 경우가 아니지만 메시지의 정보 가치를 가리키고 싶습니다.
부정적이거나 긍정적 인 메시지?
이것은 논란의 여지가 있지만 다음과 같은 것을 읽는 것은 나에게 상처를줍니다.
assert a == b, 'a is not equal to b'
이들은 서로 옆에 쓰여진 두 가지 모순 된 것입니다. 따라서 코드베이스에 영향을 줄 때마다 'must'및 'should'와 같은 추가 동사를 사용하여 원하지 않는 것을 말하지 말고 원하는 것을 지정하십시오.
주장 a == b, 'a는 b와 같아야합니다'
그런 다음 얻는 AssertionError: a must be equal to b
것도 읽을 수 있으며 명령문은 코드에서 논리적으로 보입니다. 또한 트레이스 백을 읽지 않고도 무언가를 얻을 수 있습니다 (때로는 사용할 수없는 경우도 있음).