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 相关文章推荐
Windows下安装python2和python3多版本教程
Mar 30 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
django输出html内容的实例
May 27 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
Python 移动光标位置的方法
Jan 20 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
超简单使用Python换脸实例
Mar 27 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 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
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
使用php计算排列组合的方法
2013/11/13 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
删除重复数据的算法
2006/11/23 Javascript
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
python实现将元祖转换成数组的方法
2015/05/04 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
Python 实现微信防撤回功能
2019/04/29 Python
python实现图片插入文字
2019/11/26 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
大学专科生推荐信范文
2013/11/23 职场文书
会计应聘求职信范文
2013/12/17 职场文书
中国梦的演讲稿
2014/01/08 职场文书
大学生职业规划书的范本
2014/02/18 职场文书
任命书范本大全
2014/06/06 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL