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字典键值对的添加和遍历方法
Sep 11 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
python实现图片压缩代码实例
Aug 12 Python
pytorch 自定义参数不更新方式
Jan 06 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
520使用Python实现“我爱你”表白
May 20 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
python使用列表的最佳方案
Aug 12 Python
通过代码简单了解django model序列化作用
Nov 12 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之PHP语法学习笔记1
2006/12/17 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
python使用递归解决全排列数字示例
2014/02/11 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
Python异常处理例题整理
2019/07/07 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python的链表基础知识点
2020/09/13 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
个人自我鉴定怎么写
2013/10/28 职场文书
英文升职感谢信
2015/01/23 职场文书
政府会议通知范文
2015/04/15 职场文书
航班延误投诉信
2015/07/02 职场文书
超市员工管理制度
2015/08/06 职场文书
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers