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实现list由于numpy array的转换
Apr 04 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
Python 串口读写的实现方法
Jun 12 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
python向字符串中添加元素的实例方法
Jun 28 Python
python实现PID算法及测试的例子
Aug 08 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python实现超市管理系统(后台管理)
Oct 25 Python
详解python中各种文件打开模式
Jan 19 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 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
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
详解angular element()方法使用
2017/04/08 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
竞选村长演讲稿
2014/04/28 职场文书
公益广告标语
2014/06/19 职场文书
就业协议书
2014/09/12 职场文书
停车位租赁协议书
2014/09/24 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
导游欢迎词范文
2015/01/23 职场文书
MySQL锁机制
2021/04/05 MySQL
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
vue封装数字翻牌器
2022/04/20 Vue.js