• python type hint


    python type hint

    入门

    初步使用

    由于python是个动态类型语言,变量是什么类型是在变量运行的时候决定的,与他人合作或者代码躲多起来之后会变得难以阅读与调试,python3.5以上引入了type hint(类型提示)

    举个例子 比如有一个专门计算整型的加法函数如下

    def add(a,b):
        return a+b
    add(1,2)
    
    • 1
    • 2
    • 3

    光看这个add函数我们并不知道函数的参数类型和返回值类型是啥

    但是使用type hint 之后

    def add(a:int,b:int)->int:
        return a+b
    
    • 1
    • 2

    这样做有几个好处

    1. 函数作者和调用者一眼能看出是什么参数类型和返回值类型

    2. 输入错误的类型之后,ide会高亮显示提醒作者输入的类型错误

    如下图所示
    在这里插入图片描述

    字典

    def my_sum(d: dict[str, int]) -> int:
        total = 0
        for i in d.values():
            total += i
        return total
    
    
    my_sum({"a": 2, "b": 3})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    自定义数据类型

    使用如下

    class Test:
        name = "phil"
    
    def get_name(a: Test) -> str:
        return a.name
    
    print(get_name(Test()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果在get_name函数中传Test就会报错

    get_name(Test)
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CqBCrzXs-1659080348075)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1658999352457.png)]

    意思是期望传一个 类型为Test的参数,现在得到一个类型为Test

    解释一下:比如传一个int类型的参数为3,现在直接传的是 int

    嵌套类型

    这是一个求列表内元素总和的函数 在入参[1, 2, “3”]加入了个str 这样是不能求和的 但是没有任何提示

    def my_sum(my_list: list)->int:
        sum = 0
        for i in my_list:
            sum += i
        return sum
    
    print(sum([1, 2, "3"]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    无提示 如下图 因为只检查了最外层是list没有检查内层的每个元素

    在这里插入图片描述

    这样写就可以了

    在这里插入图片描述

    但是还是没有提示 可以安装三方库 mypy ,然后使用mypy xx.py进行静态检查

    在这里插入图片描述

    Sequence

    想传list也想传tuple 可以使用Sequence 支持列表,元组,字节,range

    from typing import Sequence
    
    def my_sum(my_list: Sequence[int]) -> int:
        total = 0
        for i in my_list:
            total += i
        return total
    
    my_sum([1, 2, 3])
    my_sum((1, 2, 3))
    my_sum(b"123")
    my_sum(range(3))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Union、Optional

    如果一个参数有可能传int也有可能传None,那么可以使用union

    from typing import Union
    
    
    def func(a: Union[int, None]):
        if a is None:
            return 0
        return a
    
    
    func(None)
    func(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    也可以使用Optional是一样的效果

    from typing import Optional
    
    
    def func(a: Optional[int]):
        if a is None:
            return 0
        return a
    
    
    func(None)
    func(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Literal

    必须就得是这个样子 规定输入什么 就得输入什么

    from typing import Literal
    
    
    class Person:
        def __init__(self, name, gender: Literal["male", "female"]):
            self.name = name
            self.gender = gender
    
    
    b = Person("phil", "male")
    a = Person("phil", "男")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果在实例化的时候输入 a = Person(“phil”, “男”) 就会有如下提示

    在这里插入图片描述

    NoReturn

    noreturn是真的没有返回值,如报错了

    from typing import NoReturn
    
    def error() -> NoReturn:
        raise KeyError
    
    • 1
    • 2
    • 3
    • 4

    Any

    目前默认的就是Any,什么类型都可以 如果确认返回的不是None但是没有想好返回什么类型就是用Any

    from typing import Any
    
    def fun(a) -> Any:
        pass
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Eclipse切换中文环境
    SAP PO运维(五):系统用户授权
    java毕业设计衣依服装销售平台Mybatis+系统+数据库+调试部署
    2022牛客蔚来杯第三场A C J
    音视频标签
    基于问题驱动法的计算机组成原理教学研究
    Docker 镜像库国内加速的几种方法
    Zookeeper
    k8s配置资源管理
    线程是如何在 6 种状态之间转换的?
  • 原文地址:https://blog.csdn.net/weixin_44259638/article/details/126052808