python之typing
typing介绍
Python是一门动态语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,typing模块可以很好的解决这个问题。
Python的typing包是从Python 3.5版本引入的标准库,它提供了类型提示和类型注解的功能,用于对代码进行静态类型检查和类型推断。typing模块中定义了多种类型和泛型,以帮助开发者代码的可读性、可维护性和可靠性。
typing的作用
typing包的主要功能如下:
- 类型注解:typing包提供了多种用于类型注解的工具,包括基本类型(如int、str)、容器类型(如List、Dict)、函数类型(如Callable、Tuple)、泛型(如Generic、TypeVar)等。通过类型注解,可以在函数声明、变量声明和类声明中指定参数的类型、返回值的类型等,以增加代码的可读性和可靠性。
- 类型检查:通过与第三方工具(如mypy)集成,可以对使用了类型注解的代码进行静态类型检查。类型检查可以帮助发现潜在的类型错误和逻辑错误,以提前捕获问题并改善代码的质量。
- 泛型支持:typing模块提供了对泛型的支持,使得可以编写更通用和灵活的代码。通过泛型,可以在函数和类中引入类型参数,以处理各种类型的数据。
- 类、函数和变量装饰器: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的更多相关文章
- python模块typing的作用
一.介绍 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...
- Python演讲笔记1
参考: 1. The Clean Architecture in Python (Brandon Rhodes) 2. Python Best Practice Patterns (Vladimir ...
- Java vs Python
面试时常问到这两种语言的区别,在此总结一下. Referrence: Udemy:python-vs-java Generally, Python is much simpler to use, an ...
- 类型检查和鸭子类型 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 ...
- 类型提示和python函数中'->'的用法
一.类型提示 在python中,我们定义一个有参函数,调用该函数时需要传入参数,如下所示: # 定义一个简单的函数 def get_full_name(first_name, last_name): ...
- VS2013创建Node.js C++ Addons的过程
首先看我的Node.js版本. node –v v6.11.4 然后参照这篇文章来做: https://nodejs.org/api/addons.html#addons_hello_world 安装 ...
- 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 ...
- LeetCode——79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
- Python标准库--typing
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...
- Python 中的Duck Typing
在学习Python的时候发现了鸭 子类型这个术语,听起来好像很有意思一样,所以把它记下来. 鸭子类型(Duck Typing)的名字来源于"鸭子测试": "当看到一只鸟走 ...
随机推荐
- 【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
问题现象 某客户环境,客户的业务使用jdbc驱动向其他操作系统上的yashandb插入90万条数据,耗时大约30分钟. 问题的风险及影响 影响客户的业务处理效率 问题影响的版本 所有的yashandb ...
- Serilog文档翻译系列(二) - 设置AspNetCore应用程序
Serilog 日志记录适用于 ASP.NET Core.此包将 ASP.NET Core 的日志消息通过 Serilog 进行路由,使你可以将有关 ASP.NET 内部操作的信息写入与应用程序事件相 ...
- C# HttpClient 基本使用方式(一)
.NetCore主要提供了HttpWebRequest,WebClient,HttpClient这三种访问web的方式,其中HttpWebRequest,WebClient都在官方被标注为已过时,如果 ...
- WebRTC 简单入门与实践
一.前言 WebRTC 技术已经广泛在各个行业及场景中被应用,但对多数开发者来说,实时音视频及相关技术却是比较不常接触到的. 做为一名 Web 开发者,WebRTC 这块的概念着实花了不少时间才搞明白 ...
- CSS – display, visibility, opacity, transparent 的区别
前言 要让一个元素"消失", 有 3 种做法. 它们有一点点的不同. 在实战时要清楚什么时候用什么哦. 例子说明 <div class="abc"> ...
- 前端基本功——面试必问系列(1):都2024了,还没吃透Promise?一文搞懂
写在前面: 大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面. 想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定 ...
- Vue3——集成mock 模拟数据生成器
安装依赖 npm install -D mockjs vite-plugin-mock@2.9.6 在 vite.config.js 文件中引入并配置 vite-plugin-mock 插件 impo ...
- 林史·CLOI纪事本末
CLOI正源在JD,JD在初次短期集训结束后带出了一句经典名言: 那如果是在丛林里呢 这句话在短期内在全班范围内流传甚广,因此,\(GreatJungleLord\) 也因其幽默诙谐的形象赢得了大家的 ...
- LNMP 和 LAMP 对比 (仅供参考)
Nginx 性能稳定.功能丰富.运维简单.处理静态文件速度快且消耗系统资源极少. Apache 是 LAMP 架构最核心的 Web Server,开源.稳定.模块丰富是 Apache 的优势.但 Ap ...
- LeetCode 1819. 序列中不同最大公约数的数目(数论)
题目描述 给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数是 2 . 数组的一个 子序列 本质 ...