Python中的变量类型标注怎么用

其他教程   发布日期:2025年01月16日   浏览次数:192

这篇文章主要讲解了“Python中的变量类型标注怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的变量类型标注怎么用”吧!

一、概述

1、描述

变量类型注解是用来对变量和函数的参数返回值类型做注解,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。

但是,变量类型注解语法传入的类型表述能力有限,不能说明复杂的类型组成情况,因此引用了typing模块,来实现复杂的类型表达。

2、常用的数据类型

Type Description
int 整型 integer
float 浮点数字
bool 布尔(int 的子类)
str 字符 (unicode)
bytes 8 位字符
object 任意对象(公共基类)
List[str] 字符组成的列表
Tuple[int, int] 两个int对象的元组
Tuple[int, ...] 任意数量的 int 对象的元组
Dict[str, int] 键是 str 值是 int 的字典
Iterable[int] 包含 int 的可迭代对象
Sequence[bool] 布尔值序列(只读)
Mapping[str, int] 从 str 键到 int 值的映射(只读)
Any 具有任意类型的动态类型值
Union 联合类型
Optional 参数可以为空或已经声明的类型
Mapping 映射,是 collections.abc.Mapping 的泛型
MutableMapping Mapping 对象的子类,可变
Generator 生成器类型, Generator[YieldType、SendType、ReturnType]
NoReturn 函数没有返回结果
Set 集合 set 的泛型, 推荐用于注解返回类型
AbstractSet collections.abc.Set 的泛型,推荐用于注解参数
Sequence collections.abc.Sequence 的泛型,list、tuple 等的泛化类型
TypeVar 自定义兼容特定类型的变量
Generic 自定义泛型类型
NewType 声明一些具有特殊含义的类型
Callable 可调用类型, Callable[[参数类型], 返回类型]
NoReturn 没法返回值

3、mypy模块

mypy是Python的可选静态类型检查器

安装mypy模块 pip3 install mypy

使用mypy进行静态类型检查 mypy 执行 python 文件

二、使用

1、基本使用

  1. from typing import List, Set, Dict, Tuple
  2. #对于简单的 Python 内置类型,只需使用类型的名称
  3. x1: int = 1
  4. x2: float = 1.0
  5. x3: bool = True
  6. x4: str = "test"
  7. x5: bytes = b"test"
  8. # 对于 collections ,类型名称用大写字母表示,并且
  9. # collections 内类型的名称在方括号中
  10. x6: List[int] = [1]
  11. x7: Set[int] = {6, 7}
  12. #对于映射,需要键和值的类型
  13. x8: Dict[str, float] = {'field': 2.0}
  14. #对于固定大小的元祖,指定所有元素的类型
  15. x9: Tuple[int, str, float] = (3, "yes", 7.5)
  16. #对于可变大小的元祖,使用一种类型和省略号
  17. x10: Tuple[int, ...] = (1, 2, 3)
  18. '''在终端执行检查
  19. (venv) D:python>mypy . 1.py
  20. Success: no issues found in 1 source file
  21. '''

2、函数参数返回值添加类型标注

1. 指定多个参数的方式

  1. '''
  2. 定义一个函数 参数 num int类型
  3. 返回值 字符串类型
  4. 使用mypy检测
  5. '''
  6. def num_fun(num: int) -> str:
  7. return str(num)
  8. num_fun(100)
  9. print(num_fun(100))
  10. # 指定多个参数的方式
  11. def plus(num1: int, num2: int) -> int:
  12. return num1 + num2
  13. # 在类型注释后为参数添加默认值,默认值需要添加在末尾
  14. '''
  15. 声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。
  16. 这是因为 Python 解释器需要确定参数传递的顺序,
  17. 如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个
  18. '''
  19. def func1(num1: int, my_float: float = 3.5)-> float:
  20. return num1 + my_float
  21. print(func1(10,20))
  22. f = func1
  23. print(f(10))

2. Callable

Callable 是一个抽象类,用于描述可调用对象的基本行为,例如函数、方法和类。当你声明一个函数变量并将其分配给一个变量时,这个变量只是一个普通的 Python 对象,并不是一个可调用对象,因此它没有默认值

带有默认值的参数可以放在任何位置,但是在声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。这是因为 Python 解释器需要确定参数传递的顺序,如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个。

  1. from typing import Callable
  2. #定义变量 指向一个函数
  3. def func2(num1:int, my_float=3.5) -> str:
  4. return f'返回结果{num1 + my_float}'
  5. print(func2(10))
  6. #Callable指向可调用(函数)值的方式
  7. x: Callable[[int, float], str] = func2
  8. print(x(10, 3.5))
  9. '''
  10. 执行结果
  11. 返回结果13.5
  12. 返回结果13.5
  13. '''

3. Iterator

  1. #定义函数,产生整数的生成器,每次返回一个
  2. from typing import Iterator
  3. # 产生整数的生成器函数安全地返回只是一个 整数迭代器的函数
  4. #,因此这就是我们对其进行注释的方式
  5. def g(n: int) -> Iterator[int]:
  6. i = 0
  7. while i < n:
  8. yield i #下次迭代时,代码从 yield 的下一条语句(不是下一行)开始执行
  9. i += 1
  10. print(g(10))
  11. for i in g(10):
  12. print(i)
  13. '''执行结果
  14. <generator object g at 0x00000000014E88E0>
  15. 0
  16. 1
  17. 2
  18. 3
  19. 4
  20. 5
  21. 6
  22. 7
  23. 8
  24. 9
  25. '''

3、混合类型检查改进

1.联合运算符

联合运算符使用 " | " 线来替代了旧版本中Union[] 方法,使得程序更简洁

  1. #新版本
  2. def get_name(user: str | dict) -> str:
  3. if isinstance(user, str):
  4. return user
  5. elif isinstance(user, dict):
  6. return user.get('name', '')
  7. print(get_name({'name':'Bob'}))
  8. print(get_name("Alice"))

在这个例子中,函数get_name接受一个参数user,它可以是一个字符串或一个字典。如果user是一个字符串,函数会直接返回这个字符串;如果user是一个字典,函数会尝试从字典中获取name字段的值,并返回它。

在这个例子中,我们使用联合运算符将str和dict类型组合起来,表示user可以是这两种类型之一。

  1. #旧版本,Union方法来实现相同的功能
  2. from typing import Union
  3. def get_name2(user: Union[str, dict]) -> str:
  4. if isinstance(user, str):
  5. return user
  6. elif isinstance(user, dict):
  7. return user.get('name', '')
  8. print(get_name2({'name':'Bob'}))
  9. print(get_name2("Alice"))
  10. '''执行结果
  11. Bob
  12. Alice
  13. '''

4、类型别名更改

  1. #旧版本
  2. oldname = str
  3. def oldFunc(param:oldname) -> oldname:
  4. return param + param
  5. oldFunc('oldFunc:花非人陌')
  6. #新版本,从3.10后开始支持
  7. from typing import TypeAlias
  8. newstr :TypeAlias = str #定义类型别名
  9. newint :TypeAlias = int
  10. def func_test(num:newint, msg:newstr)->newstr:
  11. return str(num) + msg
  12. print(func_test(100,"类型名称更改"))

以上就是Python中的变量类型标注怎么用的详细内容,更多关于Python中的变量类型标注怎么用的资料请关注九品源码其它相关文章!