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在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
python实现连连看游戏
Feb 14 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
利用python进行数据加载
Jun 20 Python
关于 Python json中load和loads区别
Nov 07 Python
python使用shell脚本创建kafka连接器
Apr 29 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中uploaded_files函数使用方法详解
2011/03/09 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
详解js异步文件加载器
2016/01/24 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
javascript的函数作用域
2014/11/12 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
vue实现登录功能
2020/12/31 Vue.js
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python列表操作实例
2015/01/14 Python
利用Python破解验证码实例详解
2016/12/08 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
应届医学毕业生求职信分享
2013/12/02 职场文书
生日邀请函范文
2014/01/13 职场文书
学生会干部自荐信
2014/02/04 职场文书
党员组织关系介绍信
2014/02/13 职场文书
小学老师寄语大全
2014/04/04 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
员工工作表现自我评价
2015/03/06 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript