Python3中typing模块介绍
typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py。此模块为类型提示(Type Hints)提供运行时支持(This module provides runtime support for type hints)。从python 3.5版本开始将Typing作为标准库引入。
python3中增加了Function Annotation(函数注解,能够声明类型)的功能,可以使用类型检查工具如mypy达到类型静态检查的效果。
类型提示对于运行实际上没有任何影响。
Type aliases:类型别名是通过将类型分配给别名来定义的。类型别名可用于简化复杂类型签名。
# Vector和List[float]将被视为可互换的同义词
Vector = List[float]def scale(scalar: float, vector: Vector) -> Vector:return [scalar * num for num in vector]# a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4]); print(new_vector) # [2.0, -8.4, 10.8]
NewType:使用NewType辅助类来创建不同的类型。静态类型检查器会将新类型视为原始类型的子类,这有助于捕获逻辑错误。
UserId = NewType('UserId', int) # 实际上UserID就是一个int类型,可以对其像int一样正常操作
some_id = UserId(524313); print(some_id) # 524313def get_user_name(user_id: UserId) -> str:return str(user_id)user_a = get_user_name(UserId(42351)); print(user_a) # 42351# 可以对UserId类型的变量执行所有int操作,但结果始终为int类型
output = UserId(23413) + UserId(54341); print(output) # 77754
Any:是一种特殊的类型。静态类型检查器会将每种类型都视为与Any兼容,同样,Any也与所有类型兼容。可以对Any类型的值执行任何操作或方法调用,并将其分配给任何变量。将Any类型的值分配给更精确的类型(more precise type)时,不会执行类型检查。所有没有返回类型或参数类型的函数都将隐式地默认使用Any。
Any与object的区别:与Any类似,每个类型都是object的子类型。然而,与Any不同,反过来就不成立了:object不是其它类型的子类型。
使用object,说明值能以类型安全的方式转为任何类型;使用Any,说明值是动态类型。
a: Any = None
a = [] # OK
a = 2 # OKs: str = ""
s = a # OK
print(s) # 2
NoReturn:特殊类型,标记一个函数没有返回值
def stop() -> NoReturn:raise RuntimeError('no way')stop()
Union:联合类型,Union[X, Y]等价于X|Y,意味着X或Y。使用形如Union[int, str]的形式来定义一个联合体:(1).参数必须是某种类型,且至少有一个;(2).联合类型的联合类型会被展开(flattened);(3).仅有一个参数的联合类型就是该参数自身;(4).冗余的参数会被跳过(skipped);(5).在比较联合类型的时候,参数顺序会被忽略(ignored);(6).不能继承或者实例化一个联合类型;(7).不支持Union[X][Y]这种写法。
# 联合类型的联合类型会被展开(flattened)
Union[Union[int, str], float] == Union[int, str, float]
# 仅有一个参数的联合类型就是该参数自身
Union[int] == int
# 冗余的参数会被跳过(skipped)
Union[int, str, int] == Union[int, str] # == int | str
# 在比较联合类型的时候,参数顺序会被忽略(ignored)
Union[int, str] == Union[str, int]
Optional:可选类型,Optional[X]等价于X|None,或Union[X, None]。可选类型与含默认值的可选参数不同,含默认值的可选参数不需要在类型注解(type annotation)上添加Optional限定符,因为它仅是可选的。显式应用None值时,不管该参数是否可选,Optional都适用。
# 可选类型与含默认值的可选参数不同,含默认值的可选参数不需要在类型注解(type annotation)上添加Optional限定符,因为它仅是可选的
def foo(arg: int = 0) -> None: ...
# 显式应用None值时,不管该参数是否可选,Optional都适用
def foo(arg: Optional[int] = None) -> None: ...
Callable:可调用类型,下标语法(subscription syntax)必须始终与两个值一起使用:参数列表和返回类型。参数列表必须是类型列表或省略号;返回类型必须是单一类型。如:Callable[[int], str]
没有指示可选参数或关键字参数的语法,这种函数类型很少用作回调类型。Callable[…, ReturnType]可用于类型提示一个可调用的接受任意数量的参数并返回ReturnType。一个普通的Callable等价于Callable[…, Any]。
将其它可调用对象作为参数的可调用对象可能表明它们的参数类型使用typing.ParamSpec相互依赖。此外,如果该可调用对象从其它可调用对象中添加或删除参数,则可以使用typing.Concatenate运算符。
def other_function(x: int, y: float) -> float:print(f"x: {x}, y: {y}")return ydef any_function(func: Callable[[int, float], float], x: int, y: float) -> float:return func(x, y)any_function(other_function, x=10, y=20)
any_function(other_function, x="abc", y=20) # 注:此条语句可以正常执行,类型提示(type hints)对运行实际上是没有影响的def get_addr(csdn: str, github: str, port: int=403) -> str:return f"csdn: {csdn}, github: {github}, port: {port}"def get_addr() -> Callable[[str, str, int], str]:return get_addr
Literal:字面类型,可用于向类型检查器指示相应的变量或函数参数与提供的字面量(或多个字面量之一)等效的值。Literal[…]不能创建子类。在运行时,允许将任意值作为Literal[…]的类型参数,但类型检查器可能会对此加以限制。
def validate_simple(data: Any) -> Literal[True]: ... # always returns TrueMODE = Literal["r", "rb", "w", "wb"]
def open_helper(file: str, mode: MODE) -> str:return file + ":" + modeprint(open_helper("/some/path", "r")) # /some/path:r
TypeVar:容器中,对象的类型信息不能以Generic(泛型)方式静态推断,因此,抽象基类扩展支持下标(subscription),用于表示容器元素的预期类型。可以使用typing模块中的TypeVar新工厂实现Generic参数化:(1).用户定义的类可以定义为Generic类;(2). Generic类型支持多个类型变量,不过,类型变量可能会受到限制;(3). Generic类型变量的参数都必须是不同的;(4).Generic支持多重继承;(5).从Generic类继承时,可以修复一些类型变量;(6).使用Generic类而不指定类型参数时,每个位置的类型都预设为Any。
T = TypeVar('T') # Declare type variable, Can be anything
# 泛型类型支持多个类型变量,不过,类型变量可能会受到限制
S = TypeVar('S', int, str) # Must be int or strclass StrangePair(Generic[T, S]): ...# 泛型类型变量的参数都必须是不同的
#class Pair(Generic[T, T]): ... # TypeError: Parameters to Generic[...] must all be uniquelength = "5.5"
Length = TypeVar("Length", int, float, None) # Length可以使用int, float或None来表示
def get_length() -> Length:return lengthprint(get_length()) # 5.5
TypedDict:把类型提示(type hints)添加到字典的特殊构造(special construct)。在运行时,它是一个普通的dict。TypedDict声明一个字典类型,该类型期望它的所有实例都有一组固定的keys,其中每个key都与对应类型的值关联。这种期望不会在运行时检查,而只会由类型检查器强制执行。默认情况下,所有的keys都必须出现在一个TypedDict中,可以通过指定总体(totality)来重写它。
class Point2D(TypedDict):x: inty: intlabel: stra: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
b: Point2D = {'z': 3, 'label': 'bad'} # Fails type checkassert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
Dict:dict的泛型(generic)版本,用于注解(annotate)返回类型。注解参数时,最好使用抽象集合类型(abstract collection type),例如Mapping。Dict与dict之间没有真正的区别,但是Dict是泛型类型,它允许你指定key和value的类型,使其更加灵活。
def count_words(text: str) -> Dict[str, int]: ...
x: Dict[str, int] = {"beijing", 1}; print(x) # {"beijing", 1}
Mapping:collections.abc.Mapping的泛型(generic)版本。
def get_position_in_index(word_list: Mapping[str, int], word: str) -> int:return word_list[word]def func(m: Mapping[int, str]) -> List[int]:return list(m.keys())print(func({0: "no", 1: "yes"})) # [0, 1]
List:list的泛型(generic)版本,用于注解(annotate)返回类型。注解参数时,最好使用抽象集合类型(abstract collection type),例如Sequence或Iterable。
T = TypeVar('T', int, float)def vec2(x: T, y: T) -> List[T]:return [x, y]print(vec2(3, 2)) # [3, 2]def keep_positives(vector: Sequence[T]) -> List[T]:return [item for item in vector if item > 0]x: List[int] = [1, 2, 3]; print(x) # [1, 2, 3]
Tuple:元组类型,Tuple[X, Y]是二项的元组类型,第一个元素的类型是X,第二个元素的类型是Y。空元组的类型可以写为Tuple[()]。如Tuple[int, float, str]是由整数、浮点数、字符串组成的三项元组。可用字面省略号(literal ellipsis)指定可变长元组,如Tuple[int, …]。
# 指定所有元素的类型
x: Tuple[int, float, str] = (1, 2.1, "beijing"); print(x) # (1, 2.1, "beijing")
# 可变长度的元组
y: Tuple[int, ...] = (1, 2.1, "beijing"); print(y) # (1, 2.1, "beijing")
Set:builtins.set的泛型版本,用于注解返回类型。注解参数时,最好使用抽象集合类型,例如AbstractSet。
x: Set[int] = {1, 2, 3}; print(x) # {1, 2, 3}
AbstractSet:collections.abc.Set的泛型版本。
Deque:collections.deque的泛型版本。
Sequence:collections.abc.Sequence的泛型版本。
Iterable:collections.abc.Iterator的泛型版本。
def func(l: Iterable[int]) -> List[str]:return [str(x) for x in l]print(func(range(1, 5))) # ['1', '2', '3', '4']
overload:参考:https://blog.csdn.net/fengbingchun/article/details/121959036
以上内容主要参考:https://docs.python.org/3/library/typing.html
GitHub:https://github.com/fengbingchun/Python_Test
相关文章:

