2011-04-22 3 views

답변

7

전혀 아님.

예제에서 add이 정수를 예상한다고 가정하면 메서드 시작 부분에이 제약 조건이 실제로 적용됩니다.

그냥 당신이 가지고있는 다른 선택을 상상하고 얼마나 나쁜 사람들은 다음과 같습니다

  • 이 인수를 확인하지 않습니다. 즉, 메서드는 나중에 호출자를 혼동시킬 수있는 이상한 백 트레이스와 함께 실패하게되고 add의 구현을보고 강제로 무슨 일이 일어나는지 알 수 있습니다.
  • 멋지게 입력을 int으로 변환하려고 시도합니다. 사용자가 왜 add(2.4,3.1)5을 계속 반환하는지 궁금해합니다.
+1

이와 같은 경우 대신 예외를 발생시키지 않으시겠습니까? 코드를 디버깅 할 때만 어설 션을 사용하는 것을 선호합니다. –

+0

그것은 확실히 계기에 달려 있지만 (특히 동적 유형의 언어) 예외는 런타임 오류에 대한 것이며 어설 션은 프로그래밍 오류를 잡는 데 사용됩니다. 'add '를위한 문서가'int '만을 받아 들인다는 것을 명확히 진술한다면 호출자는이 제약 조건을 지키지 않으면되고 계약 위반은 프로그래밍 오류이다. –

+0

(게다가, 파이썬에서'assert'는'AssertionError'를 발생시킵니다 - 그래서 실제로 예외를 발생시키는 합성 설탕입니다.) –

2

당신이 -O 명령 줄 옵션을 사용하여 응용 프로그램을 실행할 수 있으며, 코드를 당신의 어설 션 문 see here

업데이트에 대해 생성되지 않기 때문에 그것은 괜찮습니다 :

그러나 또한 당신이 어쨌든 모든 오류를 처리해야합니다. 그렇지 않으면 어설 션을 제거한 후 처리되지 않은 예외가 발생할 수 있습니다. (그의 인용문을 보시길. here)

+0

왜 그런 주장이 주장에 찬성합니까? – delnan

+0

나는 좋은 연습이라고 주장한다. 그래서 질문은 파이썬 스크립트의 경우 단점이 있는지 여부이다. 나쁜 점은 스크립트가 "릴리스"모드에서 실행될 때 나타나는 어설 션 예외 일 수 있습니다. 그러나, 파이썬 당신이 이것을 피할 수 있습니다. – Andrey

+0

그러나 OP와 같은 코드는 인수 유효성 검사를 위해 사용됩니다. 잘못된/잘못된 값으로 계속 수행 될 수 있으며 나중에 어설 션을 건너 뛰면 충돌이 발생할 수 있습니다. – delnan

0

당신의 코드가 당신의 실제 코드보다 더 많은 주장문을 포함하고 있다면 나는 화를 낼 것입니다.

0

어설 션을 사용하고 어설 션 예외를 발생시키는 대신 instance()를 사용하여 적절한 검사를 수행하고 적절한 TypeError를 발생 시키십시오.

관련 문제