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中用startswith()函数判断字符串开头的教程
Apr 07 Python
python框架django基础指南
Sep 08 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
python去除文件中重复的行实例
Jun 29 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Python 过滤错误log并导出的实例
Dec 26 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
python实现串口通信的示例代码
Feb 10 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 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中smarty模板条件判断用法实例
2015/06/11 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
Javascript函数的参数
2015/07/16 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python算法应用实战之队列详解
2017/02/04 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
python用requests实现http请求代码实例
2019/10/31 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Python可以实现栈的结构吗
2020/05/27 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
小饰品店的创业计划书范文
2013/12/28 职场文书
粗加工管理制度
2014/02/04 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
商家认证委托书格式
2014/10/16 职场文书
2014年林业工作总结
2014/12/05 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
单位考核鉴定意见
2015/06/05 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL