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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
基于Python os模块常用命令介绍
Nov 03 Python
python爬虫爬取网页表格数据
Mar 07 Python
python实现堆和索引堆的代码示例
Mar 19 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
Python 实现进度条的六种方式
Jan 06 Python
用Python将库打包发布到pypi
Apr 13 Python
python自动化测试通过日志3分钟定位bug
Nov 20 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编程中八种常见的文件操作方式
2006/11/19 PHP
smarty中post用法实例
2014/11/28 PHP
10个简化PHP开发的工具
2014/12/25 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
flexigrid 参数说明
2010/11/23 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
Python函数中的函数(闭包)用法实例
2016/03/15 Python
python ubplot使用方法解析
2020/01/10 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
鲜花方阵解说词
2014/02/13 职场文书
精彩的广告词
2014/03/19 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
JavaScript中isPrototypeOf函数
2021/11/07 Javascript