函数定义的弊端:
python是动态语言,变量随时可以被赋值,且能赋值为不同的类型,动态语言很灵活,但是这种特性也是弊端
难发现:由于不做任何类型检查,直到运行期问题才显现出来,或者线上运行时才能暴露出问 题
难使用:函数的使用者看到函数的时候,并不知道你的函数的设计,并不知道应该传入什么类 型的数据
如何解决这种动态语言的弊端?
函数注解:
python3.5引入, 对函数的参数进行类型注解 ,对函数的返回值进行类型注解 ,只对函数参数做一个辅助的说明,并不对函数参数进行类型检查 , 提供给第三方工具,做代码分析,发现隐藏的bug ,函数注解的信息,保存在__annotations__属性中
函数参数类型检查:
函数参数的检查一定是在函数外,函数应该作为参数,传入到检查函数中,检查函数拿到函数传入的实际参数,与形参声明对比,__annotations__属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无 法和字典中的声明对应。使用inspect模块 ,该模块提供获取对象信息的函数,可以检查函数和类,类型检查。
inspect模块
signature(callable),获取签名(函数签名包含了一个函数的信息,包括函数名、它的参数类型、它 所在的类和名称空间及其他信息)
inspect.isfunction(add),是否是函数
inspect.ismethod(add)),是否是类的方法
inspect.isgenerator(add)),是否是生成器对象
inspect.isgeneratorfunction(add)),是否是生成器函数
inspect.isclass(add)),是否是类
还有很多is函数,需要的时候查阅inspect模块帮助
Parameter对象:保存在元组中,是只读的 ; name,参数的名字 ; annotation,参数的注解,可能没有定义 ;default,参数的缺省值,可能没有定义 ;empty,特殊的类,用来标记default属性或者注释annotation属性的空值 ; kind,实参如何绑定到形参,就是形参的类型
例:检查用户输入是否符合参数注解的要求?
思路:调用时,判断用户输入的实参是否符合要求,用户感觉上还是在调用原函数,对用户输入的数据和声明的类型进行对比,如果不符合,提示用户。
类型注解与参数数据
python3.5后增加了参数注解
python3.5后引入函数注解
对函数的参数进行类型注解
对函数的返回值进行类型注解
对函数参数做义工辅助的说明,并不对函数参数进行类型检查
提供给第三方工具,做代码分析,发现隐藏的bug
函数的注解信息保存在__annotations__属性中
python3.6后增加了类型注解
python3.6后引入变量注解
参数注解示例:
def add(x:int,y:int=5)->int #:int 标识了参数应该出现的类型。为参数注解。->int 标注返回值为int类型
"""
加法函数
:param x: int类型
:param y: int类型
:return: int类型
""" #使用三引号可以为函数添加说明文档。
原文链接:https://blog.csdn.net/u013008795/article/details/89467636
来源:CSDN
作者:杨家玥
链接:https://blog.csdn.net/lixiaohui8/article/details/104308158