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错误处理详解
Sep 28 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python库matplotlib绘制坐标图
Oct 18 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
python文件处理fileinput使用方法详解
Jan 02 Python
python分别打包出32位和64位应用程序
Feb 18 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 Python
Python切片列表字符串如何实现切换
Aug 06 Python
python爬虫如何解决图片验证码
Feb 14 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
门卫班长岗位职责
2013/12/15 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
通知函格式范文
2015/04/27 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
MySQL窗口函数的具体使用
2021/11/17 MySQL
Tomcat用户管理的优化配置详解
2022/03/31 Servers
python中redis包操作数据库的教程
2022/04/19 Python