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爬虫
Dec 25 Python
Python 26进制计算实现方法
May 28 Python
python协程用法实例分析
Jun 04 Python
python实现简单ftp客户端的方法
Jun 28 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
python urllib爬虫模块使用解析
Sep 05 Python
Python如何优雅获取本机IP方法
Nov 10 Python
python 类之间的参数传递方式
Dec 20 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 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动态生成版权所有信息的方法
2015/03/24 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
学习python处理python编码问题
2011/03/13 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
Python实现的knn算法示例
2018/06/14 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python交易记录链的实现过程详解
2019/07/03 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
计算机专业应届毕业生自荐信
2013/09/26 职场文书
个人找工作的自我评价
2013/10/17 职场文书
爽歪歪广告词
2014/03/20 职场文书
管理建议书范文
2014/05/13 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
教师个人年度总结
2015/02/11 职场文书