2017-01-17 9 views
-2

클래스 MyClass이 항상 그런 것은 아니지만 항상 정의되어 있다고 가정합니다. 나는 a 인수가 , 문자열 또는 MyClass 일 수있는 함수 foo(a=None)을 가지고 있습니다.정의되지 않은 클래스로 isinstance 사용

내 질문은 : MyClass 경우 나는 패션에 NameError을받지 않고 isinstance 유사 인수 a의 종류를 확인 할 수있는 방법, 내 파이썬 세션에서 정의되지 않는 이유는 무엇입니까?

오리 타이핑에 대한 참고 사항 : 의도적으로 기능을 제한하고 있습니다.

저는 Python 2.6.x를 사용 중이며 업데이트는 옵션이 아닙니다. 순방향 호환 솔루션 (특히 2.7.x 용)은 높이 평가됩니다.

+2

단순한 정의되지 않은 경우, 당신은'NameError'를 얻습니다. 주위에 방법이 없습니다 –

+1

왜 클래스를 * 조건부로 정의합니까?! – deceze

+2

'try-except'를 사용하십시오. 당신의 클래스가 정의되지 않았다면 어떤 객체도 인스턴스가 될 수 없다는 것입니다. – DeepSpace

답변

1

나는 다른 접근 방식을 제안 : 그래서 수업이 수를 참조하고자하는 모든 코드를 polyfill 단순히 그렇게 :

try: 
    from foo import Bar # load the native class 
except ImportError: 
    class Bar: 
     pass # implement necessary parts here 

당신은 자신의 모듈에이를 넣을 수 있습니다 다음 from mymodule import Bar은 모든 곳이 필요합니다. 이렇게하면 모든 코드가 기본적으로 정의되었는지 여부에 관계없이 Bar을 사용할 수 있습니다.

클래스를 재정의하는 것이 바람직하지 않은 경우에도 ImportError을 처리하는 것은 여전히이 상황을 처리하는 방법입니다. 따라서 사용자는 import 클래스를 사용해야하며 오류가 발생할 곳이 있습니다. 클래스를 정의하는 대신 class_exists = False 플래그를 설정하는 것이 좋습니다.

+0

답변을 수정했습니다. 'class_exists = False'의 경우'(class_exists와 isinstance (a, MyClass))'는 단락으로 인해 오류를 발생시키지 않습니다. –

1

MyClass이 정의되지 않은 경우 해당 유형을 참조 할 방법이 없습니다.

따라서 type(a)에 올바른 값이 있는지 확인할 방법이 없습니다.