Python 中的 typing 模块常见用法

 更新时间:2024年09月24日 16:39:29   作者:NLP工程化  
Python的typing模块提供类型提示功能,增强代码可读性和类型安全性,通过定义变量、参数、返回值的类型,可以帮助IDE和静态分析工具提高代码质量,支持List、Dict、Tuple等类型定义,以及Optional、Union、Any等高级用法,还可以使用mypy等工具进行类型检查

typing 模块是 Python 提供的一个标准库,主要用于为函数、变量和类定义类型提示(Type Hints),从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言,但通过 typing 模块,开发者可以明确指定变量和函数的参数、返回值的类型,帮助 IDE 或静态代码分析工具提供更好的代码提示和错误检查。虽然 Python 本身不会强制执行这些类型检查,但借助 mypy 等工具,可以进行静态类型分析,帮助发现潜在问题。

源码位置:D:\Python310\Lib\typing.py

一.常见类型提示

1.ListDict

用于表示列表和字典类型。

(1)List[type] 表示一个包含特定类型元素的列表。

(2)Dict[key_type, value_type] 表示键和值有特定类型的字典。

2.Tuple

表示一个包含特定类型的元组。Tuple[type1, type2] 表示一个包含两个特定类型的元组。

3.Optional

表示变量可以是某种类型,也可以是 NoneOptional[type] 等价于 Union[type, None],表示某个值可以是 typeNone

4.Union

表示一个变量可以是多个类型之一。Union[type1, type2, ...] 表示变量可以是 type1type2 等中的任意一种。

5.Any

表示可以是任意类型。Any 用于声明一个变量可以是任意类型,不做类型检查。

6.Callable

表示可调用的对象,如函数。Callable[[arg_type1, arg_type2], return_type] 用于表示一个函数,参数类型为 arg_type1arg_type2,返回值类型为 return_type

7.TypeVar

用于定义泛型。TypeVar 用于创建通用函数或类。

8.Literal

限制变量值为某些特定的值。

9.Set

表示一个包含特定类型元素的集合。比如 Set[str] 表示一个字符串集合。

10.FrozenSet

表示一个不可变的集合。比如 FrozenSet[int] 表示一个不可变的整数集合。

11.Generic

用于创建泛型类和泛型接口。比如 class MyList(Generic[T]) 表示一个泛型列表类,可以存储类型 T 的元素。

12.Type

表示一个类型对象。比如 Type[str] 表示 str 类型。

二.常见用法

1.List|Dict|Tuple示例

from typing import List, Dict, Tuple
# 一个返回包含字符串的列表的函数
def get_names() -> List[str]:
    return ["Alice", "Bob", "Charlie"]
# 一个带有字典类型提示的函数
def get_person_data() -> Dict[str, int]:
    return {"Alice": 30, "Bob": 25}
# 一个带有元组类型提示的函数
def get_coordinates() -> Tuple[int, int]:
    return (10, 20)
  • get_names():返回一个 List[str],即一个字符串列表。
  • get_person_data():返回一个 Dict[str, int],表示字典的键是字符串,值是整数。
  • get_coordinates():返回一个 Tuple[int, int],即一个包含两个整数的元组。

2.Optional 示例

from typing import Optional
def find_user(user_id: int) -> Optional[str]:
    if user_id == 1:
        return "Alice"
    return None

find_user():返回类型是 Optional[str],表示可能返回字符串,或者返回 None

3.Union 示例

from typing import Union
def process_input(data: Union[int, str]) -> str:
    if isinstance(data, int):
        return f"Received an integer: {data}"
    return f"Received a string: {data}"

process_input():参数类型是 Union[int, str],表示该函数接收整数或字符串两种类型。

4.Callable 示例

from typing import Callable
# 定义一个函数接收另一个函数作为参数
def execute_task(task: Callable[[int, int], int], a: int, b: int) -> int:
    return task(a, b)
# 示例调用
def add(x: int, y: int) -> int:
    return x + y
result = execute_task(add, 3, 4)  # 返回 7

execute_task():接收一个可调用对象(函数),该对象接收两个整数并返回一个整数。

5.TypeVar 泛型示例

from typing import TypeVar, List
T = TypeVar('T')
def get_first_element(lst: List[T]) -> T:
    return lst[0]
