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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
Python中的exec、eval使用实例
Sep 23 Python
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
轻松实现python搭建微信公众平台
Feb 16 Python
python2 与 python3 实现共存的方法
Jul 12 Python
django的ORM操作 增加和查询
Jul 26 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python之字典添加元素的几种方法
Sep 30 Python
Python办公自动化之Excel(中)
May 24 Python
Python快速实现一键抠图功能的全过程
Jun 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中Date获取时间不正确怎么办
2008/06/05 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
pytorch forward两个参数实例
2020/01/17 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
软件工程师岗位职责
2013/11/16 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
赞美教师的句子
2019/09/02 职场文书
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby