zoukankan      html  css  js  c++  java
  • py typing — Support for type hints

    原文档:https://docs.python.org/3/library/typing.html

    简介

    python是一门动态语言,而动态语言的变量类型极其灵活,使其在做一些工具,脚本时非常方便,但是同时也给大型项目的开发带来了一些麻烦,比如过一阵子就不知道这个变量啥类型的了,而且IDE还不容易识别你的变量类型,使用.的时候不会自动提示等。自python3.5开始,PEP484为python引入了类型注解(type hints)。

    下面是一个简单的例子:

    def greeting(name: str) -> str:
        return 'Hello ' + name
    

      在函数参数的后面用冒号加类型就可以声明该参数的类型,->代表了函数返回值的类型。

    上面那一个简单的即说明了typing的作用,同时,注释变量的类型的时候还可以时候 # type: str,下面两种方法均可使用

    # 使用注释来标明变量类型
    primes = [] # type:list[int]
    captain = ... #type:str
    
    class Starship:
        stats = {} #type:Dict[str,int]
    # 使用typing来标注变量类型
    primes:List[int] = []
    captain:str #Note: no initial value
    
    class Starship:
        stats: ClassVar[Dict[str,int]] = {}
    

      由于python天生支持多态,迭代器中的元素可能多种,所以typing可以配合or使用,如下:

    # 使用or关键字表示多种类型
    from typing import List
    def func(a:int, string:str) -> List[int or str]:
        list1 = []
        list1.append(a)
        list1.append(string)
        return list1

     typing常用的类型:

    • int,long,float: 整型,长整形,浮点型;
    • bool,str: 布尔型,字符串类型;
    • List, Tuple, Dict, Set:列表,元组,字典, 集合;
    • Iterable,Iterator:可迭代类型,迭代器类型;
    • Generator:生成器类型;

    函数的注解只存储在函数的__annotations属性中。例如:

    def add(x:int, y:int) -> int:
        return x + y
    print(add.__annotations__)
    

      执行结果为:

    {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

    类型别名(type alias)

    在下面这个例子中,Vector和List[float]可以视为同义词

    from typing import List
    Vector = List[float]
    
    def scale(scalar: float, vector: Vector)->Vector:
        return [scalar*num for num in vector]
    
    new_vector = scale(2.0, [1.0, -4.2, 5.4])
    

      类型别名有助于简化一些复杂的类型声明

    from typing import Dict, Tuple, List
    
    ConnectionOptions = Dict[str, str]
    Address = Tuple[str, int]
    Server = Tuple[Address, ConnectionOptions]
    
    def broadcast_message(message: str, servers: List[Server]) -> None:
        ...
    
    # The static type checker will treat the previous type signature as
    # being exactly equivalent to this one.
    def broadcast_message(
            message: str,
            servers: List[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
        pass

    新类型(New Type)

    使用NewType来辅助函数创造不同的类型

    form typing import NewType
    
    UserId = NewType("UserId", int)
    some_id = UserId(524313)
    

      newtype类似于上面的别名机制:

    from typing import NewType
    
    UserId3 = NewType('UserId', int)  # 相当于给int起了个别名
    
    first_user = UserId3(1)
    print(type(first_user))  # 输出int,不是UserId
    

      静态类型检查器将将新类型视为原始类型的子类。这对于帮助捕获逻辑错误非常有用

    def get_user_name(user_id: UserId) -> str:
        pass
    
    # typechecks
    user_a = get_user_name(UserId(42351))
    
    # does not typecheck; an int is not a UserId
    user_b = get_user_name(-1)
    

      你仍然可以使用int类型变量的所有操作来使用UserId类型的变量,但结果返回的都是都是int类型。例如

    # output仍然是int类型而不是UserId类型
    output = UserId(23413) + UserId(54341)
    

      虽然这无法阻止你使用int类型代替UserId类型,但可以避免你滥用UserId类型

  • 相关阅读:
    Pytorch版本yolov3源码阅读
    Darknet卷基层浅层特征可视化教程
    YOLOv3-darknet 内容解析
    YOLOv2-darknet 内容解析
    YOLOv1-darknet 内容解析
    Qt5.2+opencv2.4.9配置安装过程
    Android程序示例
    【Cuda编程】加法归约
    算法设计与分析课程的时间空间复杂度
    【算法分析】实验 4. 回溯法求解0-1背包等问题
  • 原文地址:https://www.cnblogs.com/wlx97e6/p/10145880.html
Copyright © 2011-2022 走看看