显示所有文件和文件夹无论如何 无法被设置
问题:XP系统选显示所有文件和文件夹确定后没有任何反应再次打开文件夹选项里面仍是不显示隐藏的文件和文件夹 答案:在记事本粘贴下面文字,另存为所有文件, .reg 格式。成功的话图标变为绿色碎方块。在双击它。 Windows Registry E…
工作5年后才明白的道理:不起眼的技能中,藏着你的未来
编程圈儿一直都流传着一个调侃的段子:一流程序员靠数学二流靠算法三流靠逻辑四流靠SDK五流靠Google和StackOverFlow六流靠百度和自己琢磨低端的看高端的就是黑魔法!从过来人的角度看,这不仅仅是个段子,而是目前程序员的真实写照。…

Transform-style和Perspective属性
在《CSS3 Transform——transform-origin》一文中主要介绍了CSS3 Transform属性中的transform-origin属性的使用,其实在transform属性中,transform-origin属性仅是其中之一,要彻底理解transform属性,这是不够的,必须的…

Python3中__call__方法介绍
如果Python3类中有__call__方法,那么此类实例的行为类似于函数并且可以像函数一样被调用。当实例作为函数被调用时,如果定义了此方法,则x(arg1, arg2, …)是x.__call__(arg1, arg2, …)的简写。 为了将一个类实例当作函数调用,我们…

