• Python


    前言

    typing 是在 python 3.5 才有的模块

    前置学习

    Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html

    常用类型提示

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

    前两行小写的不需要 import,后面三行都需要通过 typing 模块 import 哦 

    常用类型提示栗子

    指定函数参数类型

    单个参数

    # name 参数类型为 str
    def greeting(name: str) :
        return "hello"

      

    多个参数

    # 多个参数,参数类型均不同
    def add(a: int, string: str, f: float, b: bool or str):
        print(a, string, f, b)

    bool or str:代表参数 b 可以是布尔类型,也可以是字符串

    指定函数返回的参数类型

    简单栗子

    # 函数返回值指定为字符串
    def greeting(name: str) -> str:
        return "hello"

      

    复杂一点的栗子

    from typing import Tuple, List, Dict
    
    
    # 返回一个 Tuple 类型的数据,第一个元素是 List,第二个元素是 Tuple,第三个元素是 Dict,第四个元素可以是字符串或布尔
    def add(a: int, string: str, f: float, b: bool or str) -> Tuple[List, Tuple, Dict, str or bool]:
        list1 = list(range(a))
        tup = (string, string, string)
        d = {"a": f}
        bl = b
        return list1, tup, d, bl
    
    
    # 不 warn 的调用写法
    print(add(1, "2", 123, True))
    
    
    # 输出结果
    ([0], ('2', '2', '2'), {'a': 123}, True)

      

    List、Set、Dict 的源码

    能大概猜到,它们底层跟 list、set、dict 有关系

    Tuple 的源码

    跟其他三个不太一样,但也是跟 tuple 有关系

    那指定类型的时候用 list、set、dict、tuple 可不可以呢?

    可以是可以,但是不能指定里面元素数据类型

    def test(a: list, b: dict, c: set, d: tuple):
        print(a, b, c, d)

    List[T]、Set[T] 只能传一个类型,传多个会报错

    a: List[int, str] = [1, "2"]
    b: Set[int, str] = {1, 2, 3}

    IDE 不会报错,但运行时会报错

    Traceback (most recent call last):
      File "/Users/polo/Documents/pylearn/第二章:基础/13_typing.py", line 36, in <module>
        a: List[int, str] = [1, "2"]
      File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 261, in inner
        return func(*args, **kwds)
      File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 683, in __getitem__
        _check_generic(self, params)
      File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 215, in _check_generic
        raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
    TypeError: Too many parameters for typing.List; actual 2, expected 1

    大致意思就是:List 传了太多参数,期望 1 个,实际 2 个

    那 Tuple[T] 传多个会报错吗?

    d: Tuple[int, str] = (1, "2")
    print(d)
    
    
    # 输出结果
    (1, '2')

     是不会报错的

    再来看看 Tuple[T] 的多种写法

    只写一个 int,赋值两个 int 元素会报 warning

    如果 Tuple[T] 指定类型数量和赋值的元素数量不一致呢?

    d: Tuple[int, str] = (1, "2", "2"

    不会报错,但是也会有 warning

    综上两个栗子,得出结论

    Tuple[T] 指定一个类型的时候,仅针对同一个索引下的元素类型

    如果想像 List[T] 一样,指定一个类型,可以对所有元素生效呢

    d: Tuple[int, ...] = (1, 2, 3)
    d: Tuple[Dict[str, str], ...] = ({"name": "poloyy"}, {"age": "33"})

    指定一个类型后,在后面加个 ... 就行

    类型别名

    https://www.cnblogs.com/poloyy/p/15153883.html 

    NewType

    https://www.cnblogs.com/poloyy/p/15153886.html 

    Callable

    https://www.cnblogs.com/poloyy/p/15154008.html

    TypeVar 泛型

    https://www.cnblogs.com/poloyy/p/15154196.html

    Any Type

    https://www.cnblogs.com/poloyy/p/15158613.html

    Union

    https://www.cnblogs.com/poloyy/p/15170066.html

    Optional

    https://www.cnblogs.com/poloyy/p/15170297.html

     
  • 相关阅读:
    vue-cli的使用
    修饰模式(Decorator结构型)C#简单例子
    c#继承中的函数调用
    c#桥接模式(bridge结构模式)
    c#浅谈反射内存的处理
    C#中的try catch finally
    C#微信公众号开发系列教程(接收事件推送与消息排重)
    用 C# 读取二进制文件
    c#语言-多线程中的锁系统(一)
    .NET程序内,访问私有或者保护成员的技巧
  • 原文地址:https://www.cnblogs.com/poloyy/p/15150315.html
Copyright © 2020-2023  润新知