typing介绍

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

Python的typing包是从Python 3.5版本引入的标准库,它提供了类型提示和类型注解的功能,用于对代码进行静态类型检查和类型推断。typing模块中定义了多种类型和泛型,以帮助开发者代码的可读性、可维护性和可靠性。

typing的作用

typing包的主要功能如下:

  1. 类型注解:typing包提供了多种用于类型注解的工具,包括基本类型(如int、str)、容器类型(如List、Dict)、函数类型(如Callable、Tuple)、泛型(如Generic、TypeVar)等。通过类型注解,可以在函数声明、变量声明和类声明中指定参数的类型、返回值的类型等,以增加代码的可读性和可靠性。
  2. 类型检查:通过与第三方工具(如mypy)集成,可以对使用了类型注解的代码进行静态类型检查。类型检查可以帮助发现潜在的类型错误和逻辑错误,以提前捕获问题并改善代码的质量。
  3. 泛型支持:typing模块提供了对泛型的支持,使得可以编写更通用和灵活的代码。通过泛型,可以在函数和类中引入类型参数,以处理各种类型的数据。
  4. 类、函数和变量装饰器:typing模块提供了一些装饰器,如@overload、@abstractmethod、@final等,用于修饰类、函数和变量,以增加代码的可读性和可靠性。

除了typing包,还有typing_extensions模块,它是typing模块的扩展,提供了一些额外的功能和类型。typing_extensions中包括了一些高级的类型工具和类型别名,用于更复杂的类型定义和注解。

总的来说,typing包和typing_extensions模块为Python开发者提供了一套强大的类型提示工具,使得可以在代码中加入类型注解,并通过类型检查工具提供静态类型检查的功能,以提高代码的可读性和质量。

即, typing是python 3.5及以后版本的标准库,typing_extensions是typing模块的扩展包。

typing常用类型

以下是typing包中常用的类型和泛型。

注意,int, float,bool,str, bytes不需要import typing,Any,Union,Tuple等需要import typing

基本类型:

  • int: 整数类型
  • float: 浮点数类型
  • bool: 布尔类型
  • str: 字符串类型
  • bytes: 字节类型
  • Any: 任意类型
  • Union: 多个类型的联合类型,表示可以是其中任意一个类型
  • Tuple: 固定长度的元组类型
  • List: 列表类型
  • Dict: 字典类型,用于键值对的映射

泛型:

  • Generic: 泛型基类,用于创建泛型类或泛型函数
  • TypeVar: 类型变量,用于创建表示不确定类型的占位符
  • Callable: 可调用对象类型,用于表示函数类型
  • Optional: 可选类型,表示一个值可以为指定类型或None
  • Iterable: 可迭代对象类型
  • Mapping: 映射类型,用于表示键值对的映射
  • Sequence: 序列类型,用于表示有序集合类型
  • Type:泛型类,用于表示类型本身

typing使用示例

示例1

fun1里,标明了形参和返回值的类型,fun2中却没有。

from typing import List, Tuple, Dict

def fun1(a0: int, s0: str, f0: float, b0: bool) -> Tuple[List, Tuple, Dict, bool]:
list1 = list(range(a0))
tup1 = (a0, s0, f0, b0)
dict1 = {s0: f0}
b1 = b0
return list1, tup1, dict1, b1 def fun2(a0, s0, f0, b0):
list1 = list(range(a0))
tup1 = (a0, s0, f0, b0)
dict1 = {s0: f0}
b1 = b0
return list1, tup1, dict1, b1 print(fun1(5, "KeyName", 2.3, False)) print(help(fun1))
"""
Help on function fun1 in module __main__:
fun1(a0: int, s0: str, f0: float, b0: bool) -> Tuple[List, Tuple, Dict, bool]
""" print(help(fun2))
"""
Help on function fun2 in module __main__:
fun2(a0, s0, f0, b0)
"""

由于fun1里有了完整的变量类型的注释,通过help查看其使用文档就很清楚知道怎么用该函数。

示例2

from typing import List

def func(a: int,b: str) -> List[int or str]:# 使用or关键字表示多种类型
list1 = []
list1.append(a)
list1.append(b)
return list1 l = func(3, "aa")
print(l) # [3, 'aa']

示例3

定义一个不确定类型的占位符T,用作函数foo的形参, 但函数返回值一定是str,通过内部做str(name)转化来保证。

import typing

T=typing.TypeVar('T',int,float,str)

def foo(name:T)->str:
return str(name) print(foo(2.012)) # 2.012
print(foo(35)) # 35
print(foo("hahaha")) # hahaha

示例4

typing中的Type是一个泛型类,用于表示类型本身,即你是啥类型就是啥类型,有点绕,看例子吧:

from typing import Type

value: Type[int]  # value是一个Type对象,表示int类型
value: int

即value:Type[int]和value:int是等价的。

那为什么还要有这个Type类呢,我理解它为一个更为宽松的类型标注,比如下面函数:

def ir_module(mod: Type) -> IRModule:
"""The parsing method for ir module, by using `@ir_module` as decorator. Parameters
----------
mod : Type
The class to be parsed as ir module. Returns
-------
ir_module : IRModule
The parsed ir module.
"""
if not inspect.isclass(mod):
raise TypeError(f"Expect a class, but got: {mod}") m = parse(mod, utils.inspect_class_capture(mod))
setattr(m, "__name__", mod.__name__)
return m

