当前位置: 代码网 > it编程>前端脚本>Python > Python 中的 typing 模块常见用法

Python 中的 typing 模块常见用法

2024年09月24日 Python 我要评论
typing 模块是 python 提供的一个标准库,主要用于为函数、变量和类定义类型提示(type hints),从而提高代码的可读性和类型安全性。虽然 python 是动态类型语言,但通过 typ

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 模块用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com