2012-05-28 6 views
1

그래서 나는이 흥미로운 문제를 건너 왔어요 속성이 존재하고 없음이 아닌가? 옆으로, 나는 assert가 또는 래퍼없이 위의 코드에서 사용한다고 생각하지 않습니다어설 션 래퍼 함수

self.assert_foo('doo') 

으로 변경하지 않는 한

+1

'unittest'에는'assertEqual'과 같은 많은 래퍼가 있습니다. 그것은 당신의 코드를 가장 쉽게 읽을 수있게 만드는 요소에 달려 있습니다. –

+2

더 빠름? 더 빨리 입력하십시오. 추가 함수 호출이 있기 때문에 실행 속도가 느려집니다. – kindall

+3

@ThomasK에 동의합니다. 아무런 문제가 없습니다. 속도에 관해서는,이 코드를 얼마나 자주 실행하는지에 따라 (이론적 인 차이점이 @kindall에 의해 지적되었지만) 대부분의 경우 무시할 수 있어야한다고 생각합니다. – ubik

답변

2

마지막 줄 NameError을 올릴 것이다. 수정 된 행은 self.foo_doo이 설정되어 있는지 확인하지만 None은 아닙니다.

if self.foo_doo is not None: 

모두를 수행합니다. 이 넘어

return getattr(self, 'foo_'+name, None) is not None 

하나는 축약 된 모습 최초의 속성 검사를 원하는 경우

, 하나는 당신은 또한 비 None 검사를 원하는 경우에

def has_foo(self, name): 
    return hasattr(self, 'foo_'+name) 

def foobar(self): 
    if has_foo('doo'): 

이,에 has_foo 수익을 변경 쓸 수 , 프로덕션 코드의 assert은 코드의 사용자가 영향을받는 런타임 조건이 아닌 내부 논리를 확인하는 데에만 사용해야합니다. 사용자는 어설 션을 삭제하거나 비활성화 할 수 있으므로 코드는 한 번 릴리스 된 적절한 작업에 대한 어설 션에 의존해서는 안됩니다.

위의 코드에서 __init__self.foo_doo에서 까지으로 설정하지만 발신자는 이후에 속성을 삭제할 수 있습니다. 따라서 속성의 존재와 가치는 사용자가 결정한 런타임 조건이며 어설 션에 적절한 제목이 아닙니다.

unittest의 방법은 테스트에만 사용되며 실패하면 단순한 포장으로 그 이상을 수행합니다. assert