Python-typing: 类型标注与支持 Any类型详解
作者:G____G 发布时间:2023-10-15 19:40:43
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) 取代。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/G____G/article/details/97489848


猜你喜欢
- 一、参数的定义1、函数的参数在哪里定义在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间
- Hedger Wang 在国内 blog 上得到的方法:使用 try … finally 结构来使对象最终为 null ,以阻止内存泄露。其
- pycharm对数据库的查询等操作(非多步操作)import pymysqlimport pandas as pdconnect = pym
- 群里有人提出这么一个需求:每天都会传过来一份 Word 文档,里面有多个 Excel 附件,需要把 Excel 内容读取出来。第一反应是使用
- 一、提出问题利用SQL,从右到左查找某一字符串中匹配的查询串的第一个索引位置。比如有一字段ProductName值格式如下:短袖印花T恤 M
- 本文实例讲述了PHP使用观察者模式处理异常信息的方法。分享给大家供大家参考,具体如下:异常信息的捕获对编程测试有着重要的意义,这里结合观察者
- 一、安装配置PHP1、下载Php的版本zip包之后,解压缩到指定目录。下载地址:http://www.php.net/downl
- 在画一些曲线图(linecharts)时,常常会出现多条曲线同时画在一张图上面,这时候就需要对不同的曲线进行不同的标注,以使读者能够清晰地知
- 解决办法:1.Goland--->Preferences...--->Go--->GOPATH--->Project
- 我就废话不多说了,大家还是直接看代码吧~func main() { var a chan string a =mak
- 使用timer来统计asp页面程序的运行时间。实例代码和说明见下:<%Dim varInitial_TimevarIniti
- 有时候在我们使用Django设计了models中的数据库结构,并且已经同步了数据库之后,我们突然想在数据表中更新或者增加新的字段,也就是需要
- 池化层定义在tensorflow/python/layers/pooling.py.有最大值池化和均值池化。1、tf.layers.max_
- 使用opencv对图像进行编码,一方面是图像二进制传输的需要,另一方面对图像压缩。以jpeg压缩为例:1、转为二进制编码img = cv2.
- 学习前言一起来看看Efficientdet的keras实现吧,顺便训练一下自己的数据。什么是Efficientdet目标检测算法最近,谷歌大
- 好了,下面我们看看如何在服务器上生成.m3u文件并下传到客户端的:<%dim choose,path,mydb,myset,
- Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序。Go 语言内置了 goroutine 机制,使用goroutine可以快速
- 问题1:如果日期中有千年以前的情况(没法用格式化函数),如('2010-11-23','1989-3-7',
- 函数初解function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中实现代码的重复利用函数定义语法:关键点:fun
- 四年前写的一个内容管理系统,应用在公司内部网上,昨天DBA说其中的SQL语句未使用参数化的调用,导致服务器负担加重,资源占用大。并列出了几个