Python中typing模块的具体使用

目录
  • typing库
  • 一、 简介
  • 二、 别名
    • 1、 类型别名
    • 2、 NewType
    • 3、 可调用对象
  • 三、 泛型支持
    • 1、集合类型
    • 2、 抽象基类
    • 3、 泛型
    • 4、 Any
    • 5、 特殊形式
      • 5.1 Type
      • 5.2 Union
      • 5.3 Optional
      • 5.4 Tuple
      • 5.5 Callable

typing库

一、 简介

Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,typing模块可以很好的解决这个问题

Python 运行时并不强制标注函数和变量类型。类型标注可被用于第三方工具,比如类型检查器、集成开发环境、静态检查器等

typing的主要作用有:

  • 类型检查,防止运行时出现参数、返回值类型不符
  • 作为开发文档附加说明,方便使用者调用时传入和返回参数类型
  • 模块加入不会影响程序的运行不会报正式的错误,pycharm支持typing检查错误时会出现黄色警告

官方文档:【https://docs.python.org/zh-cn/3/library/typing.html

语法:

def 函数名(参数: 数据类型) -> 返回值类型:
    pass

变量名: 数据类型 = 值

二、 别名

1、 类型别名

要定义一个类型别名,可以将一个类型赋给别名。类型别名可用于简化复杂类型签名,同时类型别名适用于简化复杂的类型签名

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import Sequence

ConnectionOptions = dict[str, int]  # 表示字典中的键为字符串类型,值为整型
Address = tuple[str, int, ...]  # 表示元组的第一个数据为字符串,第二个数据为整型,里面只能存储两个数据,有省略号表示里面可以添加n个整型数据
Server = tuple[Address, ConnectionOptions]

def broadcast_message(message: str,
                      servers: Sequence[Server]  # 表示一个序列对象里面存储了[tuple[tuple[str, int], dict[str, int]]]
                      ) -> None:  # 返回值为空
    ...

broadcast_message("a", [(("a", 1, 2), {"a": 1})])

2、 NewType