切尔西携手YouTube 英超第一家共享视频球队诞生
英格兰超级足球联赛冠军球队切尔西日前表示,已经与互联网视频服务网站YouTube签订了合作协议,未来将通过YouTube发布每日新闻和视频内容,从而也成为英超首支在线视频服务的球队. 据路透社报道,根据协议的内容,切尔西将建立一个YouTube旗下的品牌网站,其中将发布每日更新内容,当…
商汤联手华科:提出文字检测模型GNNets,新颖模块可解决几何分布难题
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】今年的ICCV,商汤科技及联合实验室共有57篇论文入选ICCV 2019(包含11篇Oral࿰…

(链表)反转链表Reverse List
逆转链表是简单而又简单的链表问题,其问题的方法之一可以设置三个指针,一个指向当前结点,一个指向前驱结点,一个指向后继指针 代码如下: class Solution { public:ListNode* ReverseList(ListNode* pHead) { // if(pHeadNULL || pHead->nextNULL) // return pH…

很长时间没有来了
好长时间没有来自己的博客了,更新的速度实在是太慢了,自己已经找了一份新的工作,给自己一个好的环境吧,有时间可以去学习更多的网络知识了.学习万岁!加一下,博友:思念狗的骨头:[url]http://starger.blog.51cto.com/ [/url] 他的文章还是比较不错的!转载于:https://blog.51cto.c…
十年磨一剑,可重构计算架构将引领未来芯片市场
2019 年 6 月,AI 芯片创业公司清微智能首款可重构计算架构 AI 芯片实现量产的消息在业内迅速传开,可重构计算架构芯片再次引发一波讨论的热潮。经历过十多年的技术积累,这枚小小的芯片在全球芯片市场中开启了全新的篇章。时光倒流,…

PyTorch中nn.Module类中__call__方法介绍
在PyTorch源码的torch/nn/modules/module.py文件中,有一条__call__语句和一条forward语句,如下: __call__ : Callable[…, Any] _call_impl forward: Callable[…, Any] _forward_unimplemented 在PyTorch中nn.Module类是所有神经网络模块…

压缩和归档及vi的使用
1.cat(more less head tail) /etc/passwd :查看/etc/passwd文件内容2.head -13 /etc/passwd | tail -1 :只查看/etc/passwd文件中第13行3.wc -l /etc/passwd :统计/etc/passwd文件有多少行4.grep -v "^#" /etc/inittab | grep -v &…
看到抖音上Python工程师晒得工资条,我沉默了......
我是个抖音中毒者闲来无事就喜欢刷抖音最近刷到了一个Python工程师的工资条然后我默默的打开看了然后我默默的关闭了我想这个工资算下来好像也不算高我就去其他渠道搜索了一下相关的Python工作岗位的工资好吧,都是比这个工资更高的emmm.....此时我很沉默后悔为什么我…

windows上通过cmake-gui生成pytorch工程
在Windows下通过cmake-gui.exe生成不带cuda的Torch.sln工程操作步骤:PyTorch版本使用1.8.1。首先可以先通过打开cmake-gui.exe,指定pytorch源代码目录和生成vs2017工程的位置;然后点击Configure,选中”Visual Studio 15 2017 Win6…

RequisitePro SQL SERVER数据库的配置
安装好Rational RequisitePro后,新建立一个project时,要选择库的类型,可以支持MS Access、SQL SERVER和oralce首先在SQL SERVER里新建一数据库名为”RequisitePro”然后在查询分析器里执行其自带的脚本文件,位置在《Rational安装目…

yum三种方法
RHEL5中实现各种服务的准备条件:(一)、制作YUM本地源:YUM简介:YUM是Yellow dog Updater Modified的简称,yum是软件的仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的header&…

损失函数之Cross-Entropy介绍及C++实现
在深度学习中,损失函数用来评估模型的预测值与真实值之间的差异程度,是模型对数据拟合程度的反映,拟合的越差,损失函数的值越大;反之,损失函数越小,说明模型的预测值就越接近真实值,…

C语言应用于LR中-如何得到数组长度
C语言没有提供获取数组长度的函数,最起码我不知道,所以编写了一个函数取数组的长度,调试成功,大家可以试试。另外也可以用sizeof(a)/4来取得整型数组的长度,因为整型占4个字节。效果相同。#include "web_api.h&qu…
6个你必须知道的机器学习的革命性的教训
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息作者 | James Warner编译 | ronghuaiyang来源 | 转载自AI公园(ID:AI_Paradise)【导读】机器学习是未来,因为它将广泛应用于计算机和其他领域。尽管如此,开发有效的机…

vim ctags使用方法
一、用好系统自带软件ctags大部分的unix系统都有ctags软件,它能跟vim很好地合作。用途:生成c语言的标签文件,实现相关c文件之间的跳转。用法:1.生成标签文件在当前目录下(运行$提示符后面的命令): $ctags -R .-R表示recursive,递归,为当前目录…

pybind11介绍
pybind11是一个轻量级的仅头文件库,主要用于创建现有C代码的Python绑定,它的源码在https://github.com/pybind/pybind11,license为BSD,最新发布版本为2.9.1。 可将pybind11库视为Boost.Python的一个小型自包含版本(Think of this …
改善AI性别偏见的4种方法 | CSDN博文精选
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息作者 | Josh Feast翻译 | 王子龙校对 | 王琦本文阐述导致AI偏见的原因并提出应用的解决方案。任何对AI偏见的审查都需要意识到一个事实:这些偏见主要源于人类固有的偏见。我们创建、训练的模…

C#程序调用外部程序
/**编程语言:VisualStudio.NetC#(Beta2)*作者:迪泊威*功能:通过C#程序调用Windows记事本程序编辑一个*名为test.txt的文本文件。**在整个程序中System.Diagnostics.Process.Start(Info)*为主要语句。*如果只是单独执行一个外部程序࿰…

svn 同步脚本
REPOS"$1"REV"$2"export LANGen_US.UTF-8/usr/bin/svn update /home/wwwroot/yswifi --username yangxc --password yangxc >>/tmp/svn_hook_log.txtecho who am i,$REPOS,$REV >> /tmp_hook_var.txt转载于:https://www.cnblogs.com/xkcp008/p…
DevOps火爆,招人却太难了!
DevOps一词最近两年人们谈的比较多,很多人简单地理解为“Dev”“Ops”,是否将开发人员和运营人员放在一个部门就完事了呢?其实DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合。…

网络数据包分析软件Wireshark简介
Wireshark是被广泛使用的免费开源的网络协议分析软件(network protocol analyzer)或网络数据包分析软件,它可以让你在微观层面上查看网络上发生的事情,它的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包信息。它的源码在https://…

SEO研究:网站结构
在衡量所有权重之间,网站结构大概占到30%,这也是很多网站排名不好,或者有站长根本不用优化就能获得很好排名的原因。说到结构必须明白两个概念,一个是物理概念,就是文件存放的路径,另一个是逻辑结构。比较好的情况是逻…

form实现登陆操作
这几天想写个保存cookies的网页,先写了个登陆界面,奈何点击登陆后总是无法正常跳转。经查阅资料和询问高手,总算得以解决。 原错误代码如下: <html> <title>SaveCookies</title> <head> <script>fu…

深度学习中的优化算法之BGD
之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD、SGD、MBGD,它们的不同之处在于我们使用多少数据来计算目标函数的梯度。 大多数深度学习算法都涉及某种形式的优化。优化指…
死宅福音:乐高不怕多,智能分拣机帮你归类
作者 | 神经小兮来源 | HyperAI超神经(ID:HyperAI)【导读】乐高现在几乎已经是优质玩具的代名词,该品牌旗下最为知名的,莫过于乐高积木。其丰富的形状与多样的玩法,无论大人小孩都喜欢。但是,这…

优化eclipse启动速度
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 最近发现eclipse越来越慢,影响了开发使用速度。经过处理,快了一些,希望给大家一些提示。 1,取消系统的自动折叠 操作方法:…