这个ir_module()作为一个装饰器,mod传进来是啥就是啥,但必须要是一个类型。然后在函数里,通过inspect强制检查mod必须为一个类,不然就报错。我们在使用ir_module装饰器时,一般是这样的:

import tvm
from tvm.ir.module import IRModule
from tvm.script import tir as T @tvm.script.ir_module
class MyModule:
pass ir_mod = MyModule
print("done")

即给ir_module传进去的是MyModule这个类。

Type也可用于标注函数返回值类型,比如

from typing import Type, List

def get_list_type() -> Type[List[int]]:
return list returned_type = get_list_type() # returned_type是一个Type对象,表示List[int]类型

在上述示例中,Type[List[int]]表示List[int]类型本身,可以用于注解函数get_list_type的返回类型,说明该函数返回的是List[int]类型的值。通过调用get_list_type()函数得到的返回值returned_type是一个Type对象,表示List[int]类型。

或标注函数参数类型:

from typing import Type

def process_type(t: Type[str]) -> None:
print(t) process_type(str) # 输出: <class 'str'>

在上述示例中,Type[str]用于注解函数process_type的参数类型,说明函数接受一个类型为str的参数。通过在调用process_type函数时传入str作为参数,可以在函数内部获取到该类型的Type对象。

python之typing的更多相关文章

  1. python模块typing的作用

    一.介绍 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...

  2. Python演讲笔记1

    参考: 1. The Clean Architecture in Python (Brandon Rhodes) 2. Python Best Practice Patterns (Vladimir ...

  3. Java vs Python

    面试时常问到这两种语言的区别,在此总结一下. Referrence: Udemy:python-vs-java Generally, Python is much simpler to use, an ...

  4. 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.

    Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...

  5. 类型提示和python函数中'->'的用法

    一.类型提示 在python中,我们定义一个有参函数,调用该函数时需要传入参数,如下所示: # 定义一个简单的函数 def get_full_name(first_name, last_name): ...

  6. VS2013创建Node.js C++ Addons的过程

    首先看我的Node.js版本. node –v v6.11.4 然后参照这篇文章来做: https://nodejs.org/api/addons.html#addons_hello_world 安装 ...

  7. A Newbie’s Install of Keras & Tensorflow on Windows 10 with R

    This weekend, I decided it was time: I was going to update my Python environment and get Keras and T ...

  8. LeetCode——79. 单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...

  9. Python标准库--typing

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...

  10. Python 中的Duck Typing

    在学习Python的时候发现了鸭 子类型这个术语,听起来好像很有意思一样,所以把它记下来. 鸭子类型(Duck Typing)的名字来源于"鸭子测试": "当看到一只鸟走 ...

随机推荐

  1. C语言:应用程序增加库函数rand的步骤

    rand函数用来生成随机数,函数原型为int rand( void ); 返回值为生成的随机数,范围0~32767.在调用rand之前可以用srand函数初始化随机数发生器来生成更随机的数. 可以通过 ...

  2. 利用CSS 实现环形百分比进度展示

    先看效果图: UI设计了这样的效果,已读人数占总人数的百分比,环形展示. 这里可以用echarts图表,也可以用css实现,因为我是在小程序环境下,考虑到包大小体积,采用了css实现. 核心就是一行代 ...

  3. 小tips:docker 配置国内镜像地址

    在配置文件daemon.json中添加国内镜像,让其下载加速. vi /etc/docker/daemon.json 如下国内镜像: { "registry-mirrors": [ ...

  4. PDF解析,还能做得更好

    随着大模型文档智能应用逐渐步入正轨,文档解析类产品成为其中重要的一环.文档解析工具能够"唤醒"沉睡在PDF文件中的知识,将其转化为机器能够识别.读取的信息,将可用数据从txt.cs ...

  5. k8s 中的 Service 简介【k8s 系列之二】

    〇.前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然. 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过 ...

  6. CSS – Selector

    前言 这篇记入一些我常用到. 以前写的笔记 css 选择器 (学习笔记) Whatever (*) * {} By Id (#) #id {} By Class (.) .class-name {} ...

  7. Hugging Face NLP课程学习记录 - 0. 安装transformers库 & 1. Transformer 模型

    Hugging Face NLP课程学习记录 - 0. 安装transformers库 & 1. Transformer 模型 说明: 首次发表日期:2024-09-14 官网: https: ...

  8. 基于 Session 实现短信登录

    短信验证 一.基于Session 1.登录流程 1)发送验证码 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号 如果手机号合法,后台此时生成对应的验证码,同时将验证码进 ...

  9. Vue3——Vue Router

    安装 vue-router 依赖包 npm install vue-router@4 创建 router 文件夹,然后在里面创建一个 index.ts 文件,用于定义你的路由配置 // index.t ...

  10. k8s-部署

    目录 1 k8s 组件功能介绍 1.2 K8s 集群API: kube-apiserver 1.3 K8s 调度程序:kube-scheduler 1.4 K8s 控制器:kube-controlle ...