그래서 나는이 흥미로운 문제를 건너 왔어요 속성이 존재하고 없음이 아닌가? 옆으로, 나는 assert
가 또는 래퍼없이 위의 코드에서 사용한다고 생각하지 않습니다어설 션 래퍼 함수
self.assert_foo('doo')
으로 변경하지 않는 한
그래서 나는이 흥미로운 문제를 건너 왔어요 속성이 존재하고 없음이 아닌가? 옆으로, 나는 assert
가 또는 래퍼없이 위의 코드에서 사용한다고 생각하지 않습니다어설 션 래퍼 함수
self.assert_foo('doo')
으로 변경하지 않는 한
마지막 줄 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
'unittest'에는'assertEqual'과 같은 많은 래퍼가 있습니다. 그것은 당신의 코드를 가장 쉽게 읽을 수있게 만드는 요소에 달려 있습니다. –
더 빠름? 더 빨리 입력하십시오. 추가 함수 호출이 있기 때문에 실행 속도가 느려집니다. – kindall
@ThomasK에 동의합니다. 아무런 문제가 없습니다. 속도에 관해서는,이 코드를 얼마나 자주 실행하는지에 따라 (이론적 인 차이점이 @kindall에 의해 지적되었지만) 대부분의 경우 무시할 수 있어야한다고 생각합니다. – ubik