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 09 Python
简单的通用表达式求10乘阶示例
Mar 03 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 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 更新数据库中断的解决方法
2009/06/05 PHP
php修改时间格式的代码
2011/05/29 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
JavaScript单元测试ABC
2012/04/12 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
js实现数字滚动特效
2019/12/16 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
九步学会Python装饰器
2015/05/09 Python
Python中的rfind()方法使用详解
2015/05/19 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
python scipy卷积运算的实现方法
2019/09/16 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
2014年宣传思想工作总结
2014/12/10 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
2015年酒店工作总结
2015/04/28 职场文书