# 使用时可以是不同的类型
print(get_first_element([1, 2, 3]))      # 返回 1
print(get_first_element(['a', 'b', 'c']))  # 返回 'a'

TypeVar:允许定义一个泛型函数 get_first_element,它可以适用于任何类型的列表。

三.高级用法

1.Literal 示例

from typing import Literal
def set_mode(mode: Literal['read', 'write']) -> None:
    if mode == 'read':
        print("Setting mode to read")
    elif mode == 'write':
        print("Setting mode to write")
set_mode('read')   # 合法
set_mode('write')  # 合法
set_mode('delete') # 非法,会被静态分析工具标记为错误

Literal:限制传入的值必须是特定的字面值,在此例中只能是 'read''write'

2.TypedDict示例

from typing import TypedDict
class User(TypedDict):
    name: str
    age: int
def get_user() -> User:
    return {"name": "Alice", "age": 30}

TypedDict:用于定义字典的具体结构,使字典的键和值类型更加明确。

3.Protocol示例

用于定义接口协议,可以检查对象是否实现了特定的方法和属性。

from typing import Protocol
class Drawable(Protocol):
    def draw(self) -> None:
        ...

4.Final 示例

表示一个变量、方法或属性不能被重写或修改。

from typing import Final
MAX_SIZE: Final = 100

5.ClassVar 示例

表示一个类变量,它不应被视为实例变量的一部分。

from typing import ClassVar
class MyClass:
    class_var: ClassVar[int] = 42

6.NoReturn

表示函数不会返回任何值(通常用于函数抛出异常的情况)。

from typing import NoReturn
def terminate() -> NoReturn:
    raise SystemExit

参考文献

[1] typing 对类型提示的支持:https://docs.python.org/zh-cn/3/library/typing.html

[2] https://github.com/python/mypy

[3] https://www.mypy-lang.org/

到此这篇关于Python 中的 typing 模块常见用法的文章就介绍到这了,更多相关Python typing 模块用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux环境中没有网络怎么下载python

    linux环境中没有网络怎么下载python

    在本篇文章里小编给大家分享了关于linux环境中没有网络怎么下载python的相关知识点内容,需要的朋友们参考下。
    2019-07-07
  • Django表单提交后实现获取相同name的不同value值

    Django表单提交后实现获取相同name的不同value值

    这篇文章主要介绍了Django表单提交后实现获取相同name的不同value值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 详解Python爬虫爬取博客园问题列表所有的问题

    详解Python爬虫爬取博客园问题列表所有的问题

    这篇文章主要介绍了详解Python爬虫爬取博客园问题列表所有的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • jupyternotebook 撤销删除的操作方式

    jupyternotebook 撤销删除的操作方式

    这篇文章主要介绍了jupyternotebook 撤销删除的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • CoAtNet实战之对植物幼苗图像进行分类(pytorch)

    CoAtNet实战之对植物幼苗图像进行分类(pytorch)

    谷歌的最新模型CoAtNet做了卷积 + Transformer的融合,在ImageNet-1K数据集上取得88.56%的成绩。本文主要介绍如何用CoAtNet实现植物幼苗图像的分类。感兴趣的小伙伴可以学习一下
    2021-12-12
  • python 嵌套型partials的使用

    python 嵌套型partials的使用

    这篇文章主要介绍了python 嵌套型partials的使用,partial对象中包含partial对象的使用,下文更多详细介绍需要的小伙伴可以参考一下
    2022-03-03
  • python调用matlab的方法详解

    python调用matlab的方法详解

    这篇文章主要为大家介绍了python调用matlab,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Django 通过JS实现ajax过程详解

    Django 通过JS实现ajax过程详解

    这篇文章主要介绍了Django 通过JS实现ajax过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 11行Python代码实现解密摩斯密码

    11行Python代码实现解密摩斯密码

    摩尔斯电码是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。本文将通过Python代码来实现解密摩斯密码,感兴趣的可以学习一下
    2022-04-04
  • 使用python播放音频的示例代码

    使用python播放音频的示例代码

    在Python中,我们可以使用多种库来播放音频文件,其中最常用的是pygame库和playsound库,本文给大家分享使用这些库的示例,对python播放音频示例代码感兴趣的朋友一起看看吧
    2024-02-02

最新评论