Python 中的 typing 模块常见用法

南飓风  论坛元老 | 2024-9-21 10:09:12 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1028|帖子 1028|积分 3084

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

一.常见类型提示

1.List 和 Dict

用于表示列表和字典类型。
(1)List[type] 表示一个包含特定类型元素的列表。
(2)Dict[key_type, value_type] 表示键和值有特定类型的字典。
2.Tuple

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

表示变量可以是某种类型,也可以是 None。Optional[type] 等价于 Union[type, None],表示某个值可以是 type 或 None。
4.Union

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

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

表示可调用的对象,如函数。Callable[[arg_type1, arg_type2], return_type] 用于表示一个函数,参数类型为 arg_type1、arg_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示例

  1. from typing import List, Dict, Tuple
  2. # 一个返回包含字符串的列表的函数
  3. def get_names() -> List[str]:
  4.     return ["Alice", "Bob", "Charlie"]
  5. # 一个带有字典类型提示的函数
  6. def get_person_data() -> Dict[str, int]:
  7.     return {"Alice": 30, "Bob": 25}
  8. # 一个带有元组类型提示的函数
  9. def get_coordinates() -> Tuple[int, int]:
  10.     return (10, 20)
复制代码


  • get_names():返回一个 List[str],即一个字符串列表。
  • get_person_data():返回一个 Dict[str, int],表示字典的键是字符串,值是整数。
  • get_coordinates():返回一个 Tuple[int, int],即一个包含两个整数的元组。
2.Optional 示例

  1. from typing import Optional
  2. def find_user(user_id: int) -> Optional[str]:
  3.     if user_id == 1:
  4.         return "Alice"
  5.     return None
复制代码
find_user():返回类型是 Optional[str],表示可能返回字符串,或者返回 None。
3.Union 示例

  1. from typing import Union
  2. def process_input(data: Union[int, str]) -> str:
  3.     if isinstance(data, int):
  4.         return f"Received an integer: {data}"
  5.     return f"Received a string: {data}"
复制代码
process_input():参数类型是 Union[int, str],表示该函数吸取整数或字符串两种类型。
4.Callable 示例

  1. from typing import Callable
  2. # 定义一个函数接收另一个函数作为参数
  3. def execute_task(task: Callable[[int, int], int], a: int, b: int) -> int:
  4.     return task(a, b)
  5. # 示例调用
  6. def add(x: int, y: int) -> int:
  7.     return x + y
  8. result = execute_task(add, 3, 4)  # 返回 7
复制代码
execute_task():吸取一个可调用对象(函数),该对象吸取两个整数并返回一个整数。
5.TypeVar 泛型示例

  1. from typing import TypeVar, List
  2. T = TypeVar('T')
  3. def get_first_element(lst: List[T]) -> T:
  4.     return lst[0]
  5. # 使用时可以是不同的类型
  6. print(get_first_element([1, 2, 3]))      # 返回 1
  7. print(get_first_element(['a', 'b', 'c']))  # 返回 'a'
复制代码
TypeVar:允许定义一个泛型函数 get_first_element,它可以适用于任何类型的列表。


三.高级用法

1.Literal 示例

  1. from typing import Literal
  2. def set_mode(mode: Literal['read', 'write']) -> None:
  3.     if mode == 'read':
  4.         print("Setting mode to read")
  5.     elif mode == 'write':
  6.         print("Setting mode to write")
  7. set_mode('read')   # 合法
  8. set_mode('write')  # 合法
  9. set_mode('delete') # 非法,会被静态分析工具标记为错误
复制代码
Literal:限定传入的值必须是特定的字面值,在此例中只能是 'read' 或 'write'。
2.TypedDict示例

  1. from typing import TypedDict
  2. class User(TypedDict):
  3.     name: str
  4.     age: int
  5. def get_user() -> User:
  6.     return {"name": "Alice", "age": 30}
复制代码
TypedDict:用于定义字典的具体布局,使字典的键和值类型更加明确。
3.Protocol示例

用于定义接口协议,可以查抄对象是否实现了特定的方法和属性。
  1. from typing import Protocol
  2. class Drawable(Protocol):
  3.     def draw(self) -> None:
  4.         ...
复制代码
4.Final 示例

表示一个变量、方法或属性不能被重写或修改。
  1. from typing import Final
  2. MAX_SIZE: Final = 100
复制代码
5.ClassVar 示例

表示一个类变量,它不应被视为实例变量的一部门。
  1. from typing import ClassVar
  2. class MyClass:
  3.     class_var: ClassVar[int] = 42
复制代码
6.NoReturn

表示函数不会返回任何值(通常用于函数抛出异常的情况)。
  1. from typing import NoReturn
  2. def terminate() -> NoReturn:
  3.     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/


NLP工程化(星球号)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表