2017-09-07 10 views
0

특정 클래스의 서브 클래스를 허용하기 위해 파이썬 3을 사용하여 타입 힌팅을 허용하고 싶습니다. 예컨대 : 이제타입 힌팅의 서브 클래스

class A: 
    pass 

class B(A): 
    pass 

class C(A): 
    pass 

def process_any_subclass_type_of_A(cls: A): 
    if cls == B: 
     # do something 
    elif cls == C: 
     # do something else 

다음 코드를 입력 : 내가 PyCharm IDE 힌트를 얻을

process_any_subclass_type_of_A(B) 

'A 형 예상을 대신 형 [B]를 얻었다.'

여기에 입력 힌트를 변경하여 A의 하위 유형을 허용하려면 어떻게해야합니까?

이에 따르면 (https://www.python.org/dev/peps/pep-0484/#type-definition-syntax, "형식이 특정 인수 유형의 하위 유형이기도 한 표현식도 해당 인수로 허용됩니다."), 내 솔루션 (cls: A)이 작동해야한다고 생각합니까?

+0

또한이 오류가 발생합니까? 그렇지 않으면 아마도 PyCharm의 버그 일 것입니다! – jpic

+0

나를 위해 나는 파이썬 콘솔에 시도하고 그것은 잘 작동하고 있습니다. PyCharm에서 가능한 버그 일 수 있습니다. – Nirmi

+0

예, 작동하고 있습니다. 유형 힌트는 내가 아는 한 선택 사항입니다. 여전히 메소드의 사용자가 클래스가 사용을 위해 의도 된 클래스를 명시 적으로 알고 싶습니다. – user1211030

답변

2

cls: A을 입력하면 clsA 유형으로 지정됩니다. 유형 또는 해당 부속 유형에 맞게 작업하려면 typing.Type을 사용하십시오. The type of class objects 에서

는 :

때때로 당신은 지정된 클래스에서 상속 클래스 객체에 대해 이야기하고 싶습니다. 이것은 Type[C]으로 표기 할 수 있으며, C은 클래스입니다. 즉, 인수 주석이 를 선언 같은 인수는 인수가 C의 인스턴스 선언 (또는 C의 서브 클래스의) 주석을 C를 사용하지만, Type[C]를 사용하여 클래스의 이름 때 C입니다 인수는 C (또는 C 그 자체)에서 파생 된 클래스 객체입니다.

2

나는 soluton을 발견했다. 사용 :

from typing import Type 
def process_any_subclass_type_of_A(cls: Type[A]): 
    pass 

위의 PEP에 명시된대로 원하는 동작이있게됩니다.