Python-typing: 类型标注与支持 Any类型详解


Posted in Python onMay 10, 2021

Any docs

Any 是一种特殊的类型。

静态类型检查器将所有类型视为与 Any 兼容,反之亦然, Any 也与所有类型相兼容。

这意味着可对类型为 Any 的值执行任何操作或方法调用,并将其赋值给任何变量:

from typing import Any
a = None    # type: Any
a = []      # OK
a = 2       # OK
s = ''      # type: str
s = a       # OK
def foo(item: Any) -> int:
    # Typechecks; 'item' could be any type,
    # and that type might have a 'bar' method
    item.bar()
    ...

需要注意的是,将 Any 类型的值赋值给另一个更具体的类型时,Python不会执行类型检查。例如,当把 a 赋值给 s 时,即使 s 被声明为 str 类型,在运行时接收到的是 int 值,静态类型检查器也不会报错。

此外,所有返回值无类型或形参无类型的函数将隐式地默认使用 Any 类型:

def legacy_parser(text):
    ...
    return data
# A static type checker will treat the above
# as having the same signature as:
def legacy_parser(text: Any) -> Any:
    ...
    return data

当需要混用动态类型和静态类型的代码时,上述行为可以让 Any 被用作 应急出口 。

Any 和 object 的行为对比。

与 Any 相似,所有的类型都是 object 的子类型。然而不同于 Any,反之并不成立: object 不是 其他所有类型的子类型。

这意味着当一个值的类型是 object 的时候,类型检查器会拒绝对它的几乎所有的操作。把它赋值给一个指定了类型的变量(或者当作返回值)是一个类型错误。

比如说:

def hash_a(item: object) -> int:
    # Fails; an object does not have a 'magic' method.
    item.magic()
    ...
def hash_b(item: Any) -> int:
    # Typechecks
    item.magic()
    ...
# Typechecks, since ints and strs are subclasses of object
hash_a(42)
hash_a("foo")
# Typechecks, since Any is compatible with all types
hash_b(42)
hash_b("foo")

使用 object 示意一个值可以类型安全地兼容任何类型。使用 Any 示意一个值地类型是动态定义的。

补充:python3.5 typing — 类型标注支持

函数接受并返回一个字符串,注释像下面这样:

def greeting(name: str) -> str:
    return 'Hello' + name

在函数 greeting 中,参数 name 预期是 str 类型,并且返回 str 类型。子类型允许作为参数。

1.1. 类型别名

型别名通过将类型分配给别名来定义。在这个例子中, Vector 和 List[float] 将被视为可互换的同义词:

from typing import List
Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]
# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])

类型别名可用于简化复杂类型签名。

例如:

from typing import Dict, Tuple, List
ConnectionOptions = Dict[str, str]
Address = Tuple[str, int]
Server = Tuple[Address, ConnectionOptions]
def broadcast_message(message: str, servers: List[Server]) -> None:
    ...
# The static type checker will treat the previous type signature as
# being exactly equivalent to this one.
def broadcast_message(
        message: str,
        servers: List[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
    ...

请注意,None 作为类型提示是一种特殊情况,并且由 type(None) 取代。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python中获取网页状态码的两个方法
Nov 03 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
python PyTorch预训练示例
Feb 11 Python
tensorflow实现softma识别MNIST
Mar 12 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
python元组的概念知识点
Nov 19 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
python语言是免费还是收费的?
Jun 15 Python
Python3爬虫中Ajax的用法
Jul 10 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 Python
超详细Python解释器新手安装教程
Python机器学习三大件之一numpy
python实现自动清理文件夹旧文件
May 10 #Python
Python中的min及返回最小值索引的操作
May 10 #Python
发工资啦!教你用Python实现邮箱自动群发工资条
在Django中使用MQTT的方法
May 10 #Python
十个Python自动化常用操作,即拿即用
May 10 #Python
You might like
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
斜45度寻路实现函数
2009/08/20 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
2013/03/21 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
Django框架多表查询实例分析
2018/07/04 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
python3.4中清屏的处理方法
2020/07/06 Python
python如何绘制疫情图
2020/09/16 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
Java和Javasciprt的区别
2012/09/02 面试题
《放飞蜻蜓》教学反思
2014/04/27 职场文书
学校读书活动总结
2014/06/30 职场文书
幼儿生日活动方案
2014/08/27 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
个人股份合作协议书
2014/10/24 职场文书
如何写辞职信
2015/05/13 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书