18.1-类型注解

作者: BeautifulSoulpy | 来源:发表于2019-09-16 15:35 被阅读0次

    后知后觉代价太高了;

    当你走上不一样的路,你才能看到和别人不一样的风景;

    参数注解是利用静态语言特性而生的;

    总结:

    1. 标识符的类型:是看它赋什么值就是什么类型;
    2. 函数注解在变量意义不大,在函数中大量这样写;

    Python是动态的、强类型的语言;

    # py3.6版本才开始这样写; 
    a:int = 5
    b:str = 6
    
    

    这样的好处是有极大的灵活性,但坏处就是对于别人代码,无法一眼判断出参数的类型,IDE 也无法给出正确的提示。自己做判断写的代码比核心代码还要多;

    于是 Python 3.5引入了函数参数注解 ;Python 3.6 引入了变量注解

    1. 函数注解

    1.1 函数注解与变量注解:(只做声明)

    变量就应该变,不应该做约束,但函数就不一样了;
    函数是要求参数有类型要求,因为函数的返回值是有类型的,返回值和返回值的类型都非常重要;

    函数注解:

    1.不做强制性约束(颜色醒目);
    2.根据变量的方法类型,可以猜出不知道功能的参数类型
    3.只对函数参数做一个辅助的说明,并不对函数参数进行类型检查;
    4.注解提供给第三方工具,做代码分析,发现隐藏的bug;
    5.函数注解的信息,保存在 annotations 属性中;

    变量注解:
    Python 3.6中才可以,注解在变量中的作用并不大;

    1.2 动态编译型语言Python与静态编译型语言C\C++的差异:

    1. 动态编译型语言Python指定int类型,你输入其他类型,它也不吭声;(不报错的BUG)
    2. 静态编译型语言Java\C,指定int类型,你输入其他类型,会显示不支持;
    3. 动态编译型语言Python函数动态特性的弊端:难发现,难使用

    1.3 注解定义

    def add(x:int, y:int) -> int:
        return x+y
    
    print(add(4,5)) 
    print(add('mag','dsg')) 
    add.__annotations__
    -----------------------------------------------------------
    9
    magdsg
    {'x': int, 'y': int, 'return': int}
    
    总结:
    1.注解只做声明,相当于注释,不做强制性约束(颜色醒目):你可以不遵守,写来给第三方工具看的;
    
    

    用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型;

    2.函数参数类型检查

    1.函数参数的检查,一定是在函数外;
    2.函数应该作为参数,传入到检查函数中;
    3.检查函数拿到函数传入的实际参数,与形参声明对比;
    4._annotations_ 属性是一个字典,其中包括返回值类型的声明。假设要做未知参数的判断,无法和字典中的声明对应,使用inspect模块

    2.1 inspect模块

    提供获取对象信息的函数,可以检查函数和类、类型检查;

    inspect模块的使用
    import inspect
    
    def add(x:int, y:int):
        x.append(5)
        return x
    
    print(inspect.isfunction(add))  # 判断函数类型;
    sig = inspect.signature(add)   # 拿到签名
    print(sig)
    
    params = sig.parameters    # 拿到 函数参数列表;
    print(params)
    
    #利用参数注解查看变量的属性;
    from inspect import Parameter
    
    for i, (k,param) in enumerate(params.items()):
        print(i,k,param)
    #    param:Parameter = 1  #利用参数注解查看变量的属性;
    
        print(param.name, param.default, param.annotation, param.kind)
    ------------------------------------------------------------------------------
    True
    (x: int, y: int)
    OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">)])
    0 x x: int
    x <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
    1 y y: int
    y <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
    
    
    

    相关文章

      网友评论

        本文标题:18.1-类型注解

        本文链接:https://www.haomeiwen.com/subject/pviuyctx.html