2012-03-29 3 views
2

코드의 버그를 나타내는 많은 프로그램 상태 검사를 배치합니다. 그런 경우 if not condition: raise MyException보다 더 읽기 쉽기 때문에 assert condition을 사용하고 싶습니다.-O (optimize) 플래그에도 불구하고 assert 유지

raise 대신 assert을 사용하면 두 가지 문제점이 있습니다.

  1. assert 그래서 나중에하게 잡기 제기 할 수있는 예외를 지정할 수 없습니다 하드 (AssertionError를 잡는 것은 너무 많이 잡을 수있다).

  2. assert은 -O 플래그가 인터프리터에 전달되면 비활성화됩니다.

제 환경에서는 버그가 발견되어 해결 될 때까지 결과를 폐기해야합니다. 따라서 위의 수표에 의해 제기 된 예외를 포착 할만한 포인트가 없습니다. 따라서 문제 # 1은 제 상황과 관련이 없습니다.

# 2 문제는 심각합니다. 내 수표가 생산 코드에 남아 있기를 바란다. 정확성이 내 환경의 성능보다 훨씬 중요하기 때문이다. 몇몇 사람들은 오늘 -O 플래그를 사용합니다. 그러나 어느 날 나 또는 다른 사람이 코드를 사용하는 것을 선호 할 수 있습니다 (예 : if __debug__ 뒤의 코드를 숨기거나 -O가 실제로 코드를 최적화 할 수 있기 때문). 모든 assert 문은 프로덕션 코드에서 활성 상태로 유지되어야하므로 모든 assert 문을 다른 것으로 바꿔야합니다. -O 플래그에도 불구하고 assert을 강제 종료 할 수있는 방법이 있습니까?

덧붙여서, assert의 원인이 된 라인으로부터의 변수 값을 인쇄 해, assert의 동작을 커스터마이즈하려고하고 있습니다. 을 AssertionError을 캐치하고, 추적 코드를 읽고, 관련 소스 코드를 찾고, 관련 줄에서 변수를 인쇄 한 다음 예외를 다시 발생시키는 자체 함수로 바꾸면됩니다. 문제가있는 사람이 있으면 알려 주시기 바랍니다.

+0

을 당신이 심각한 오류 조건을 확인하는'assert'를 사용하는 가정뿐 아니라 일반 예외 조건? –

+0

정확하게. 나는 특별한 입력을 잡기 위해 여전히 적절한 예외를 사용하고있다. - 나는 코드에서 실수를 잡기 위해서'assert' 만 사용하고있다. 내 특정 환경에서 코드의 실수는 치명적인 오류로 간주됩니다 (알려진 버그가 포함되어 있으면 프로덕션 코드가 실행되지 않음). – max

+0

잘 보이지 않습니다. 어설 션을 제거하는 것은 분명히 -O 스위치의 "기능"입니다. http://stackoverflow.com/q/1273211/102937 –

답변

3

필요한 것이 아닌 경우 단언을 사용하지 마십시오. 대신에 조건을 위반할 경우이 예외를 던질 것이라는 점을 명시해야합니다. assert 문에는 항상 "나는 전혀 실행되지 않을 수도있다"라는 문구가있다. 해킹이 적고 놀라 울 것도없고 나중에 중단 될 가능성이 적으며 사용자가 -O을 추가하지 못하게 할 필요가 없습니다.

타이핑을 저장하려는 경우 그렇게 할 수 있습니다. (보다 구체적인 이름이 좋습니다)이 같은 함수를 만들고 assert 대신 사용 :

def require(cond, msg): 
    if not cond: 
     raise MyException(msg) 
관련 문제