时间:2021-05-23
Python是一种动态类型化的语言,不会强制使用类型提示,但为了更明确形参类型,自python3.5开始,PEP484为python引入了类型注解(type hints)
示例如下:
函数test,a:int 指定了输入参数a为int类型,b:str b为str类型,-> str 返回值为srt类型。可以看到,在方法中,我们最终返回了一个int,此时pycharm就会有警告;
当调用这个方法时,参数a 输入的是字符串,此时也会有警告;
but…,pycharm这玩意儿 只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言。
指定列表
from typing import ListVector = List[float]def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector]# type checks; a list of floats qualifies as a Vector.new_vector = scale(2.0, [1.0, -4.2, 5.4])print(new_vector)指定 字典、元组 类型
from typing import Dict, Tuple, SequenceConnectionOptions = Dict[str, str]Address = Tuple[str, int]Server = Tuple[Address, ConnectionOptions]def broadcast_message(message: str, servers: Sequence[Server]) -> None: print(message) print(servers)# The static type checker will treat the previous type signature as# being exactly equivalent to this one.if __name__ == '__main__': broadcast_message('OK', [(('127.0.0.1', 8080), {"method": "GET"})])这里需要注意,元组这个类型是比较特殊的,因为它是不可变的。
所以,当我们指定Tuple[str, str]时,就只能传入长度为2,并且元组中的所有元素都是str类型
对于常量或者变量添加注释
from typing import NamedTupleclass Employee(NamedTuple): name: str id: int = 3employee = Employee('Guido')# assert employee.id == 3 # 当类型一致时,不会输出内容,反之报错assert employee.id == '3' # 当类型一致时,不会输出内容,反之报错# AssertionError指定一个变量odd,显式的声明了它应该是整数列表。如果使用mypy来执行这个脚本,将不会收到任何提示输出,因为已经正确地传递了期望的参数去执行所有操作。
from typing import Listdef odd_numbers(numbers: List) -> List: odd: List[int] = [] for number in numbers: if number % 2: odd.append(number) return oddif __name__ == '__main__': numbers = list(range(10)) print(odd_numbers(numbers))mypy 安装
pip install mypy执行 mypy file,正常情况下不会报错
C:\Users\Sunny_Future\AppData\Roaming\Python\Python36\Scripts\mypy.exe tests.py
# 指定 环境变量或者 linux 下可以直接执行 mypy
# mypy tests.py
Success: no issues found in 1 source file
接下来,尝试更改一下代码,试图去添加整形之外的其他类型内容!那么执行则会检查报错
from typing import Listdef odd_numbers(numbers: List) -> List: odd: List[int] = [] for number in numbers: if number % 2: odd.append(number) odd.append('foo') return oddif __name__ == '__main__': numbers = list(range(10)) print(odd_numbers(numbers))代码中添加一个行新代码,将一个字符串foo附加到整数列表中。现在,如果我们针对这个版本的代码来运行mypy
C:\Users\Sunny_Future\AppData\Roaming\Python\Python36\Scripts\mypy.exe tests.pytests.py:114: error: Argument 1 to “append” of “list” has incompatible type “str”; expected “int”
Found 1 error in 1 file (checked 1 source file)
在Python 3.5中,你需要做变量声明,但是必须将声明放在注释中:
# Python 3.6odd: List[int] = []# Python 3.5odd = [] # type: List[int]如果使用Python 3.5的变量注释语法,mypy仍将正确标记该错误。你必须在 #井号之后指定type:。如果你删除它,那么它就不再是变量注释了。基本上PEP 526增加的所有内容都为了使语言更加统一。
虽然指定了 List[int] 即由 int 组成的列表,但是,实际中,只要这个列表中存在 int(其他的可以为任何类型),pycharm就不会出现警告,使用 mypy 才能检测出警告!
from typing import Listdef test(b: List[int]) -> str: print(b) return 'test'if __name__ == '__main__': test([1, 'a'])pycharm 并没有检测出类型错误,没有告警
mypy
工具 检测到 类型异常,并进行了报错
到此这篇关于详解python3类型注释annotations实用案例的文章就介绍到这了,更多相关python3类型注释annotations内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Python3注释确保对模块,函数,方法和行内注释使用正确的风格Python中的注释有单行注释和多行注释:Python中单行注释以#开头,例如::#这是一个注释
详解PythonMD5加密Python3下MD5加密#由于MD5模块在python3中被移除#在python3中使用hashlib模块进行md5操作import
几乎所有的Python2程序都需要一些修改才能正常地运行在Python3的环境下。为了简化这个转换过程,Python3自带了一个叫做2to3的实用脚本(Util
本文分析了python3新特性函数注释FunctionAnnotations用法。分享给大家供大家参考,具体如下:Python3.X新增加了一个特性(Featu
最近写了一些python3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一。以前在写python