Python函数类型注解的方式
因为当Python用于大型项目时候,没有类型这个Python的特征的弱点就暴露出来,特别是项目中人员层次参差不齐,项目中就会产生各种bug。
虽然动态语言Python虽然无法解决没有类型的这个问题,但是它也做了一些折中方案。
加help文档(3.5以后)
def add(x, y) ->int: # 函数注释,非强制类型要求
"""
:param x: int
:param y: int
:return: int
"""
return x + y
help(add)
Help on function add in module __main__:
add(x:str, y:int) -> int
:param x: int
:param y: int
:return: int
形参和返回值注解(Python3.5以上)
这仅仅是用声明,不是强制要求。Pycharm会根据这个指定类型做类型推断。
def add(x:int, y) ->int: # 函数注释,非强制类型要求
#x要求是int;add返回值要求是int。
return x + y
help(add)
Help on function add in module __main__:
add(x:int, y) -> int
标识符注解(Python3.6以后)
Python按照参数注解做类型检查
如果我们尝试用annotation做判断,可得到看似正确的结果,但问题是只有在Python3.6下字典才有被记录字典输入顺序。
不过,我们可以把这个需求作为一个练习:
def check(fn):
def wrapper(*args, **kwargs):
print(fn.__annotations__)
list_anno_values = list(fn.__annotations__.values())
print(list_anno_values)
for index, para in enumerate(args):
print(para, list_anno_values[index]) # 如果True说明送参类型正确
print(isinstance(para, list_anno_values[index]))
for k, v in kwargs.items():
print(v, fn.__annotations__[str(k)]) # 如果True说明送参类型正确;False说明送参错误
print(isinstance(v, fn.__annotations__[str(k)]))
ret = fn(*args, **kwargs)
return ret
return wrapper
@check # add = check(add) #add=>wrapper
def add(x: int, y: int) -> int:
return x + y
add(4, y=5)
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
[<class 'int'>, <class 'int'>, <class 'int'>]
4 <class 'int'>
True
5 <class 'int'>
True
9