• typing库学习


    This module provides runtime support for type hints。

    下面的函数接收与返回的都是字符串,注解方式如下:

    def greeting(name: str) -> str:
        return name

    greeting 函数中,参数 name 的类型是 str,返回类型也是 str

    其实是提示,并没有强制报错:不过有了类型注解,一些 IDE 是可以识别出来并提示的,比如 PyCharm 就可以识别出来在调用某个方法的时候参数类型不一致

    复杂结构

    对于一些结构的数据类型就不能用上述简单的方法表示了,比如:

    names: list = ['lily', 'tom']
    version: tuple = (6, 6, 6)
    operations: dict = {'sad': False, 'happy': True}

    以上虽然定义了最外层的数据结构,如列表、元组、字典,但他们每个元素的类型是什么也没有定义清楚,因此需要在 typing 库的帮助下来定义准确内部的结构:

    from typing import List, Tuple, Dict
    
    names: List[str] = ['lily', 'tom']
    version: Tuple[int, int, int] = (6, 6, 6)   # 仅有元祖类型支持,List不支持多个  List[int, int, int]汇报错
    operations: Dict[str, bool] = {'sad': False, 'happy': True}

    自定义:NewType

    from typing import NewType
    
    UserId = NewType('UserId', int)
    some_id = UserId(524313)

    Any 类型

    Any 是一种特殊的类型。静态类型检查器认为所有类型均与 Any 兼容,同样,Any 也与所有类型兼容。

    也就是说,可对 Any 类型的值执行任何操作或方法调用,并赋值给任意变量

    标记没有返回值的函数的特殊类型

    from typing import NoReturn
    
    def stop() -> NoReturn:
        raise RuntimeError('no way')

    用于显式声明 类型别名 的特殊标注

    from typing import TypeAlias
    
    Factors: TypeAlias = list[int]
    name_list: Factors = [1,2,3,4]

    元祖类型(支持[])

    from typing import List, Tuple, Dict, NewType
    
    user: Tuple[str, int] = ('fanjiexiong', 27)

     

    二选一类型

    from typing import List, Tuple, Dict, NewType, Union
    
    user: Tuple[Union[str, int], int] = ('fanjiexiong', 27)
    user1: Tuple[Union[str, int], int] = (22, 27)

    可选类型

    from typing import Optional
    
    
    def foo(arg: Optional[int] = None) -> None:  # arg为可选参数且仅为int型
        return None
    
    print(foo())
    print(foo(1))
    print(foo('1'))

    常见的几种嵌套类型:

    列表

    例如,让我们来定义一个由 str 组成的 list 变量。

    从 typing 模块导入 List(注意是大写的 L):

    from typing import List
    
    
    def process_items(items: List[str]):
        for item in items:
            print(item)

    同样以冒号(:)来声明这个变量。

    输入 List 作为类型。

    由于列表是带有"子类型"的类型,所以我们把子类型放在方括号中:

    from typing import List
    
    
    def process_items(items: List[str]):
        for item in items:
            print(item)

    这表示:"变量 items 是一个 list,并且这个列表里的每一个元素都是 str"。

    这样,即使在处理列表中的元素时,你的编辑器也可以提供支持。

    没有类型,几乎是不可能实现下面这样:

    注意,变量 item 是列表 items 中的元素之一。

    而且,编辑器仍然知道它是一个 str,并为此提供了支持。

    元组和集合

    声明 tuple 和 set 的方法也是一样的:

    from typing import Set, Tuple
    
    
    def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
        return items_t, items_s

    这表示:

    • 变量 items_t 是一个 tuple,其中的每个元素都是 int 类型。
    • 变量 items_s 是一个 set,其中的每个元素都是 bytes 类型。

    字典

    定义 dict 时,需要传入两个子类型,用逗号进行分隔。

    第一个子类型声明 dict 的所有键。

    第二个子类型声明 dict 的所有值:

    from typing import Dict
    
    
    def process_items(prices: Dict[str, float]):
        for item_name, item_price in prices.items():
            print(item_name)
            print(item_price)

    这表示:

    • 变量 prices 是一个 dict
      • 这个 dict 的所有键为 str 类型(可以看作是字典内每个元素的名称)。
      • 这个 dict 的所有值为 float 类型(可以看作是字典内每个元素的价格)。

    参考文档:

    • https://www.gairuo.com/p/python-type-annotations
    • https://docs.python.org/zh-cn/3/library/typing.html
  • 相关阅读:
    hadoop2.2.0 centos6.4 编译安装详解
    Hadoop 2.2.0的高可用性集群中遇到的一些问题(64位)
    Visual Studio 常用快捷键
    Android(1)—Mono For Android 环境搭建及破解
    IbatisNet SqlMap.config配置节导致的程序无法通过
    CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上
    数据库SQL优化大总结
    Scratch 3下载,最新版Scratch下载,macOS、Windows版
    高性能网站设计之缓存更新的套路
    【验证无效】MySQL的count(*)的优化,获取千万级数据表的总行数
  • 原文地址:https://www.cnblogs.com/tarzen213/p/15845747.html
Copyright © 2020-2023  润新知