机器学习越来越火,大量的机器学习包都支持Python,导致了Python近几年非常火爆,入手门槛低,编程简单,概念非常少。越来越多的新手小白加入到Python编程。

Python虽然简单,但也带来很多问题。尤其是弱类型一直被诟病,平时在写代码时,经常也会模糊参数的类型,导致debug难度增加。

自从Python3.5以来,发布了typing包,推荐标注类型,并且IDE会检查类型,让Python看起来有点静态语言的感觉了。本文主要参考Python3.7.5的

常用的类型

常用的几种类型,如int, float, str, List, Tuple, Dict。接下来看几个例子: 首先必须从typing中导入类型

from typing import List, Dict, Tuple

def greeting(name: str) -> str:

return 'Hello ' + name

print(greeting(188))

如果你输入的参数不是str,IDE就会提示。

如果传入List, Tuple, Dict,需要用[]来指定内部基础类型.

def do_nothing(a: List[int], b: Tuple[int, str], c: Dict[str, int]) -> Dict[str, str]:

return {'key': 'value'}

# 调用

do_nothing([19], (14, 'some'), {"ha": 10})

除此之外基础类型是可以相互嵌套的,比如字典的值是列表,列表中存放元组,于是可以这样标注:

def do_nothing(a: Dict[str, List[Tuple[int, int, int]]], ):

pass

比较复杂的类型标注用起来并不是很方便,我们可以根据业务指定别名。比如计算一个点与多个点的距离,List中存放的Tuple是点Point,坐标就是三维的浮点数,于是可以定义别名

Point = Tuple[float, float, float]

def compute_distance(p1: Point, points: List[Point]):

pass

多种类型

不是多个参数,而是多类型,是输入参数可能存在多种类型,这种情况在Java中多态来解决。而Python本身是弱类型,输入参数没有强制规定,这个时候该怎么办?比如传入参数可能为int, str, float.typing包给我们提供了办法,可以用Union来定义:

Union[int, str, float]

输入参数必须是必须是int, str, float.其中之一。如果不确定数据的类型,可以标示为Any类型,表示任意类型。如果输入参数可能是None值,也可以用Union定义:

Union[str, None]

# 或者

Optional[str]

函数作为输入参数

如果函数作为输入参数,如何标记类型呢?其实也不复杂,函数是callable的类型,同样指定传入和传出参数即可。我们来看一个求和的函数,第一个参数就是函数。add_all只是把所有的元素相加,至于对每个元素做什么操作,取决于传入的函数了。

def add_all(f: Callable[[int], int], params: List[int]):

return sum(map(f, params))

print(add_all(lambda x: x**2, list(range(1, 10))))

这里要注意的是函数作为参数,有输入和输出值。定义较为麻烦,func: Callable[[int], int],输入参数内部嵌套了中括号,仔细想想也能明白,如果func: Callable[int, int]定义,那么输入参数和输出参数该怎么理解呢?想明白了,你就理解了。

返回生成器

生成器在Python是非常常用的,可以很大提高程序的运行效率。如果需要返回生成器对象该怎么做呢?从typing包中导入Generator.我们来看一下例子,输入列表list,需要每次返回num个数据块。

from typing import List, Generator

import math

def get_data(l: List[int], num: int) -> Generator:

"""

输入list, 每次按照num个数 返回数据块

:param l: list data

:param num: batch size

"""

epochs = math.ceil(len(l) / num)

for epoch in range(epochs):

yield l[epoch * num:(epoch + 1) * num]

for each in get_data(list(range(98)), 5):

print(each)

小结

本文分别列举了常用参数的类型标注方法,同时也给出了多种参数类型,以及函数和生成器作为参数输入的类型标注方法。参数的类型标注是很重要的,一方面可以帮助你理解每个参数的类型,另一方面也增强了代码的可读性。尤其是别人读到你的代码,调用起来会清晰很多。更多详细的说明可以查看官方文档或者源码。

觉得文章还不错,可以关注我的微信公众号:数学编程。

