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 dict remove数组删除(del,pop)
Mar 24 Python
Python操作csv文件实例详解
Jul 31 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Python中的 sort 和 sorted的用法与区别
Aug 10 Python
利用Python实现kNN算法的代码
Aug 16 Python
Django框架模板用法入门教程
Nov 04 Python
python 实现多维数组转向量
Nov 30 Python
python判断链表是否有环的实例代码
Jan 31 Python
解决echarts中饼图标签重叠的问题
May 16 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python操作xlsx格式文件并读取
Jun 02 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批量上传的实现代码
2013/06/09 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js 匿名调用实现代码
2009/06/19 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
[03:48]大碗DOTA
2019/07/25 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
python框架django基础指南
2016/09/08 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
端午节演讲稿
2014/05/23 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers