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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
pandas多级分组实现排序的方法
Apr 20 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
Python中关于浮点数的冷知识
Sep 22 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
python 实现多维数组(array)排序
Feb 28 Python
Python用requests库爬取返回为空的解决办法
Feb 21 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
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Python中用于计算对数的log()方法
2015/05/15 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
Java如何支持I18N?
2016/10/31 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
护理专科学生自荐书
2014/07/05 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
神龙架导游词
2015/02/11 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
如何在Python中妥善使用进度条详解
2022/04/05 Python