2015-09-29 62 views
4

python 3.5提供的函數允許測試給定的 參數是否符合函數聲明中給出的類型提示?python 3.5類型提示:我可以檢查函數參數是否匹配類型提示?

如果我有例如這個功能:

def f(name: List[str]): 
    pass 

是有可以檢查

name = ['a', 'b'] 
name = [0, 1] 
name = [] 
name = None 
... 

是否適合類型提示巨蟒方法?

我知道'沒有類型檢查發生在運行時',但我仍然可以在python中手動檢查這些參數的有效性 ?

或者如果python本身沒有提供這個功能: 需要使用什麼工具?

+1

*「並蟒蛇3.5提供的功能,允許測試是否一個給定的參數會是否符合函數聲明中給出的類型提示?「* - 否(但它[越來越近](https://www.python.org/dev/peps/pep-0484/))。 *「我需要使用什麼工具?」* - 建議是脫離主題的(但請參閱MyPy,[合同](http://andreacensi.github.io/contracts/)等) – jonrsharpe

回答

6

Python本身並沒有提供這樣的功能,你可以閱讀更多關於它here


我寫了一個裝飾了點。這是我的裝飾的代碼:

from typing import get_type_hints 

def strict_types(function): 
    def type_checker(*args, **kwargs): 
     hints = get_type_hints(function) 

     all_args = kwargs.copy() 
     all_args.update(dict(zip(function.__code__.co_varnames, args))) 

     for argument, argument_type in ((i, type(j)) for i, j in all_args.items()): 
      if argument in hints: 
       if not issubclass(argument_type, hints[argument]): 
        raise TypeError('Type of {} is {} and not {}'.format(argument, argument_type, hints[argument])) 

     result = function(*args, **kwargs) 

     if 'return' in hints: 
      if type(result) != hints['return']: 
       raise TypeError('Type of result is {} and not {}'.format(type(result), hints['return'])) 

     return result 

    return type_checker 

您可以使用它像:

@strict_types 
def repeat_str(mystr: str, times: int): 
    return mystr * times 

雖然這不是很Python的限制你的函數只接受一個類型。儘管可以使用abc(抽象基類)(如number(或自定義abc))作爲類型提示,並且可以限制函數不僅接受一種類型,而且還可以接受任何類型的組合。


爲它添加了一個github repo,如果有人想使用它。

+0

這個長相不錯。 'f .__ code__'應該是'function .__ code__';第一個「TypeError」的參數也應該被修改。我嘗試了你的'repeat_str'函數並得到了一個(意外的)錯誤信息:'TypeError:mystr的類型是而不是'。但後來也許我在你的代碼中引入了一個bug ... –

+0

@hiroprotagonist,對不起,我給你錯了,沒有調試過的代碼。我編輯了我的答案,現在它可能按照它應該的方式工作。 –