2016-09-28 219 views
0

Python 3.5+有一個overloading軟件包。 通過這個包,可以重新定義方法,但是具有不同的類型提示,並且它的裝飾器會發現應該調用哪個重載的方法。Python 3.5 - 使用@overload重載方法

常見的編碼模式:

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

隨着@overload:

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()',我會首先選擇'slow'。 –

回答

1

你必須用真實的代碼自己測量它。

我很快看了一下這個庫的代碼,結論很簡單。它使用了很多反射(檢查包)和類型比較。自行檢查軟件包主要由調試工具使用 - 它們總是會減慢代碼的速度。

只要看看這些行:

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) 

注意,如果這個包超過7個月大,只有70分。 Python不是Java ...你真的會用這個包傷害Python本身:D你最好實現一些核心api方法,它根據類型參數將調用委託給其他方法/對象 - 就像它應該用Python完成的一樣。