Python标准库typing

https://docs.python.org/zh-cn/3/library/typing.html

简介

  • python3.5+才有

  • Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。

  • 作用

    • 类型检查,防止运行时出现参数和返回值类型不符合。(pycharm会自动联想类型)
    • 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
    • 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒
  • 最早接触是在leetcode做题的时候看到的,后面在各种源码中广泛有看到。

    • 比如LeetCode算法第一题:两数之和,的解题模板(python3)

      class Solution:
      def twoSum(self, nums: List[int], target: int) -> List[int]:
    • 比如Selenium中get方法的源码

      def get(self, url: str) -> None:
      """
      Loads a web page in the current browser session.
      """
      self.execute(Command.GET, {'url': url})

实例

变量定义

  • 示例代码

    name:str
    name = 'wuxianfeng'
    print(name.upper())
  • PEP8中有提及,在声明变量类型时,变量后方紧跟一个冒号,冒号后面跟一个空格,再跟上变量的类型。

  • 其实我们很少这么做就是了。更多是放在函数或者方法中

函数参数(基础类型)

  • 示例代码

    def greeting(name: str) -> str:
    return 'Hello ' + name
    • 声明name参数是str类型,格式是参数名冒号类型
    • 返回对象也是str类型,格式是->类型,注意是一个-
    • ->先写,再写冒号!
  • 语法

    参数名:类型
    
    def 函数名(参数...) -> 类型:
  • 一个好处就是用pycharm在输入代码的时候

    def func(name:str) ->None:
    print(name.) #输入到name.的时候能自动补齐出来str类型的方法,如果不声明绝对是没有的
  • str是默认类型,你发现跟typing模块好像并没任何关系,因为这是基础的模块,无需导入即可使用。类似的还有int,float,bool等

函数参数默认值

  • 示例代码:Faker类的初始化方法

        def __init__(
    self,
    locale: Optional[Union[str, Sequence[str], Dict[str, Union[int, float]]]] = None,
    providers: Optional[List[str]] = None,
    generator: Optional[Generator] = None,
    includes: Optional[List[str]] = None,
    use_weighting: bool = True,
    **config: Any,
    ) -> None:
  • 语法

    参数名:类型=默认值
    
    实例: use_weighting: bool = True
  • 跟以前相比就是加了冒号和类型

高级类型List和Tuple

  • 此处的中级类型指的是List和Tuple,Dict这些

  • 示例代码:文章开头提到的leetcode第一题,两数之和

    class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
    • 意思是nums这个参数是一个list,其中每个元素是int类型的
  • 注意,代码模板不会显示所有的细节,其实这是需要导入的

    from typing import Dict,  List,  Tuple
  • 实例代码1

    from typing import List
    def func(names:List[str]) -> None:
    for name in names: #如果你输入names.,会产生列表的方法
    print(name) #如果你输入name.,会产生字符串的方法 names = ['wuxianfeng','qianyuli']
    func(names)
    • 注意上述代码跟以下代码的区别

      def func1(*names):
      for name in names:
      print(name)
      classes = ['c1','c2']
      func1(*classes)
  • 实例代码2:多个相同类型可以用...来替代,但要注意是Tuple[]

    from typing import Tuple
    def func(ages: Tuple[int, ...]) -> None:
    for age in ages:
    print(age) ages = (18, 19, 22, 34,)
    func(ages)
    • 此处比较诡异的是如果我写

      from typing import Tuple
      def func(ages: Tuple[int,int]) -> None:
      for age in ages:
      print(age) ages = (18, 19, 22, 34,) #这里只能写2个值,多或者少都会警告!
      func(ages) #应为类型Tuple[int,int],实为类型Tuple[int,int,int,int]
    • 但是List却没有这个问题,后续有空查下

高级类型Dict

  • dict是key:value形式

  • 注意跟Tuple一样,都是[]的形式,不能是{}

  • 实例代码

    from typing import Dict
    
    def func(info: Dict[str, str]) -> None:
    for k, v in info.items():
    print(k)
    print(v) nanjings = {'wuxianfeng': 'male', 'qianyuli': 'female'}
    func(nanjings)

类型别名

  • 示例

    from typing import List
    
    Alias = List[int]  #这里可以是List或者list
    
    def scale(orgin_num: int, vector: Alias) -> Alias:
    return [orgin_num * vec for vec in vector] print(scale(2, [3,4,5]))

类型嵌套

  • 示例

    from typing import List
    
    def func(vars: List[List[int]]) -> None:
    for _ in vars:
    for __ in _:
    print(__) func([[1, 2], [2, 3]])

可选类型Optional

  • 示例代码

    from typing import Optional
    
    def func(arg: Optional[int] = None):
    print(arg) func()
    func(1)
  • 显然你去掉=None是不行的,func()的时候会提示错误

  • Optional[int] 等价于 Union[int, None]

小结

  • str、int、float、bool无需声明,直接用即可

  • List是list的泛型,其后紧跟一个方括号,里面代表了构成这个列表的元素类型。

    age:List[int]
    var: List[int or float] = [2, 3.5]
    vars: List[List[int]] = [[1, 2], [2, 3]]
  • Tuple、元组,是 tuple 的泛型,其后紧跟一个方括号,方括号中按照顺序声明了构成本元组的元素类型

    Tuple[X, Y] 代表了构成元组的第一个元素是 X 类型,第二个元素是 Y 类型
    person: Tuple[str, int, float] = ('Mike', 22, 1.75)
    • NamedTuple,是 collections.namedtuple 的泛型,实际上就和 namedtuple 用法完全一致
  • Dict、字典,是 dict 的泛型;Mapping,映射,是 collections.abc.Mapping 的泛型。根据官方文档,Dict 推荐用于注解返回类型,Mapping 推荐用于注解参数。它们的使用方法都是一样的,其后跟一个中括号,中括号内分别声明键名、键值的类型

    def size(rect: Mapping[str, int]) -> Dict[str, int]:
    return {'width': rect['width'] + 100, 'height': rect['width'] + 100}
    • MutableMapping 则是 Mapping 对象的子类,在很多库中也经常用 MutableMapping 来代替 Mapping
  • Set、集合,是 set 的泛型;AbstractSet、是 collections.abc.Set 的泛型。根据官方文档,Set 推荐用于注解返回类型,AbstractSet 用于注解参数。它们的使用方法都是一样的,其后跟一个中括号,里面声明集合中元素的类型

    def describe(s: AbstractSet[int]) -> Set[int]:
    return set(s)

Python标准库typing的更多相关文章

  1. Python标准库--typing

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...

  2. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  3. Python 标准库一览(Python进阶学习)

    转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...

  4. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  5. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  6. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

  7. python标准库xml.etree.ElementTree的bug

    使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...

  8. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  9. Python标准库

    Python标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉Python标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题都可以简单快捷地使用它们来解决. sys模块 ...

  10. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

随机推荐

  1. Oracle数据泵导入dmp文件,报ORA-39083、ORA-01917错误解决办法

    将10.16.23.111数据库服务器中的数据库名称为cwy_init1的数据导出,随后在10.16.23.112数据库服务器创建空库cwy_init2,将导出的cwy_init1数据文件(cwy_i ...

  2. 抓包整理————ip 协议一[十二]

    前言 简单介绍一下ip协议. 正文 先来看下ip协议在网络层的哪一层: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 ip 层就在网络层: 其实很好想象哈,就是因为每台机器起码有一个ip ...

  3. 修改api-server支持的NodePort端口映射范围

    创建svc资源报错显示:provided port is not in the valid range. The range of valid ports is 30000-32767 k8s集群默认 ...

  4. .NET刷算法

    BFS模板-宽度优先搜索(Breadth First Search) 1.模板 /// <summary> /// BFS遍历 /// </summary> /// <p ...

  5. variant conversion error for variable:v8

    oracle 添加表数据报错:variant conversion error for variable:v8. 是数据类型不匹配.

  6. Go1.20 新版覆盖率方案解读

    玩过Go覆盖率的同学当有所了解,Go的覆盖率方案最初的设计目标仅是针对单测场景,导致其局限性很大.而为了适配更多的场景,行业内各种博客.插件.黑科技介绍也层出不穷.当然,过去我们也开源过Go系统测试覆 ...

  7. 配置 DosBox

    配置 DosBox DosBox 在高分辨的屏幕上窗口很小. 修改分辨率 Win7 及以上配置文件位于{system drive}:\Users\{username}\AppData\Local\DO ...

  8. ubuntu1804搭建FTP服务器的方法

    搭建FTP服务器 FTP的工作原理: FTP:File Transfer Protocol ,文件传输协议.属于NAS存储的一种协议,基于CS结构. ftp采用的是双端口模式,分为命令端口和数据端口, ...

  9. web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作

    目录 纯手撸web框架 web框架的本质 手写web框架 存在的问题 基于wsgiref模块 基本介绍 推导流程 代码封装优化 总结 动静态网页 jinja2模块 前端.后端.数据库三者联动 推导流程 ...

  10. LeetCode HOT 100:下一个排列

    题目:31. 下一个排列 题目描述: 本题是给你一个整数数组,返回该数组的下一个线性顺序排列. 举个例子:给你一个[1, 2, 3]的数组,他的线性排列顺序从小到大依次为[1, 3, 2],[2, 1 ...