Python ellipsis 的用法详解


Posted in Python onNovember 20, 2020

背景

在 Python 的基本类型中单例模式的值有三个 None 类型的 None ,NotImplemented 类型的 NotImplemented, Ellipsis 类型的 ... 。

None 已经用的烂大街了,NotImplemented 也比较常用,唯独 ... 在江湖上只知它是三巨头之一,但不知其用法。

Ellipsis

Ellipsis 在 python 中代表“省略”,用现在的流形语来表达就是“老铁,不要在意这些细节!”。哪什么时候要告诉别人不要在意这些细节呢?其中的一个场景就是随机值。

用于文档测试

假设我们编写了一个类,要想知道这个有没有语法层面的错误,只要简单的调用一下就能测试出来。为了把这个测试自动化,于是做成了文档测试。

#!/usr/bin/evn python3

class Person(object):
  """人类类型
  Parameters:
  ----------
    name: str
    age: int

  Return:
  ------

  >>> Person()
  <main.Person object at 0x7ff36c1ca250>
  """

  name = ''
  age = 0

  def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
    """初始化
    """
    self.name = name
    self.age = age

  def say_hello(self) -> str:
    """返回打招呼信息
    """
    return f"Hello My name is {self.name} ."

当我们运行测试用例时会报错,原因是每次创建的对象,它的内存地址并不等于测试用例中指定的哪个,而我们的用例上写死了。诚然这个问题用 unittest 可以解决,但是这个不是这里要讲的。

python3 -m doctest main.py -v
Trying:
  Person()
Expecting:
  <main.Person object at 0x7ff36c1ca250>
**********************************************************************
File "/private/tmp/main.py", line 12, in main.Person
Failed example:
  Person()
Expected:
  <main.Person object at 0x7ff36c1ca250>
Got:
  <main.Person object at 0x7fe4e078ac70>
3 items had no tests:
  main
  main.Person.__init__
  main.Person.say_hello
**********************************************************************
1 items had failures:
  1 of  1 in main.Person
1 tests in 4 items.
0 passed and 1 failed.
***Test Failed*** 1 failures.

哪如何才能告诉 doctest 这位老铁不要在意返回值细节呢?答案是加上 Ellipsis 这个指令,改造后的代码如下。

#!/usr/bin/evn python3


class Person(object):
  """人类类型
  Parameters:
  ----------
    name: str
    age: int

  Return:
  ------

  >>> Person() #doctest: +ELLIPSIS
  <main.Person object at 0x...>
  """

  name = ''
  age = 0

  def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
    """初始化
    """
    self.name = name
    self.age = age

  def say_hello(self) -> str:
    """返回打招呼信息
    """
    return f"Hello My name is {self.name} ."

运行测试用例这下可以通过了。

python3 -m doctest main.py -v
Trying:
  Person() #doctest: +ELLIPSIS
Expecting:
  <main.Person object at 0x...>
ok
3 items had no tests:
  main
  main.Person.__init__
  main.Person.say_hello
1 items passed all tests:
  1 tests in main.Person
1 tests in 4 items.
1 passed and 0 failed.
Test passed.

其它

如果我们是为模块添加测试用例,那么可以这样做,会方便一些。

#!/usr/bin/evn python3


class Person(object):
  """人类类型
  Parameters:
  ----------
    name: str
    age: int

  Return
  ------

  >>> Person() #doctest: +ELLIPSIS
  <...Person object at 0x...>
  """

  name = ''
  age = 0

  def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
    """初始化
    """
    self.name = name
    self.age = age

  def say_hello(self) -> str:
    """返回打招呼信息
    """
    return f"Hello My name is {self.name} ."


if __name__ == "__main__":
  # 因为在模块在被 import 的时候 __name__ 直接等于 模块名 不等于 “__main__” ,所以在作为模块被导入时并不会执行测试用例
  # 如果想执行测试用例直接执行模块就行
  import doctest
  doctest.testmod()

以上就是Python ellipsis 的用法详解的详细内容,更多关于Python ellipsis的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
Python中fnmatch模块的使用详情
Nov 30 Python
Python闭包思想与用法浅析
Dec 27 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
原生python实现knn分类算法
Oct 24 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
python实现梯度下降法
Mar 24 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
python必学知识之文件操作(建议收藏)
May 30 Python
深入解析NumPy中的Broadcasting广播机制
May 30 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 #Python
Python paramiko使用方法代码汇总
Nov 20 #Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 #Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 #Python
python爬取天气数据的实例详解
Nov 20 #Python
python爬取招聘要求等信息实例
Nov 20 #Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 #Python
You might like
phpmyadmin操作流程
2006/10/09 PHP
PHP Array交叉表实现代码
2010/08/05 PHP
解析PHP的session过期设置
2013/06/29 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
如何测量vue应用运行时的性能
2019/06/21 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
哈弗商学院毕业生求职信
2014/02/26 职场文书
导游词之无锡古运河
2019/11/14 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
python lambda 表达式形式分析
2022/04/03 Python
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers