Python标准库87. typing模块实践

注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料将在公众号CTO Plus发布,请关注公众号:CTO Plus

Python标准库系列将分享90个日常常用的内置模块,从介绍、特性和作用、使用方法以及应用场景来介绍标准库的使用,代码示例在最新的Python3.11版本上运行,其他低版本Python可能存在差异。

标准库-内置库(Standard Library):内置库是指Python自带的标准库,包含了大量常用的模块和函数,例如`os`、`sys`、`re`、`math`、`random`等。这些模块和函数可以直接import进来使用,无需下载或安装。

第三方库(Third-party Library):第三方库是指由第三方开发者编写的Python库。这些库可以通过pip或conda等包管理工具进行下载和安装,例如`numpy`、`pandas`、`matplotlib`、`django`等。即需要pip install安装后才能使用的都是第三方库。

在前面的文章《Python基础之开发必备-标准库(内置模块)汇总详细介绍》中介绍过Python有上百个标准库(内置模块),本篇的typing即是常用的模块之一。其他更多的Python3标准库实践资料请关注公众号:CTO Plus查看。

查看标准库清单:https://mp.weixin.qq.com/s/E4HD4_aPWx0Ok3s-Uf28NQ

1. 简介

Python3 标准库 `typing` 是用来标注静态类型注解的模块。在 Python 3.5 版本后,加入了 `typing` 模块,它提供了类型注解和检查,能够在编码时检测变量类型的错误,并提供丰富的类型提示信息。

`typing` 模块中包含了许多类型,如常见的 `List`、`Tuple`、`Dict`、`Set` 等类型,也包含了一些特别的类型,如 `Union`、`Optional`、`Any` 等类型。此外,`typing` 模块还提供了许多类型操作符,如 `Callable`、`TypeVar`、`Generic` 等类型操作符,可以满足复杂类型的需求。

2. 特性和作用

使用类型注解可以帮助开发者更好地理解代码,更快速地发现代码问题,可以提高代码的可读性和可维护性。`typing` 模块为 Python 代码添加了类型注解,提供了丰富的类型提示信息,可以使代码更容易维护和调试。

在 Python 编程中,`typing` 模块主要有以下特点:

  1. 支持类型注解,能够在编码时检测变量类型的错误;
  2. 提供强类型检查,能够防止类型错误,并提供丰富的类型提示信息;
  3. 支持常见的类型,如 `List`、`Tuple`、`Dict`、`Set` 等类型;
  4. 支持特定类型,如 `Union`、`Optional`、`Any` 等类型,可以满足复杂类型的需求;
  5. 支持类型操作符,如 `Callable`、`TypeVar`、`Generic` 等类型操作符,可以满足更多类型需求。

3. 常用方法和代码示例

(1) 使用常见类型及其别名

from inner_module_def_datastruct import WEIXIN_URL, AUTHOR , AGE
from typing import List, Tuple, Dict, Set

# 可以使用typing中的基本类型来声明变量的类型,如int,float,bool,str等
name: str = AUTHOR
age: int = 25
height: float = 1.75
active: bool = True
blog: str = WEIXIN_URL

numbers_list: List[int] = [1, 2, 3, 4, 5]
numbers_tuple: Tuple[int, float, str] = (1, 1.0, "1")
numbers_dict: Dict[str, int] = {"one": 1, "two": 2, "three": 3}
numbers_set: Set[str] = {"one", "two", "three"}

def add_numbers(numbers: List[int]) -> int:
    return sum(numbers)

print(add_numbers(numbers_list))

(2) 使用特定类型

from typing import Union, Optional, Any

# Union 表示联合类型,可以用来表示多种不同类型的变量(定义一个变量可以是多个类型中的任何一个);而 Any 则表示任意类型,可以用来表示一个变量可以是任何类型。
result: Union[str, int, float] = 1
value: Optional[int] = None
anything: Any = 42

if result == 1:
    # result is now a string, not an int.
    result = "One"

(3) 使用类型运算符

from typing import TypeVar, Generic

T = TypeVar('T')

class Singleton(Generic[T]):

    _instance: T = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

class Foo(Singleton):
    pass

class Bar(Singleton):
    pass

foo1 = Foo()
foo2 = Foo()
bar = Bar()

