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中使用SQLite的简单教程
Apr 29 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
将python文件打包成EXE应用程序的方法
May 22 Python
python简单区块链模拟详解
Jul 03 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
python如何实现递归转非递归
Feb 25 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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中使用Oracle数据库(2)
2006/10/09 PHP
PHP中函数内引用全局变量的方法
2008/10/20 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
php记录日志的实现代码
2011/08/08 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
javascript实用小函数使用介绍
2013/11/11 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
详解Python的循环结构知识点
2019/05/20 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
会计电算化专业自荐信
2014/03/15 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
心理健康活动总结
2014/04/30 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
党员理论学习心得体会
2016/01/21 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python