2014-10-23 6 views
0

일관성 검사를 추가하여 모델 구현을 향상시키고 싶습니다. (이 값은 음수 일 수 없으며,이 값은 None이 될 수 없습니다.)Python에서 모델 일관성을 구현하는 방법은 무엇입니까?

«Pythonic»이 추가되었는지 궁금합니다 일부«유형 확인»- 체크도합니다. 예를 들어, 제가 자동차에 넣은 물건이 실제로 SteeringWheel인지 확인하십시오.

가능한 한 빨리 오류를 잡기 위해 일종의 유형 검사를 수행하고 싶습니다. Car가 첫 번째 회전을 할 때가 아니라 (그리고 잘못된 지정을 찾을 때까지 자동차 사고로 디버깅을하는) 적절한 SteeringWheel을 추가했는지 알고 싶습니다.

필자는 파이썬의 오리 (duck) 유형 철학에서 유형 대신에 추가 된 객체의 속성이나 메소드를 검사하는 것이 더 많을 것이라고 읽었습니다. 나는이 원칙을 이해하고 있지만 모델이 주어진 객체가 정확한지 확인하기 위해 객체가 어떻게 사용될 것인지를 인식하고 모델과 컨트롤러간에 잘못된 의존성을 만들어야한다는 것을 의미합니다.

또한 어떤 속성을 테스트해야합니까? wheel.rotate()은 SteeringWheel뿐만 아니라 타이어에도 적용 할 수 있습니다.

또 다른 방법은 AttributeError 또는 TypeError에 대한 기대, 그대로 모델을 보자 시도 - 캐치에 의해 에게 모델 객체의 모든 사용을 포위하는 것, 그것은 매우 복잡 할 것이다.

어쩌면 내가 이것을 원한다고 잘못 생각한 것입니다. 누군가가 저에게 잘못된 생각을 가지고 있다는 것을 확신 할 수 있다면 제발하십시오. 그러나 내가 일관성을 잃을 때 오류를 발생시키는 모델을 원한다고 생각한다면 isinstance()을 사용하는 것 이외의 다른 방법을 말해 줄 수 있습니까?

감사합니다.

+1

아마도 관련 : http://stackoverflow.com/questions/1275646/python-3-and-static-typing – ch3ka

+0

@ ch3ka 이것은 매우 흥미로운 글입니다. 나는 주석에 대해 몰랐다. – Mankalas

답변

0

여기에서 AbstractBaseClasses (https://docs.python.org/2/library/abc.html)를 사용할 수 있습니다. pep 3119 (http://legacy.python.org/dev/peps/pep-3119/#rationale)의 이론적 근거는 문제의 종류에 관한 것입니다. 즉, objet이 특별 검사 나 엄격한 형식 검사없이 주어진 프로토콜을 지원하는지 확인하는 것입니다.

+0

이 PEP를 이해하는 한, ABC는'instinstcheck__' 메소드를 개발자가 구현할 수 있도록 허용하고 isinstance()에 의해 호출됩니다. 까다로운 경우를 제외하고, 이것이 내장 된'isinstance()'보다 더 나은지 나는 알 수 없다. – Mankalas

+0

@Mankalas : 더 많은 것이 있습니다. 요점은 하나의 패키지에 ABC (=> 프로토콜)를 정의하고 두 번째 패키지의 호환 가능한 클래스를 정의하고이 두 번째 클래스를 세 번째 패키지에 ABC의 유효한 구현으로 등록 할 수 있다는 것입니다. 의존성/상속 등을 하드 코딩하지 않고도 기존의 호환 가능한 클래스를 사용할 수 있다는 것을 의미합니다. FWIW는 Python이 메소드를 리바 인딩하고 런타임시 객체 클래스를 변경할 수있게하므로 "엄격한"typechecking도 런타임 오류로부터 보호하지 못합니다. 당신의 typecheck를 통과 한 후에 객체가 클래스를 바꿀 수 있습니다.

+0

설명해 주셔서 감사합니다. 나는 나의 문제를 해결하고 오리 철학을 따르는 것 같다. – Mankalas