python 类型注解 list_Python 类型注解

说明

Python 教程正在编写中,欢迎大家加微信 sinbam 提供意见、建议、纠错、催更。

简单说,Python 类型注解功能可以让我们的代码更加易读,从而达到编写更加健壮的代码目标。类型注解又叫类型暗示,将函数、变量声明为一种特定类型。当然,它并不是严格的类型绑定,所以这个机制并不能阻止调用者传入不应该传入的参数。

背景

由于 Python 是一个动态语言,定义和使用变量时不需要申明变量的数据类型即可使用,但这样也会带来一定的问题,如阅读代码时不知道数据是什么类型,调用时不小心会传入错误的数据类型。因此,Python 的类型注解功能就显得比较重要了。

一个字符和数字类型是无法相加的,否则会报以下错误:

a = 1

b = '2'

a + b

# TypeError: unsupported operand type(s) for +: 'int' and 'str'

调用者在使用函数时如果没有完善的文档,不知道要传入的数据类型分别是什么,同时文档也很难表达复杂的数据类型。有了类型注解可以让 IDE 知道了数据类型后,更加准确地进行自动补全。有了类型注解可以提供给第三方工具,做代码分析,发现隐形bug。函数注解的信息,保存在 __annotations__ 属性中可以来调用。

在 Python 3.5 中,Python PEP 484 引入了类型注解(type hints),在 Python 3.6 中,PEP 526 又进一步引入了变量注解(Variable Annotations)。

基本方法

以下是一个使用示例:

# 定义一个变量

x: int = 2

x + 1

# 3

# 定义一个除法函数

def div(a: int, b: int) -> float:

return a/b

# 查看类型注解信息

div.__annotations__

{'a': int, 'b': int, 'return': float}

语法注意的点:

变量类型:在变量名后加一个冒号,冒号后写变量的数据类型,如 int、dict 等

函数返回类型:方法参数中如变量类型,在参数括号后加一个箭头,箭头后返回值的类型

格式要求(PEP 8,非强制):变量名和冒号无空格,冒号和后边类型间加一个空格,箭头左右均有一个空格

提示性

但值得注意的是,这种类型和变量注解实际上只是一种类型提示,对运行实际上是没有影响的。

def add(a: int, b: int) -> str:

return a + b

# 查看返回类型

type(add(1, 2))

# int

比如上例,调用 add 方法的时候,我们注解返回一个字符串,但它返回的仍然是 int,也不会报错,也不会对参数进行类型转换。

不过有了类型注解,一些 IDE 是可以识别出来并提示的,比如 PyCharm 就可以识别出来在调用某个方法的时候参数类型不一致,会提示 WARNING。如类似以下字典嵌套列表类型的提示:

'''

Expected type 'Mapping[str, str]',

got 'Dict[str, Union[List[str], List[Union[bool, str]]]]' instead

'''

类型定义方法

以下几种类型的定义方法:

None

内置的类(int, str,float)

标准库(typing 模块)

第三方扩展库

抽象出的基类

用户定义的类

类别名 type aliases(s = str,然后用 s)

使用 NewType

使用 own generic types

更多见 typing 中的构建方法。

复杂结构

对于一些结构的数据类型就不能用上述简单的方法表示了,比如:

names: list = ['lily', 'tom']

version: tuple = (6, 6, 6)

operations: dict = {'sad': False, 'happy': True}

以上虽然定义了最外层的数据结构,如列表、元组、字典,但他们每个元素的类型是什么也没有定义清楚,因此需要在 typing 库的帮助下来定义准确内部的结构:

from typing import List, Tuple, Dict

names: List[str] = ['lily', 'tom']

version: Tuple[int, int, int] = (6, 6, 6)

operations: Dict[str, bool] = {'sad': False, 'happy': True}

再如:

from typing import Union, List, Tuple, Dict

config: Dict[str, Union[List[str], Tuple[bool, str]]]= {

'width': ['100%', 'Width of img'],

'height': ['auto', 'Height of img'],

'fluid': (True, '外层包含一个div')

}

config 变量存在着复杂的嵌套结构,以上注解就声明了它的结构,方便调用者来使用。

typing 库是 Python 内置的类型标注标准库,用它可以来解决这些问题,它可以实现复杂的类型注解工作,可以查看 typing 教程。

lambda 的类型标注

由于类型注解的语法和 lambda 的语法冲突,因此不能直接对 lambda 做类型注解,但我们可以将 lambda 传给一个变量,通过对这个变量做 lambda,达到相同的目的。以下对 lambda 的几个例子:

from typing import Callable

# is_even 传入 int 返回布尔

is_even: Callable[[int], bool] = lambda x: (x % 2 == 0)

# func 传入两个字符串,返回 int

func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)

强制类型检测

inspect 模块是 Python 内置的类型检查标准库,它提供了一些有用的函数帮助获取对象的信息,例如模块、类、方法、函数、回溯、帧对象以及代码对象。例如它可以帮助你检查类的内容,获取某个方法的源代码,取得并格式化某个函数的参数列表,或者获取你需要显示的回溯的详细信息。

查看 inspect 教程(todo)。

可以通过 mypy 库来检验最终代码是否符合注解:

#安装 mypy

pip install mypy

# 执行代码

mypy test.py

如果不符合标注的类型要求会报错。

参考

https://www.python.org/dev/peps/pep-3107/

https://www.python.org/dev/peps/pep-0484/

https://www.python.org/dev/peps/pep-0526/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中介绍了Python中的关键字参数(keyword argument),它允许将任意个含参数名的参数导入到函数中,并在函数内部自动组装为一个字典。通过使用双星号(**)来实现。例如,在函数中定义了一个person函数,通过关键字参数传入name和age,然后在函数内部可以通过字典的方式访问这些参数的值。\[1\] 引用\[3\]中的代码展示了一个装饰器函数check,它用于验证函数的参数类型是否符合声明。在check函数内部,通过使用inspect模块的signature函数获取函数的参数信息,然后遍历实参和形参进行类型对比,如果不符合则抛出异常。这样可以确保函数的参数类型正确。\[3\] 综上所述,Python中可以通过关键字参数来传递任意个含参数名的参数,并在函数内部自动组装为字典。同时,可以使用装饰器函数来验证函数的参数类型是否符合声明。这些功能可以提高代码的可读性和可维护性。 #### 引用[.reference_title] - *1* *2* [Python函数的参数类型](https://blog.csdn.net/u010698107/article/details/118280135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python学习之 ---python参数类型注解](https://blog.csdn.net/qq_40498551/article/details/89480357)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值