python标注审核_Python类型标注相关推荐

  1. python 学习指南_Python类型检查终极指南

    python 学习指南 In this guide, you will get a look into Python type checking. Traditionally, types have ...

  2. python 显著性差异_python matplotlib 标注 统计差异 显著性 *

    画柱状图时会遇到添加显著性标记的问题,因为matplotlib没有自带的接口,所以只好自己画了一个 主要思路是用plot画标注框线,用annotate标注. 具体应用的时候需要根据柱状图的位置,调整x ...

  3. python怎么做类型标注

    文章目录 1. 为变量做类型标注 1.1 简单的数据类型 1.2 使用 Optional 1.3 使用Union 1.4 为容器类型做标注 1.4.1 为集合做标注 1.4.2 为列表做标注 1.4. ...

  4. Python 添加类型标注 | 散发着自由松散气息的代码

    Python 添加类型标注 | 散发着自由松散气息的代码 Python 如此简洁,书写者在声明变量时甚至无需考虑类型. 但是简洁与复杂间,是存在一个平衡点的.当我们书写较为复杂的项目时,还是希望可以拥 ...

  5. python 类型标注-typing --- 类型标注支持 — Python 3.7.9 文档

    类,函数和修饰器.¶ 这个模块定义了如下的类,模块和修饰器. classtyping.TypeVar¶ 类型变量 用法: T = TypeVar("T") # Can be any ...

  6. python 检查代码规范,类型标注

    python提供了一些包可以用来format代码,检查代码规范,检查类型标注是否正确等. 1.black format代码,cd 到对应的目录,执行 black -l 120 . 2.flake8 检 ...

  7. python数据标注工具_python实现简单图片物体标注工具

    本文实例为大家分享了python实现简单图片物体标注工具的具体代码,供大家参考,具体内容如下 # coding: utf-8 """ 物体检测标注小工具 基本思路: 对要 ...

  8. python实现labelme样本自动标注

    python实现labelme样本自动标注 前言 说明 正文 一. json文件简介及相关API: 二. 特征区域检测及相应API 三. 计算偏移量以及标注框的新的点集 四. json文件数据其他修改 ...

  9. python mypy类型检查_Python 类型检查指南

    Python 作为一种动态语言,在 PEP484(3.5) 才支持 Type Hints,且类型申明是 optional 的,对于从静态语言(比如:Java,国内大学专业cs or se的教学语言也是 ...

最新文章

  1. python 3.10 新增 switch-case 简介
  2. Java:网络编程之UDP的使用
  3. 前端入门--解决问题的一些方法
  4. linux的apche支持PHP,Linux下apache支持PHP配置
  5. 牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案
  6. 全连接网络和卷积网络实践
  7. 关于大型网站技术演进的思考(八)--存储的瓶颈终篇(8)
  8. HTML+CSS---定位(相对定位--绝对定位--固定定位--设置元素的层叠顺序)---表单---设置光标样式---透明度(opacity属性定义元素的不透明度--IE的半透明滤镜)---外边线
  9. [USACO13FEB]Perimeter【DFS / 深搜】
  10. ijkplayer android端jni层调试
  11. linux蓝牙主从机模式代码,技术贴 丨 Android 蓝牙BLE开发Docker入门与WMS2.0实例
  12. 后缀为 axd 与 ashx 的文件有什么区别
  13. 34个非常实用的JS一行代码
  14. GeoServer中的WPS服务
  15. f开头的流媒体软件_流媒体直播工具(Streamon)
  16. Window 10 激活 命令行操作
  17. python字符串常用操作方法(二)
  18. 深入理解计算机系统-第七章(链接)笔记
  19. 读《怪诞行为学》有感
  20. android滴滴技术架构,滴滴乘客端Android架构解密_何斌斌.pdf

热门文章

  1. 帮帮忙—ssm框架中,简单自定义标签SimpleTagSupport如何注入spirng中的bean
  2. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  3. mysql 查询商品列表 显示tag_让前台页面商品列表显示后台数据库中的商品
  4. centos7重新加载服务的命令_CentOS7 从查看、启动、停止服务说起systemctl
  5. 战地2服务器怎么虚拟人数,战地2怎么修改作战人数?
  6. python图像文件压缩_python实现图片压缩代码实例
  7. ES6 深拷贝_你别自以为是:ES6误区 之 Object.assign()、const
  8. MySQL 基础 ———— 分组查询
  9. Linux——less指令常用操作
  10. altium导出钻孔文件_[Altium Designer 学习]怎样输出Gerber文件和钻孔文件