2016-09-28 5 views
0

Python 3.5+ 용 패키지는 overloading입니다. 이 패키지를 사용하면 메서드를 재정의 할 수 있지만 고유 한 형식 힌트를 사용하면 데코레이터가 어떤 오버로드 된 메서드를 호출해야하는지 알 수 있습니다.Python 3.5 - @overload로 오버로드되는 메소드

일반 코딩 패턴 : @overload 함께

class foo: 
    def func(param): 
    if instance(param, int): 
     pass 
    elif instance(param, str): 
     pass 
    elif instance(param, list): 
     pass 
    else: 
     raise ValueError() 

: 여기

class foo: 
    @overload 
    def func(param: int): 
    pass 

    @overload 
    def func(param: str): 
    pass 

    @overload 
    def func(param: list): 
    pass 

documentation이다.


내 질문은 : 성능에 미치는 영향은 이전 스타일 매개 변수 유형 전환과 비교 얼마나 큰

  • ?
  • 그리고이 패키지는 어떻게 타입 힌트에 접근합니까?
+2

* 일반적인 코딩 패턴 * - 아니요, 죄송합니다. 대부분의 Python 코드는 isinstance()를 사용할 필요가 없습니다. –

+0

패키지는 Python 3.5에만 한정되지 않습니다. Python 3.5는 표준화 된 유형 힌트 만 제공하지만, Python 3.0 이후부터는 주석을 사용할 수 있습니다. 연결하는 패키지는 3.3 이상을 지원합니다. 당신의 예제는'typing' 모듈을 전혀 사용하지 않습니다. –

+0

[소스 코드] (https://github.com/bintoro/overloading.py/blob/master/overloading.py)를 사용하면 두 번째 질문에 답할 수 있습니다 (기능 주석을 예상대로 읽음). 'dispatcher()'를 보면, 처음에는 'slower'로 갈 것입니다. –

답변

1

실제 코드로 직접 측정해야합니다.

이 라이브러리의 코드를 매우 빠르게 살펴 봤습니다. 결론은 간단합니다. 그것은 많은 반영 (패키지 검사)과 타입 비교를 사용합니다. inspect 패키지 자체는 디버깅 도구에서 주로 사용됩니다. 항상 코드를 느리게 만듭니다.

그냥이 라인을 보려면 :이 패키지의 경우 7 개월 이상 및 만 70 별을 가지고

complexity = complexity_mapping[id] 
if complexity & 8 and isinstance(arg, tuple): 
    element_type = tuple(type(el) for el in arg) 
elif complexity & 4 and hasattr(arg, 'keys'): 
    element_type = (type(element), type(arg[element])) 
else: 
    element_type = type(element) 

type_hints = typing.get_type_hints(func) if typing else func.__annotations__ 
types = tuple(normalize_type(type_hints.get(param, AnyType)) for param in parameters) 

참고. 파이썬은 자바가 아닙니다 ... 파이썬 자체를이 패키지로 해치울 수 있습니다 : D 타입 매개 변수를 기반으로 다른 메소드/객체에 대한 호출을 위임하는 핵심 API 메소드를 구현하는 것이 더 낫습니다. .

관련 문제