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. HDLBits答案——Circuits

    1 Combinational Logic 1.1 Basic Gates 1.1.1 Exams/m2014 q4h module top_module ( input in, output out ...

  2. Mysql5.6.44版本安装及基本配置

    内容概要 存储数据的演变史 数据库软件应用史 MySQL简介 MySQL下载及安装 MySQL配置 存储数据的演变史 1.文本文件: 文件路径不固定,并且数据格式不统一 2.软件开发目录规范: 规定了 ...

  3. MybatisPlus多表连接查询一对多分页查询数据

    一.序言 在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案. 在多表连接查询中,既有查询单条记录的情况,又有列表查询,还有分页查询, ...

  4. 【SQL基础】【记住重命名】高级查询:聚合函数(四舍五入)、分组过滤、排序、

    〇.概述 1.功能概述 高级查询:聚合函数(四舍五入).分组过滤.排序. 2.建表语句 drop table if exists user_profile; CREATE TABLE `user_pr ...

  5. appium环境搭建(从入门到放弃)

    一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java.... 2.jdk 1)下载地址 官网(需登录账号): http ...

  6. Django批量插入(自定义分页器)

    目录 一:批量插入 1.常规批量插入数据(时间长,效率低 不建议使用) 2.使用orm提供的bulk_create方法批量插入数据(效率高 减少操作时间) 3.总结 二:自定义分页器 1.自定义分页器 ...

  7. Django 之swagger中尝试调试post请求时返回 "detail": "JSON parse error - Expecting value: line 1 column 1 (char)

    swagger已配置OK,但发送POST请求时一直显示数据格式错误,怪异.... 经过各种查找资料,才发现setting.py文件中缺少配置 配置完成后重启服务,再次尝试发送POST请求,不会再报格式 ...

  8. js属性对象的hasOwnProperty( )方法,检测一个属性是否是对象的自有属性

    hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键). 语法: obj.hasOwnProperty(prop) 参数: prop  ...

  9. [数据与分析可视化] D3入门教程2-在d3中构建形状

    d3.js入门教程2-在 d3.js中构建形状 文章目录 d3.js入门教程2-在 d3.js中构建形状 形状的添加 圆形的添加 矩形的添加 线段的添加 文本的添加 折线的添加 区域的添加 圆弧的添加 ...

  10. [OpenCV实战]49 对极几何与立体视觉初探

    本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...