typing使用
官方文档: typing
注: typing是python3.5(PEP484)开始的
可用于: 类型检查器、集成开发环境、静态检查器等, 但是不强制使用
使用方式
两种使用方式
- 别名: 先定义
=, 再使用:- 直接使用:
:
from typing import List
T1 = List[str]
def test(t1: T1, t2: List[str]):
print(t1[0].title())
print(t2[0].title())
创建新类型 NewType
主要用于类型检测
NewType(name, tp)返回其原本的值
静态类型检查器会将新类型看作是原始类型的一个子类
即:name是新的类型tp是原始类型
注: 在python3.10之前NewType是普通的函数, 之后是一个类, 会产生一个类, 返回的原来的值, 故不会对常规函数产生影响
from typing import NewType, NoReturn
# 创建int的子类, 名为UserId
UserIdType = NewType('UserId', int)
# 使用
def name_by_id(user_id: UserIdType) -> NoReturn:
print(user_id)
# 类型检测错误
UserIdType('user')
# 类型检测成功, 返回原类型 "int"
num = UserIdType(5)
# 类型检测错误, 需要传入UserIdType, 而不是int
name_by_id(42)
# 类型检测成功
name_by_id(UserIdType(42)) # OK
类型变量 TypeVar
类型变量主要用于泛型类型与泛型函数定义的参数
第一个参数是名称, 其他参数是类型
from typing import TypeVar, Sequence
# 任意类型
T = TypeVar('T')
# 必须是str或bytes
A = TypeVar('A', str, bytes)
# (any, int) -> [any, ...]
def repeat(x: T, n: int) -> Sequence[T]:
return [x] * n
# (str/bytes, str/bytes) -> str/bytes
def longest(x: A, y: A) -> A:
return x if len(x) >= len(y) else y
元祖 Tuple
使用场景
- 有限元素:
Tuple[X, Y], 即第一个元素类型为X, 第二个元素类型为Y- 空元组:
Tuple[()]- 可用
...指定任意个同类:Tuple[int, ...]即多个int元素的元组- 不指定时(
Tuple)等价于Tuple[Any, ...]
from typing import Tuple
# 任意类型元组
def t1(t: Tuple):
pass
# 全为字符串的元组
def t2(t: Tuple[str, ...]):
pass
# 多个类型有 "..." 时为任意类型
def t3(t: Tuple[str, int, ...]):
pass
列表 List
使用方式如上的Tuple
from typing import List
# 任意类型
def t1(t: List):
pass
# 全为字符串
def t2(t: List[str, ...]):
pass
# 多个类型有 "..." 时为任意类型
def t3(t: List[str, int, ...]):
pass
字典 Dict
定义形式:
Dict[key类型, val类型]
from typing import Dict
# key为字符串 value为int
def t1(t: Dict[str, int]):
pass
集合 Set
不能使用
...
最多只能有一个参数, 即只能有一种类型
from typing import Set
# 任意类型
def t1(t: Set):
pass
# 字符串
def t2(t: Set[str]):
pass
序列类型 Sequence
使用注意点与Set相同
from typing import Union, Sequence
# int
def t1(t: Sequence[int]):
pass
可调用类型 Callable
即可调用对象
定义形如:Callable[[Arg1Type, Arg2Type], ReturnType], 第一个参数是列表 值为可调用对象的参数类型, 第二个参数是返回值
from typing import Callable
def test(c: Callable[[int, str], str]):
res = c(1, "a")
# 1a <class 'str'>
print(res, type(res))
def func(a: int, b: str) -> str:
return str(a) + b
test(func)
任意类型 Any
任意类型
from typing import Any
# 任意类型
def t1(a: Any, b: ...):
pass
t1(1, 2)
t1("a", "b")
无返回值 NoReturn
标记没有返回值的函数
from typing import NoReturn
def stop() -> NoReturn:
raise RuntimeError('no way')
联合类型 Union
即必须是指定的类型
联合中的联合会被展平:
Union[Union[int, str], float] == Union[int, str, float]
单参数即本身:Union[int] == int
冗余参数跳过:Union[int, str, int] == Union[int, str] == int | str
无顺序:Union[int, str] == Union[str, int]
from typing import Union
# str或int
def t1(t: Union[str, int]):
pass
python3.10之后可以写成
X | Y, 不需要额外导入Union
可选类型 Optional
即可以是指定的类型
含默认值的可选参数不需要在类型注解上添加 Optional 限定符
默认值为None时, 可以用Optional
from typing import Optional
# t的类型可以是int
def t1(t: Optional[int] = None):
pass
typing使用的更多相关文章
- Python标准库--typing
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...
- 最牛的打字效果JS插件 typing.js
最新在做公司的一个项目,需要实现一个敲打代码的动画效果,粗意味比较简单,果断自己直接开写,写着写着发现是一个坑.需要支持语法高亮,并不能直接简单的用setTimeout来动态附件innerHTML.苦 ...
- Monkey Patch/Monkey Testing/Duck Typing/Duck Test
Monkey Patch Monkey Testing Duck Typing Duck Test
- SGU 422 Fast Typing(概率DP)
题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...
- Cellphone Typing 字典树
Cellphone Typing Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Ori ...
- 什么是“鸭子类型(duck typing)”?
在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”. 它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...
- thinking in java Generics Latent typing
The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...
- 鸭子类型duck typing(动态)
在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...
- How to Avoid Producing Legacy Code at the Speed of Typing
英语不好翻译很烂.英语好的去看原文. About the Author I am a software architect/developer/programmer.I have a rather p ...
- 使用python3的typing模块提高代码健壮性
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
随机推荐
- 关于国密HTTPS 的那些事(一)
关于国密HTTPS 的那些事(一) 随着<密码法>密码法的颁布与实施,国密的应用及推广终于有法可依.而对于应用国密其中的一个重要组成部分----国密HTTPS通信也应运而生.为了大家更好的 ...
- Java(一)——基础知识
引言 之前一直对 Java 怀有固执的偏见,以为 Java 是编写前端的语言,作为一个机械生,非常抗拒去学它. 但是最近接触一点以后,完全改观了先前的看法,于是开启了对 Java 的大学习. 一.数据 ...
- 如何发现 Kubernetes 中服务和工作负载的异常
大家好,我是来自阿里云的李煌东,今天由我为大家分享 Kubernetes 监控公开课的第二节内容:如何发现 Kubernetes 中服务和工作负载的异常. 本次分享由三个部分组成: 一.Kuberne ...
- 学习使用Wpf开源的文本编辑器—smithhtmleditor
前言 本文主要介绍使用Wpf文本编辑器--smithhtmleditor. 编辑器使用 首先新建一个项目WpfEditor. 然后到Codeplex下载smithhtmleditor. 下载地址:ht ...
- CF49E Common ancestor(dp+dp+dp)
纪念卡常把自己卡死的一次自闭模拟赛 QWQ 一开始看这个题,以为是个图论,仔细一想,貌似可以直接dp啊. 首先,因为规则只有从两个变为1个,貌似可以用类似区间\(dp\)的方式来\(check\)一段 ...
- 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析
SudokuSolver 2.3 程序实现 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析 里新发现了一处可以改进 grp 算法的地方,本次版本实现了对应的改进 grp 算法 ...
- Kubernetes-Service介绍(二)-服务发现
前言 本篇是Kubernetes第九篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...
- 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析
SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...
- 大闸蟹的 O O 战记
一. 第四单元架构设计分析 第一次作业,UML类图 第一次作业的主要任务是完成对UML类图的解析并实现查询等操作,需要在课程组给定的框架中添加函数.对于UML类图,其存储是按照元素来存储的,其将所有的 ...
- java监控JVM的内存使用情况等
以下的程序监控参数的代码,有些是从网络上获取的,此处进行一个记录是为了以后如果要用到方便记录. 1.引入jar包,为了获取一些cpu的使用率等信息 <dependency> <gro ...