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中二维列表如何获取子区域元素的组成
Jan 19 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
python中的tcp示例详解
Dec 09 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
python实现快递价格查询系统
Mar 03 Python
Python修改列表值问题解决方案
Mar 06 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
python如何对链表操作
Oct 10 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php PDO异常处理详解
2016/11/20 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
javascript 短路法代码精简
2009/08/20 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
python实现停车管理系统
2018/11/30 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
行政经理岗位职责
2013/11/09 职场文书
航空大学应届生求职信
2013/11/10 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
Django实现聊天机器人
2021/05/31 Python
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle