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