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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
Python实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
python如何写try语句
Jul 14 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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上传图片并压缩的实现方法
2015/12/22 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
详解appium+python 启动一个app步骤
2017/12/20 Python
Python数据可视化之画图
2019/01/15 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Django model update的多种用法介绍
2020/03/28 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
防汛工作情况汇报
2014/10/28 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
2015选调生工作总结
2015/07/24 职场文书
员工规章制度范本
2015/08/07 职场文书
Python实现视频自动打码的示例代码
2022/04/08 Python
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL