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编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
python字典DICT类型合并详解
Aug 17 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
利用Python如何生成便签图片详解
Jul 09 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
django 解决扩展自带User表遇到的问题
May 14 Python
python属于解释型语言么
Jun 15 Python
导致python中import错误的原因是什么
Jul 01 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 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学习笔记之面向对象编程
2012/12/29 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
Javascript实现的分页函数
2007/02/07 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
Python绘制热力图示例
2019/09/27 Python
Python的缺点和劣势分析
2019/11/19 Python
python元组拆包实现方法
2021/02/28 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
高中化学教学反思
2014/01/13 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
2014年村官工作总结
2014/11/24 职场文书
房屋认购协议书
2015/01/29 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python