使用NewType辅助函数创建不同的类型,静态类型检查器会将新类型视为它是原始数据的子类,相当于C++里面的`typedef

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import NewType

UserId = NewType('UserId', int)  # 其不会创建一个新的类或引入其他内存,只是做一个约束作用

def name_by_id(user_id: UserId) -> str:
    ...

name_by_id(42)  # Fails type check
name_by_id(UserId(42))  # OK

num = UserId(5) + 1  # type: int,可以进行对应数据类型的操作

同时,可以嵌套创建,即可以基于NewType创建NewType

3、 可调用对象

Callable[[Arg1Type, Arg2Type], ReturnType]

如,实现一个互斥锁的装饰器

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from collections.abc import Callable  # 注意要使用Concatenate和ParamSpec就必须使用这个模块里面的Callable
from threading import Lock
from typing import TypeVar
from pip._vendor.typing_extensions import Concatenate, ParamSpec  # 导入typing的扩展

P = ParamSpec('P')  # 里面有args和kwargs参数
R = TypeVar('R')  # 自定义数据类型

my_lock = Lock()  # 创建一个互斥锁

def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]:
    '''一个提供互斥锁,使得线程安全的装饰器'''
    def inner(*args: P.args, **kwargs: P.kwargs) -> R:
        return f(my_lock, *args, **kwargs)
    return inner

@with_lock
def sum_threadsafe(lock: Lock, numbers: list[float]) -> float:
    '''Add a list of numbers together in a thread-safe manner.'''
    with lock:
        return sum(numbers)

# We don't need to pass in the lock ourselves thanks to the decorator.
print(sum_threadsafe([1.1, 2.2, 3.3]))

无需指定调用签名,用省略号字面量替换类型提示里的参数列表: Callable[..., ReturnType],就可以声明可调对象的返回类型

与 Callable 和 ParamSpec 一起使用,对一个高阶可调用对象进行类型注释,该对象可以增加、删除或转换另一个可调用对象的参数。 使用形式为Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]。 Concatenate 目前只在作为 Callable 的第一个参数时有效。Concatenate 的最后一个参数必须是一个 ParamSpec

三、 泛型支持

typing模快最基本的支持有Any ,Tuple,Callable,TypeVar 和 Generic类型组成

1、集合类型

from typing import (
    List,  # list的泛型版本。用于注释返回类型。要注释参数,最好使用抽象集合类型,如Sequence或Iterable
    Set,  # set的泛型版本
    Dict  # dict 的泛型版本。对标注返回类型比较有用。如果要标注参数的话,使用如 Mapping 的抽象容器类型是更好的选择
    )

2、 抽象基类

from typing import (
    Mapping,  # 要注释函数参数中的Key-Value类型时,推荐使用的抽象集合类型
    Sequence,  # 要注释函数参数中的序列例如列表类型时,推荐使用的抽象集合类型
    Iterable  # 要注释函数参数中的迭代类型时,推荐使用的抽象集合类型
    )

3、 泛型

TypeVar:其就像C++里面的template一样

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
    Sequence,
    TypeVar  # 限制多个变量为同一个数据类型
)

T = TypeVar('T')  # Can be anything 
A = TypeVar('A', str, bytes)  # Must be str or bytes 

def repeat(x: T, n: int) -> Sequence[T]:
    """Return a list containing n references to x."""
    return [x] * n

def longest(x: A, y: A) -> A:
    """Return the longest of two strings."""
    return x if len(x) >= len(y) else y

AnyStr

AnyStr是一个字符串和字节类型的特殊类型变量AnyStr = TypeVar('AnyStr', str, bytes),它用于可以接受任何类型的字符串而不允许不同类型的字符串混合的函数

4、 Any

特殊类型,表明类型没有任何限制

  • 每一个类型都对 Any 兼容
  • Any 对每一个类型都兼容

Any 是一种特殊的类型。静态类型检查器将所有类型视为与Any兼容,反之亦然, Any也与所有类型相兼容。

这意味着可对类型为 Any 的值执行任何操作或者方法调用并将其赋值给任意变量

如下所示,将 Any 类型的值赋值给另一个更具体的类型时,Python不会执行类型检查。例如,当把 a 赋值给 s 时,即使 s 被声明为 str类型,在运行时接收到的是 int 值,静态类型检查器也不会报错

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
    Any,
    NoReturn,  # 表示函数没有返回值
)

def test(s: Any) -> NoReturn:
    s.item()  # 不会检测s里面是否有item()属性

def test_(s: object) -> NoReturn:
    s.item()  # 会检测s里面是否有item属性

当参数无类型是,默认为Any类型

5、 特殊形式

5.1 Type

一个注解为 C 的变量可以接受一个类型为 C 的值。相对地,一个注解为 Type[C] 的变量可以接受本身为类的值 。 更精确地说它接受 C的 类对象

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/5/13 16:54
from typing import (
    Type,
)

class User:
    ...

class BasicUser(User):
    ...

# Accepts User, BasicUser, ...

def make_new_user(user_class: Type[User]) -> User:
    return user_class()

print(make_new_user(User))

5.2 Union

联合类型;Union[X, Y]意味着:要么是 X,要么就是 Y。定义一个联合类型,需要注意的有:

  • 参数必须是类型,而且必须至少有一个参数。
  • 能继承或者实例化一个联合类型。
  • Union[X, Y]不能写成 Union[X][Y] 。
  • 可以使用 Optional[X] 作为Union[X, None]的缩写- 联合类型的联合类型会被展开打平
  • 仅有一个参数的联合类型会坍缩成参数自身,比如:
Union[int] == int  # The constructor actually returns int

多余的参数会被跳过,比如:

Union[int, str, int] == Union[int, str]

在比较联合类型的时候,参数顺序会被忽略,比如:

Union[int, str] == Union[str, int]

5.3 Optional

可选类型,Optional[X] 等价于Union[X, None]

5.4 Tuple

元组类型,Tuple[X, Y] 标注了一个二元组类型,其第一个元素的类型为 X 且第二个元素的类型为Y。空元组的类型可写作 Tuple[()]

为表达一个同类型元素的变长元组,使用省略号字面量,如Tuple[int, ...]。单独的一个 Tuple 等价于 Tuple[Any, ...],进而等价于tuple

示例: Tuple[int, float, str]表示一个由整数、浮点数和字符串组成的三元组

5.5 Callable

可调用类型;Callable[[int], str]是一个函数,接受一个 int 参数,返回一个str。下标值的语法必须恰为两个值:参数列表和返回类型。参数列表必须是一个类型和省略号组成的列表;返回值必须是单一一个类型

不存在语法来表示可选的或关键词参数,这类函数类型罕见用于回调函数。Callable[..., ReturnType](使用字面省略号)能被用于提示一个可调用对象,接受任意数量的参数并且返回 ReturnType。单独的 Callable 等价于Callable[..., Any],并且进而等价于 collections.abc.Callable

更多语法,请到官方查看!!!

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

(0)

相关推荐

  • 详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,"鸭子测试"可以这样表述: "当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子." 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的.例如,在不使用鸭子类型的语言中

  • Python中typing模块与类型注解的使用方法

    实例引入 我们知道 Python 是一种动态语言,在声明一个变量时我们不需要显式地声明它的类型,例如下面的例子: a = 2 print('1 + a =', 1 + a) 运行结果: 1 + a = 3 这里我们首先声明了一个变量 a,并将其赋值为了 2,然后将最后的结果打印出来,程序输出来了正确的结果.但在这个过程中,我们没有声明它到底是什么类型. 但如果这时候我们将 a 变成一个字符串类型,结果会是怎样的呢?改写如下: a = '2' print('1 + a =', 1 + a) 运行结

  • Python标准库之typing的用法(类型标注)

    PEP 3107引入了功能注释的语法,PEP 484 加入了类型检查 标准库 typing 为类型提示指定的运行时提供支持. 示例: def f(a: str, b:int) -> str: return a * b 如果实参不是预期的类型: 但是,Python运行时不强制执行函数和变量类型注释.使用类型检查器,IDE,lint等才能帮助代码进行强制类型检查. 使用NewType 创建类型 NewType() 是一个辅助函数,用于向类型检查器指示不同的类型,在运行时,它返回一个函数,该函数返回其

  • 一篇文章带你了解python中的typing模块和类型注解

    目录 typing模块 Dict List Tuple set/AbstractSet Sequence NoReturn Any TypeVar NewType Callable Union Optional Generator 总结 function annotation 写法: 使用冒号 : 加类型代表参数类型 默认值参数示例:b: int = 2 使用 -> 加类型代表返回值类型 python解释器运行时并不会检查类型,类型不对也不会抛异常,仅仅是注解而已.示例: def plus(a:

  • python使用typing模块加强代码的可读性(实战演示)

    一.需求描述 没有类型提示的编程,总觉得不太方便,好在python3.5以后内置了typing模块. typing模块会对函数和变量类型进行注解. 但是Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器.IDE.静态检查器等第三方工具. 官方网址: typing --- 类型提示支持 - Python 3.10.1 文档 https://docs.python.org/zh-cn/3/library/typing.html 二.实战演练 1.体验注解功能 如下所示,定义

  • python typing模块--类型提示支持

    目录 1.typing介绍 2.typing的作用 3.常用类型 3.1 代码示例 4.typing模块的其他用法 4.1 类型别名 4.2 NewType 4.3 Callable 4.4 TypeVar泛型 4.5 Any 4.6 Union 1.typing介绍 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数的类型或者返回值的类型,这样会导致我们在写完代码一段时间后回过头再看代码,忘记了自己写的函数需要传什么类型的参数,返回什么类型的结果,这样就不得不去阅读代码的具体内容,

  • Python中typing模块的具体使用

    目录 typing库 一. 简介 二. 别名 1. 类型别名 2. NewType 3. 可调用对象 三. 泛型支持 1.集合类型 2. 抽象基类 3. 泛型 4. Any 5. 特殊形式 5.1 Type 5.2 Union 5.3 Optional 5.4 Tuple 5.5 Callable typing库 一. 简介 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函

  • python中argparse模块基础及使用步骤

    目录 argparse模块用法 一. 概念 二. 基础 1. 使用步骤 1.1 总步骤 1.2 创建对象 1.3 添加参数 1.4 解析参数 三. 使用案例 argparse模块用法 一. 概念 argsparse是python的命令行解析的标准模块,内置于python,不需要安装.这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行. 官方文档的位置:[https://docs.python.org/zh-cn/3/library/argparse.html] 在这里我们利用git

  • python中pygame模块用法实例

    本文实例讲述了python中pygame模块用法,分享给大家供大家参考.具体方法如下: import pygame, sys from pygame.locals import * #set up pygame pygame.init() windowSurface = pygame.display.set_mode((500, 400), 0, 32) pygame.display.set_caption("hello, world") BLACK = (0, 0, 0) WHITE

  • python中string模块各属性以及函数的用法介绍

    任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: • python的字符串属性函数 • python的string模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.字符串属性函数  系统版本:CentOS release 6.2 (Final)2.6.32-220.

  • Python中itertools模块用法详解

    本文实例讲述了Python中itertools模块用法,分享给大家供大家参考.具体分析如下: 一般来说,itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. chain(iter1, iter2, ..., iterN): 给出一组迭代器(iter1, iter2, ..., iterN),此函数创建一个新迭代器来将所有的迭代器链接起来,返回的迭代器从it

  • Python中optionParser模块的使用方法实例教程

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例如下: from optparse impo

  • python中urllib模块用法实例详解

    本文实例讲述了python中urllib模块用法.分享给大家供大家参考.具体分析如下: 一.问题: 近期公司项目的需求是根据客户提供的api,我们定时去获取数据, 之前的方案是用php收集任务存入到redis队列,然后在linux下做一个常驻进程跑某一个php文件, 该php文件就一个无限循环,判断redis队列,有就执行,没有就break. 二.解决方法: 最近刚好学了一下python, python的urllib模块或许比php的curl更快,而且简单. 贴一下代码 复制代码 代码如下: #

  • python中hashlib模块用法示例

    我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 具体应用 #!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import h

  • Python中subprocess模块用法实例详解

    本文实例讲述了Python中subprocess模块用法.分享给大家供大家参考.具体如下: 执行命令: >>> subprocess.call(["ls", "-l"]) 0 >>> subprocess.call("exit 1", shell=True) 1 测试调用系统中cmd命令,显示命令执行的结果: x=subprocess.check_output(["echo", "

随机推荐