Python - typing 模块 —— 常用类型提示

简介: Python - typing 模块 —— 常用类型提示

前言


typing 是在 python 3.5 才有的模块

 

前置学习

Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html

 

常用类型提示


  • int,long,float: 整型,长整形,浮点型;
  • bool,str: 布尔型,字符串类型;
  • List, Tuple, Dict, Set:列表,元组,字典, 集合;
  • Iterable,Iterator:可迭代类型,迭代器类型;
  • Generator:生成器类型;

前两行小写的不需要 import,后面三行都需要通过 typing 模块 import 哦

 

常用类型提示栗子


指定函数参数类型

单个参数

# name 参数类型为 str

def greeting(name: str) :

   return"hello"

 

多个参数

# 多个参数,参数类型均不同

def add(a: int, string: str, f: float, b: bool or str):

   print(a, string, f, b)

bool or str:代表参数 b 可以是布尔类型,也可以是字符串

 

指定函数返回的参数类型

简单栗子

# 函数返回值指定为字符串

def greeting(name: str) -> str:

   return"hello"

 

复杂一点的栗子

from typing import Tuple, List, Dict
# 返回一个 Tuple 类型的数据,第一个元素是 List,第二个元素是 Tuple,第三个元素是 Dict,第四个元素可以是字符串或布尔
def add(a: int, string: str, f: float, b: bool or str) -> Tuple[List, Tuple, Dict, str or bool]:
    list1 = list(range(a))
    tup = (string, string, string)
    d = {"a": f}
    bl = b
    return list1, tup, d, bl
# 不 warn 的调用写法
print(add(1, "2", 123, True))
# 输出结果
([0], ('2', '2', '2'), {'a': 123}, True)


List、Set、Dict 的源码

image.png

能大概猜到,它们底层跟 list、set、dict 有关系

 

Tuple 的源码

image.png

跟其他三个不太一样,但也是跟 tuple 有关系

 

那指定类型的时候用 list、set、dict、tuple 可不可以呢?

可以是可以,但是不能指定里面元素数据类型

def test(a: list, b: dict, c: set, d: tuple):

   print(a, b, c, d)

 

List[T]、Set[T] 只能传一个类型,传多个会报错

image.png

a: List[int, str] = [1, "2"]

b: Set[int, str] = {1, 2, 3}

 

IDE 不会报错,但运行时会报错

Traceback (most recent call last):
  File "/Users/polo/Documents/pylearn/第二章:基础/13_typing.py", line 36, in <module>
    a: List[int, str] = [1, "2"]
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 261, in inner
    return func(*args, **kwds)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 683, in __getitem__
    _check_generic(self, params)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/typing.py", line 215, in _check_generic
    raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
TypeError: Too many parameters for typing.List; actual 2, expected 1


大致意思就是:List 传了太多参数,期望 1 个,实际 2 个

 

那 Tuple[T] 传多个会报错吗?

d: Tuple[int, str] = (1, "2")

print(d)



# 输出结果

(1, '2')

是不会报错的

 

再来看看 Tuple[T] 的多种写法

image.png

只写一个 int,赋值两个 int 元素会报 warning

 

如果 Tuple[T] 指定类型数量和赋值的元素数量不一致呢?

d: Tuple[int, str] = (1, "2", "2")

image.png

不会报错,但是也会有 warning

 

综上两个栗子,得出结论

Tuple[T] 指定一个类型的时候,仅针对同一个索引下的元素类型

 

如果想像 List[T] 一样,指定一个类型,可以对所有元素生效呢

d: Tuple[int, ...] = (1, 2, 3)

d: Tuple[Dict[str, str], ...] = ({"name": "poloyy"}, {"age": "33"})

指定一个类型后,在后面加个 ... 就行

 

类型别名


https://www.cnblogs.com/poloyy/p/15153883.html

 

NewType


https://www.cnblogs.com/poloyy/p/15153886.html

 

Callable


https://www.cnblogs.com/poloyy/p/15154008.html

 

TypeVar 泛型


https://www.cnblogs.com/poloyy/p/15154196.html

 

Any Type


https://www.cnblogs.com/poloyy/p/15158613.html

 

Union


https://www.cnblogs.com/poloyy/p/15170066.html

 

Optional


https://www.cnblogs.com/poloyy/p/15170297.html

相关文章
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
59 4
|
22天前
|
Python
Python Internet 模块
Python Internet 模块。
119 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
123 63
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
1天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
13 3
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
27天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
66 8
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。