官方文档: typing

注: typing是python3.5(PEP484)开始的

可用于: 类型检查器、集成开发环境、静态检查器等, 但是不强制使用

使用方式

两种使用方式

  1. 别名: 先定义=, 再使用:
  2. 直接使用: :
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

使用场景

  1. 有限元素: Tuple[X, Y], 即第一个元素类型为X, 第二个元素类型为Y
  2. 空元组: Tuple[()]
  3. 可用...指定任意个同类: Tuple[int, ...]即多个int元素的元组
  4. 不指定时(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使用的更多相关文章

  1. Python标准库--typing

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

  2. 最牛的打字效果JS插件 typing.js

    最新在做公司的一个项目,需要实现一个敲打代码的动画效果,粗意味比较简单,果断自己直接开写,写着写着发现是一个坑.需要支持语法高亮,并不能直接简单的用setTimeout来动态附件innerHTML.苦 ...

  3. Monkey Patch/Monkey Testing/Duck Typing/Duck Test

    Monkey Patch Monkey Testing Duck Typing Duck Test

  4. SGU 422 Fast Typing(概率DP)

    题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...

  5. Cellphone Typing 字典树

    Cellphone Typing Time Limit: 5000ms Memory Limit: 131072KB   This problem will be judged on UVA. Ori ...

  6. 什么是“鸭子类型(duck typing)”?

    在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”.   它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...

  7. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  8. 鸭子类型duck typing(动态)

    在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...

  9. 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 ...

  10. 使用python3的typing模块提高代码健壮性

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

随机推荐

  1. hdu4479 (数学题)(算术基本定理)

    题目大意 给定一个三元组\((x,y,z)\)的\(gcd\)和\(lcm\),求可能的三元组的数量是多少,其中三元组是的具有顺序的 其中\(gcd\)和\(lcm\)都是32位整数范围之内 由算术基 ...

  2. Java(29)集合四Collections

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228439.html 博客主页:https://www.cnblogs.com/testero ...

  3. mac无坑安装nginx

    mac无坑安装nginx 首先需要mac下有一个缺失的软件包的管理器------->homebrew 1.打开终端输入 brew update 说明homebrew已经安装好了 2.继续执行以下 ...

  4. 记一次 .NET 某资讯论坛 CPU爆高分析

    大概有11天没发文了,真的不是因为懒,本想前几天抽空写,不知道为啥最近求助的朋友比较多,一天都能拿到2-3个求助dump,晚上回来就是一顿分析,有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓 ...

  5. UltraSoft - Beta - Scrum Meeting 9

    Date: May 25th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 用户忘记密码界面初稿完成 Kkk ...

  6. BUAA软件工程个人博客作业

    软件工程个人博客作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...

  7. Canal的简单使用

    Canal的简单实用 一.背景 二.canal的工作原理 三.安装canal 1.mysql配置相关 1.检测binlog是否开启 2.mysql开启binlog 3.创建canal用户 2.cana ...

  8. hystrix的配置说明

    在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统 ...

  9. (二)、Docker 快速入门

    文档:https://docs.docker.com/install/linux/docker-ce/centos/ 中文文档:https://docs.docker-cn.com/engine/in ...

  10. 设计的MOS管三极管简单开关电路驱动能力不够2

    设计的MOS管三极管简单开关电路驱动能力不够 [复制链接]     lxizj 9 主题 454 帖子 1783 积分 四级会员(40) 积分 1783 发消息 16#   发表于 2012-4-23 ...