print(foo1 is foo2)  # True
print(foo1 is bar)  # False

(4) 函数参数类型声明

你可以在函数定义中使用typing来声明函数参数的类型:

def my_func(num: int, my_str: str) -> bool:
    if num > 10 and my_str == WEIXIN_URL:
        return True
    else:
        return False

print(my_func(AGE, WEIXIN_URL))  # True
print(my_func(1.2, False))  # False

在这个例子中,`num`和`my_str`的类型被指定为`int`和`str`,函数的返回类型被指定为`bool`。在实际传参时,虽然也可以传递与参数类型声明不一致的参数,但不推荐这么做,同时编译器也聪明的给出了不一样的提示,如下:

(5) 可选参数类型声明

有时候,你可能想定义一个可以为None的可选参数。你可以使用Optional类型实现这个功能:

from typing import Optional

def my_optional_func(num: Optional[int]) -> bool:
    if num is not None and num > 10:
        return True
    else:
        return False

# my_optional_func()  # 虽然参数可以为None,但依然需要传递None,否则报错:TypeError: my_optional_func() missing 1 required positional argument: 'num'
my_optional_func(None)

在这个例子中,`num`被定义为可选的`int`类型,因此它可以为None或整数。

(6) 生成器类型声明

你可以使用typing中的`Generator`类型来声明一个生成器:

from typing import Generator

def my_generator()->Generator[int, None, None]:
    yield 1
    yield
    yield False
    yield lambda a,b:a>b

g = my_generator()
# 使用__next__方法获取生成器的元素
print(g.__next__())  # 1
print(g.__next__())  # None
print(g.__next__()) # False
f = g.__next__()
print(f)  # <function my_generator.<locals>.<lambda> at 0x00000278608D93A0>
print(f(22,11)) # 调用函数,输出: True
# print(g.__next__()) # 如果生成器为空,再取则抛StopIteration异常

在这个例子中,my_generator函数返回一个生成器对象,它将生成int类型的值。

(7) 类型别名

你可以使用typing中的`TypeAlias`来定义一个类型别名:

from typing import TypeAlias

# Python3.10 版中的新函数
# MyInt = TypeAlias(int, "MyInt")  # 错误用法  TypeError: Cannot instantiate typing.TypeAlias
MyInt: TypeAlias = list[int]
MyInt2: TypeAlias = int

print(type(MyInt), type(MyInt2))  # <class 'types.GenericAlias'> <class 'type'>

num: MyInt2 = 1234
print(type(num), num)  # <class 'int'> 1234

MyType = int
num2: MyType = 12312
print(type(MyType), type(num2), num2)  # <class 'type'> <class 'int'> 12312

在这个例子中,`MyInt`是一个别名,与`int`类型完全相同。

这些只是Python中typing模块提供的一小部分功能,如果您想更深入地学习,请查看Python官方文档或其他深入学习资源。

4. 应用场景

`typing` 模块适用于许多场景,包括:

  1. 通过强类型检查,防止类型错误,并提供丰富的类型提示信息。
  2. 在 Python 中添加类型参数以支持泛型编程。
  3. 通过类型操作符支持复杂类型。
  4. `typing` 模块可以用于各种类型注解场景,通过类型注解提高代码的可读性和可维护性,如静态类型检查、函数参数注解、文档注释等场景中。

总之,Python3 标准库 `typing` 模块提供了一种方法来声明变量、参数和函数的类型可以帮助开发者更好地理解代码,并提供丰富的类型提示信息。它可以作为一种类型注解的实现方式,提高代码的可读性和可维护性,并通过强类型检查,防止类型错误。此外,`typing` 模块还支持复杂类型的实现,可以通过类型参数和类型操作符来支持泛型编程。

完整的Python3.11标准库代码示例,请在公众号CTO Plus后台回复:py标准库

 

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543


更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


更多精彩,关注我公号,一起学习、成长

关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s?__biz=MzIyMzQ5MTY4OQ==&mid=2247484278&idx=1&sn=2b774f789b4c7a2ccf10e465a1b9def6&chksm=e81c2070df6ba966026fd7851efa824b5e2704e3fd34e76228ca4ce64d93f7964cd4abe60f2b#rd

标准库系列-推荐阅读:


推荐阅读:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值