前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - typing 模块 —— 常用类型提示

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

作者头像
小菠萝测试笔记
发布2021-08-23 15:06:52
8010
发布2021-08-23 15:06:52
举报
文章被收录于专栏:自动化、性能测试

前言

typing 是在 python 3.5 才有的模块

前置学习

Python 类型提示:https://cloud.tencent.com/developer/article/1864619

常用类型提示

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

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

常用类型提示栗子

指定函数参数类型

单个参数
代码语言:javascript
复制
# name 参数类型为 str
def greeting(name: str) :
    return "hello"
多个参数
代码语言:javascript
复制
# 多个参数,参数类型均不同
def add(a: int, string: str, f: float, b: bool or str):
    print(a, string, f, b)

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

指定函数返回的参数类型

简单栗子
代码语言:javascript
复制
# 函数返回值指定为字符串
def greeting(name: str) -> str:
    return "hello"
复杂一点的栗子
代码语言:javascript
复制
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 的源码

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

Tuple 的源码

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

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

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

代码语言:javascript
复制
def test(a: list, b: dict, c: set, d: tuple):
    print(a, b, c, d)

ListT、SetT 只能传一个类型,传多个会报错

代码语言:javascript
复制
a: List[int, str] = [1, "2"]
b: Set[int, str] = {1, 2, 3}

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

代码语言:javascript
复制
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 个

那 TupleT 传多个会报错吗?

代码语言:javascript
复制
d: Tuple[int, str] = (1, "2")
print(d)


# 输出结果
(1, '2')

是不会报错的

再来看看 TupleT 的多种写法

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

如果 TupleT 指定类型数量和赋值的元素数量不一致呢?

代码语言:javascript
复制
d: Tuple[int, str] = (1, "2", "2") 

不会报错,但是也会有 warning

综上两个栗子,得出结论

TupleT 指定一个类型的时候,仅针对同一个索引下的元素类型

如果想像 ListT 一样,指定一个类型,可以对所有元素生效呢
代码语言:javascript
复制
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://cloud.tencent.com/developer/article/1866297

TypeVar 泛型

https://cloud.tencent.com/developer/article/1866293

Any Type

https://cloud.tencent.com/developer/article/1866294

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 前置学习
    • 常用类型提示
    • 常用类型提示栗子
      • 指定函数参数类型
        • 单个参数
        • 多个参数
      • 指定函数返回的参数类型
        • 简单栗子
        • 复杂一点的栗子
      • List、Set、Dict 的源码
        • Tuple 的源码
          • ListT、SetT 只能传一个类型,传多个会报错
            • 那 TupleT 传多个会报错吗?
              • 再来看看 TupleT 的多种写法
              • 综上两个栗子,得出结论
              • 如果想像 ListT 一样,指定一个类型,可以对所有元素生效呢
          • 类型别名
          • NewType
          • Callable
          • TypeVar 泛型
          • Any Type
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档