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爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
通过Pandas读取大文件的实例
Jun 07 Python
python读取文本绘制动态速度曲线
Jun 21 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
python实现机器人卡牌
Oct 06 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
Python中json.dumps()函数的使用解析
May 17 Python
Python List remove()实例用法详解
Aug 02 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调用Webservice实例代码
2011/07/29 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
jquery parent和parents的区别分析
2013/10/02 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
简述JS控制台的使用
2018/07/15 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
python del()函数用法
2013/03/24 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python能开发游戏吗
2020/06/11 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
中科创达面试题
2016/12/28 面试题
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